1.PDO預處理Prepare
預處理陳述句Prepare是PDO提供的一種DB操作方式,
Prepare陳述句允許用戶在“設定SQL陳述句”與“執行SQL陳述句”之間,進行引數的注入與提取操作,
Prepare方法的語言邏輯與正常的PDO訪問相同,但正常的PDO訪問是直接將引數寫死的,
Prepare方法通過在“設定SQL陳述句”與“執行SQL陳述句”之間,加入“預處理SQL陳述句”和“處理SQL引數”程式,
可以更好的控制引數、靈活查詢以及防止SQL注入等,
相關方法:
⑴ prepare()和execute(),此兩種方法本質是將PDO中的“exec()”方法拆分為兩步
⑵ bindValue(),該方法作用在于將 execute()方法的傳參方式進一步靈活
⑶ bindColumn(),該方法作用在于將預處理后的執行結果決議呈現,
2.prepare()方法和execute()方法
prepare()方法是“預處理SQL陳述句”的方法,能夠讓PDO預先處理“半成品”的SQL陳述句,
并生成一個“PDOStatementObject”(PDOSO)型別的結果,
execute()方法是提供給 PDOSO 型別物件去執行的“成品”SQL陳述句的方法,
并生成一個“PDOStatementObject”型別的結果,
說明:
⑴ 需要PDO通過prepare()預處理的“半成品”SQL陳述句中,使用“?”問號作為占位符,
表示待傳參的引數;
⑵ prepare()方法必須且只能處理“半成品”的SQL陳述句,如果是完整的SQL陳述句則使用“exec()”方法執行;
⑶ execute()方法允許一個陣列作為引數,并將引數帶入到預處理的SQL陳述句中,
而且會將結果存放到 PDOSO 型別物件中;
⑷ PDOSO物件在預處理的不同階段有著不同的含義!!!不能混淆,必須根據背景關系進行判斷,
語法:
$sql = "insert into nameList values(?,?,?,?)";
$pdoso = $pdo -> prepare($sql);
echo $pdoso -> execute(array('Marc','boy',25,'111111'));
3.bindValue()方法
bindValue()方法是提供給PDO預處理之后得到的 PDOSO 物件使用的方法,
用于給“半成品”的SQL陳述句傳值,
語法:$pdoso -> bindValue(index,value);
說明:
⑴ 第一個引數 index 表示給SQL陳述句中的第幾個引數傳值,第一個為“1”,依次類推;
⑵ 第二個引數 value 表示給SQL陳述句中對應引數的具體賦值;
⑶ bindValue一次只能系結一個引數進行傳值,如有多個則需要執行多次,
代碼示例:
<?php
// echo '<pre>';
require_once "20210111singleton.php";
$pdo1 -> exec('set names utf8'); //輔助設定
$sql = "update nameList set sex=?,age=? where name='Wendy'";
$pdoso = $pdo1->prepare($sql);
// 在 prepare()方法和 execute()方法之間使用 bindValue對SQL中的“?”賦值,
$pdoso -> bindValue(1,'girl');
$pdoso -> bindValue(2,21);
// execute()方法可以沒有引數,表示直接執行PDOSO物件所代表的的SQL陳述句,
$pdoso->execute();
?>
4.bindColumn()方法
bindColumn()方法允許將執行結果的一列資料系結到一個指定的物件上,
本方法需要在“execute()”執行結束后再執行,
語法:$pdoso -> bindColumn(index,$變數名);
說明:
⑴ 第一個引數“index”表示結果中的第幾列資料,第一列為“1”,依次類推;
⑵ 第二個引數表示將獲取的資料賦值給哪個變數;
⑶ 該方法一次只能系結一列資料給指定的一個變數,如果系結多列資料,則需執行多次,
代碼示例:
<?php
echo '<pre>';
require_once "20210111singleton.php";
$pdo1 -> exec('set names utf8'); //輔助設定
$sql = "select * from nameList where 1";
$pdoso = $pdo1->prepare($sql);
$pdoso->execute();
//將執行結果系結到指定的變數
$pdoso -> bindColumn(1,$uName);
$pdoso -> bindColumn(2,$uSex);
$res1 = [];
// 將執行結果決議并輸出
while($row=$pdoso->fetch(PDO::FETCH_COLUMN)){
$res1["$uName"]=$uSex;
}
print_r ($res1);
// 或通過 for 回圈決議
$res2 = [];
for($j=0;$row=$pdoso->fetch(PDO::FETCH_COLUMN);$j++){
$res2[$j]=array('name'=>$uName,'sex'=>$uSex);
}
print_r($res2);
?>
5.PDO事務處理
事件:一條執行陳述句就是一個事件,如prepare預處理時執行的execute陳述句,
事務:多個事件組成的結構,主要特點:多個事件同時執行、發生例外后回滾至執行前狀態,
注意:
⑴ 整個事務操作必須放到“try...catch”中,這是因為我們并不能保證執行的事件一定成功,
而對于整個事務而言,任何一個事件的失敗都會導致“catch”的觸發,
而 catch 的觸發就意味著需要將之前做出的所有操作都必須還原,
回滾操作:$pdo -> rollBack();
⑵ 操作陳述句必須在事務開啟之后執行,在事務提交之前停止,
開啟事務:$pdo -> beginTransaction();
關閉事務:$pdo -> commit();
⑶ 中文處理方案(避免亂碼),
讀取:$pdo -> query("set names utf8");
插入:$pdo -> exec("set names utf8");
代碼示例:
資料庫連接代碼:
<?php
class singletonPDO{
private static $pdo = null; //使用私有靜態變數宣告單例物件
public static function getPdo(){
if(self::$pdo==null){
try{
self::$pdo = new PDO("mysql:host=localhost;dbname=dbTest","root","");
self::$pdo -> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}catch(PDOException $err){
echo "資料庫連接失敗,錯誤資訊:".$err->getMessage();
}
}
return self::$pdo;
}
}
$pdo1 = singletonPDO::getPdo();
// 可以通過“ require''或include'' ”方法,在其他PHP檔案中參考這個模板,
// 為避免重復多次參考,可以使用“ require_once'' ”,
?>
事務處理代碼:
<?php
require_once '20210111singleton.php';
$pdo1->exec('set names utf8');
try{
// 開啟事務,所有事件寫在事務開啟和提交之間
$pdo1->beginTransaction();
$sql="update nameList set age=?,password=? where name=?";
// SQL預處理陳述句
$pdoso=$pdo1->prepare($sql);
$pdoso->execute([23,'123456','Wendy']);
$pdoso->execute([25,'123456','Lucy']);
// 提交事務
$pdo1->commit();
echo '事務提交成功!資料庫已執行更新,';
}catch(PDOException $err){
// 設定事務回滾
$pdo1->rollBack();
echo '事務提交失敗!程式已回滾至初始狀態,';
}
?>
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/248400.html
標籤:PHP
