1.PDO預處理Preparephp
預處理語句Prepare是PDO提供的一種DB操做方式。mysql
Prepare語句容許用戶在「設置SQL語句」與「執行SQL語句」之間,進行參數的注入與提取操做。sql
Prepare方法的語言邏輯與正常的PDO訪問相同,但正常的PDO訪問是直接將參數寫死的。數據庫
Prepare方法經過在「設置SQL語句」與「執行SQL語句」之間,加入「預處理SQL語句」和「處理SQL參數」程序,數組
能夠更好的控制參數、靈活查詢以及防止SQL注入等。fetch
相關方法:ui
⑴ prepare()和execute(),此兩種方法本質是將PDO中的「exec()」方法拆分爲兩步spa
⑵ bindValue(),該方法做用在於將 execute()方法的傳參方式進一步靈活對象
⑶ bindColumn(),該方法做用在於將預處理後的執行結果解析呈現。blog
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 '事務提交失敗!程序已回滾至初始狀態。'; } ?>