WEB前端第五十八課——PDO預處理、PDO事務處理

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 '事務提交失敗!程序已回滾至初始狀態。';
    }
?>
相關文章
相關標籤/搜索