PDO基礎知識

1、什麼是PDO?php

  PHP DATA OBJECTmysql

  PHP數據庫抽象層sql

  位於PHP與數據庫中間的一個橋樑數據庫

2、爲何要使用PDO?數組

  方便數據庫的遷移安全

  方便數據庫的升級框架

  減小學習成本學習

  使程序更加安全fetch

  防止sql注入spa

  提升代碼效率

3、什麼時候採用PDO?

  絕大多數操做數據庫的項目都使用PDO

4、PDO的安裝

  1)類庫文件須要存在

    php根目錄下的ext文件夾中:php_pdo.dll、php_pdo_mysql.dll

  2)在php的配置文件php.ini中須開啓

    extension=php_pdo.dll

    extension=php_pdo_mysql.dll

5、如何使用PDO?

  1)PDO核心類

    ①鏈接數據庫

      new PDO($dsn,$username,$password)

        $dsn:

          1.直接寫入字符串(推薦)

            $dsn="mysql:host=localhost;dbname=test;charset=utf8";

          2.遠程加載文件(不推薦)

            $dsn="uri:file:///d:/dsn.txt";

            $dsn="uri:http://www.baidu.com/dsn.txt";

            dsn.txt文件中的內容爲:

              mysql:host=localhost;dbname=test;charset=utf8

          3.設置php.ini(不推薦)

            在php的配置文件php.ini中找到:[PDO],若沒有找到則在文件最後手動添加:

              [PDO]

              pdo.dsn.mydsn="mysql:host=localhost;dbname=test;charset=utf8";

            在代碼中引入:

              $dsn="mydsn";

    ②判斷錯誤

      使用PDOException異常處理

    ③設置字符集

      $pdo->query("set names utf8");

    ④錯誤模式設置

      1.手動拋出錯誤異常,放在sql語句執行以後

        PDO::errorCode()

        PDO::errorInfo()

      2.設置自動拋出錯誤異常,放在sql語句執行以前

        PDO::setAttribute()

        靜默模式(默認)

          PDO::ATTR_ERRMODE=>PDO::ERRMODE_SILENT

        警告模式

          PDO::ATTR_ERRMODE=>PDO::ERRMODE_WARNING

        異常處理模式(推薦)

          PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION

    ⑤執行sql語句

      1.exec()

        執行增、刪、改語句,成功返回受影響行數,失敗返回false

      2.query()

        執行查詢語句,成功返回PDO預處理對象(可做二維數組處理,直接用foreach遍歷)

      3.lastInsertId()

        返回最近一次插入行的ID或序列值

    ⑥關閉數據庫鏈接

      $pdo=null;unset($pdo);

  2)PDO預處理類

    1.什麼是預處理?

      就是將sql語句的語法提早解析

    2.爲何要使用預處理?

      效率提升,語法只解析一次

      有效防止sql注入

    3.什麼時候採用預處理?

      框架當中基本全是預處理

    4.如何使用預處理?

      ①準備參數,依次爲預處理對象中佔位符對應的字段

      ②建立預處理對象

        $stmt=$pdo->prepare(" ");

      ③綁定參數,標識符從1開始,有幾個參數就依次綁定幾回

        方式一:

          $stmt->bindParam(1,$i);

          $stmt->bindParam(2,$j);

        方式二:

          $stmt->bindValue(1,$i);

          $stmt->bindValue(2,$j);

        方式三:

          可使用數組對應各佔位符的值,在下一步執行對象時將該數組傳入

          $arr=array('第一個佔位符對應的值','第二個佔位符對應的值',...);

          $arr=array('字段名1'=>'以字段名1爲佔位符對應的值','字段名2'=>'以字段名2爲佔位符對應的值',...);

      ④執行對象

        $stmt->execute();

        //$stmt->execute($arr);

      ⑤佔位符

        ?

          在綁定參數時須指定各佔位符對應位置,從1開始

        :字段名稱

          在綁定參數時須指定各對應的字段名稱

      ⑥查詢處理

        $stmt->execute()執行完畢後,解析結果:

          1.$stmt->fetch(PDO::FETCH_ASSOC)

            解析一條,須要循環解析

            while($stmt->fetch(PDO::FETCH_ASSOC){

            }

          2.$stmt->fetchAll(PDO::FETCH_ASSOC)

            解析全部結果,將結果返回到一個二維數組中

          3.$stmt->rowCount()不只能夠獲取增、刪、改的受影響行數,也可獲取查詢的記錄行數

  3)PDO的異常處理類

    PDOException

    PDOException::getCode()  異常號

    PDOException::getMessage()  異常信息

  4)事務處理

    1.什麼是事務處理

      把一整件事情做爲一個總體,做爲一個事務

    2.爲何要使用事務處理

      程序的安全性、完整性

    3.何時使用事務處理

      重要數據

    4.如何使用事務處理

      ①開啓事務

        PDO::beginTransaction()

      ②執行sql語句

        PDO::exec()

      ③執行事務或回滾事務

        PDO::commit()

        PDO::rollBack()

 

try{
    //鏈接數據庫
    $dsn="mysql:host=localhost;dbname=test;charset=utf8";
    $username="autumn";
    $password="ZWQ900815";

    $pdo=new PDO($dsn,$username,$password);

    //設置字符集
    $pdo->query("set names utf8");

    //錯誤模式設置
    //方式一:手動拋出錯誤異常,放在sql語句執行以後
    /*
    $errorInfo=$pdo->errorInfo();
    //發生錯誤時,$errorInfo[1]爲錯誤號和$errorInfo[2]爲錯誤信息
    //無錯誤時,$errorInfo[1]和$errorInfo[2]均爲空
    if(!empty($errorInfo[1])){
        //拋出錯誤異常
        throw new PDOException($errorInfo[2],$errorInfo[1]);
    }
    */
    //方式二:自動拋出錯誤異常,放在sql語句執行以前
    //設置PDO::ATTR_ERRMODE(靜默模式[默認]、警告模式、異常處理模式[推薦])
    $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

    //準備sql語句
    //$sql01="insert into cms_user(username,password) values('admin02','1234')";
    //$sql02="delete from cms_user where id=2";
    //$sql03="update cms_user set username='admin' where id=1";
    //$sql04="select1 * from cms_user";
    //執行sql語句
    //exec  處理增、刪、改語句,返回受影響行數
    //query  處理查詢語句
    //$pdo->exec($sql01);
    //返回最近一次插入行的ID或序列值
    //echo $pdo->lastInsertId();
    //$pdo->exec($sql02);
    //$pdo->exec($sql03);
    /*
    $data=$pdo->query($sql04);
    foreach ($data as $key=>$val) {
        echo $val['id']."\n";
        echo $val['username']."\n";
        echo $val['password']."\n";
    }
    */


    //預處理
    //方式一
    /*
    //1.準備參數,依次爲下面要處理的sql語句中?佔位符對應的字段值
    $id=1;
    $username='autumn';
    //2.建立預處理對象
    $stmt=$pdo->prepare("delete from cms_user where id=? and username=?");
    //3.綁定參數,$id、$username爲引用傳參,參數賦值可在前可在後
    //綁定參數標識符從1開始,有幾個參數變量,就依次綁定幾回
    $stmt->bindParam(1,$id);
    $stmt->bindParam(2,$username);
    //綁定值,變量值的賦值只能在前,不能在後,做用等同於bindParam()
    //$stmt->bindValue(1,$id);
    //$stmt->bindValue(2,$username);
    //4.執行對象
    $stmt->execute();
    */
    //方式二
    /*
    $id=1;
    $username='autumn';
    $stmt=$pdo->prepare("delete from cms_user where id=:id and username=:username");
    $stmt->bindParam(":id",$id);
    $stmt->bindParam(":username",$username);
    $stmt->execute();
    */
    //方式三(推薦)
    //若使用「?」做爲佔位符
    //$stmt=$pdo->prepare("delete from cms_user where id=? and username=?");
    //$arr=array(1,'autumn');
    //若使用「:字段名稱」做爲佔位符
    /*
    $stmt=$pdo->prepare("delete from cms_user where id=:id and username=:username");
    $arr=array("id"=>1,"username"=>"autumn");
    $stmt->execute($arr);
    echo $stmt->rowCount();  //受影響行數
    */
    $stmt=$pdo->prepare("select * from cms_user where id>:id");
    $arr=array("id"=>3);
    $stmt->execute($arr);
    $data=$stmt->fetchAll(PDO::FETCH_ASSOC);
    echo $stmt->rowCount();  //也可獲取查詢的記錄行數
    echo "<pre>";
    var_dump($data);
    echo "</pre>";


    //執行事務處理
    /*
    //1.開啓事務
    $pdo->beginTransaction();
    //2.執行sql語句
    $aff01=$pdo->exec("update cms_user set username='admin01' where id=1");
    //sql語句自己有錯誤而沒法執行時會自動拋出錯誤異常,而當sql語句可執行後受影響行數爲0時,須要手動拋出異常
    if($aff01==0){
        throw new PDOException("受影響行數爲0!");
    }
    $aff02=$pdo->exec("insert into cms_user(username,password) values('admin02','0000')");
    if($aff02==0){
        throw new PDOException("受影響行數爲0!");
    }
    //3.執行事務
    $pdo->commit();
    */


    //關閉數據庫鏈接
    $pdo=null;


}catch(PDOException $e){
    //4.回滾事務
    //$pdo->rollBack();

    //異常處理
    //$e->getCode();//異常號
    //$e->getMessage();//異常信息
    echo "(".$e->getCode().")".$e->getMessage();
}
相關文章
相關標籤/搜索