PHP PDO操做MYSQL

PHP PDO操做MYSQLphp

學習要點:html

一、         PHP PDO配置mysql

二、         鏈接mysql及異常處理web

三、         query,exec用法詳解sql

四、         預處理prepare()用法詳解數據庫

五、         PDO錯誤處理模式和事務處理編程

六、         獲取和遍歷結果集數組

七、         經常使用函數說明安全

 

個人博客:服務器

 

1、       PDO配置

PHP 數據對象 (PDO) 擴展能夠支持絕大多數的主流的數據庫,以下

  1. Cubrid
  2. FreeTDS / Microsoft SQL Server / Sybase
  3. Firebird/Interbase 6
  4. IBM DB2
  5. IBM Informix Dynamic Server
  6. MySQL 3.x/4.x/5.x
  7. Oracle Call Interface
  8. ODBC v3 (IBM DB2, unixODBC and win32 ODBC)
  9. PostgreSQL
  10. SQLite 3 及 SQLite 2
  11. Microsoft SQL Server / SQL Azure
  12. 4D

它爲多種數據庫的查詢和獲取數據,提供了一個統一的接口(數據抽象層),能夠用相同的函數(方法)去實現編程要求,而且不會爲數據庫的遷移重寫。

PDO隨PHP5.1發行,在PHP5.0的PECL擴展中也可使用,沒法運行於以前的PHP版本。

你能夠經過 PHP 的 phpinfo() 函數來查看是否安裝了PDO擴展。

Unix或Linux用戶添加如下擴展:extension=pdo.so

Windows 用戶

PDO 和全部主要的驅動做爲共享擴展隨 PHP 一塊兒發佈,要激活它們只需簡單地編輯 php.ini 文件,並添加如下擴展:

extension=php_pdo.dll

這一步在 PHP 5.3及更高版本中可省略,對於 PDO 再也不須要作爲一個 DLL 文件。

除此以外還有如下對應的各類數據庫擴展:

 

;extension=php_pdo_firebird.dll

;extension=php_pdo_informix.dll

;extension=php_pdo_mssql.dll

;extension=php_pdo_mysql.dll

;extension=php_pdo_oci.dll

;extension=php_pdo_oci8.dll

;extension=php_pdo_odbc.dll

;extension=php_pdo_pgsql.dll

;extension=php_pdo_sqlite.dll

若是須要啓動那個數據庫的模塊,只須要去除前面的「;」。

例如須要用PDO操做MYSQL,那麼只要將php.ini文件中的語句中的

;extension=php_pdo_mysql.dll

改爲

extension=php_pdo_mysql.dll

保存後重啓PHP 或 Web服務器,而後運行一下PHP 的 phpinfo() 函數來查看是否成功安裝了PDO擴展

 

2、       鏈接mysql及異常處理

測試數據:

建立一個班級數據庫school,裏面包含一張班級表grade,包含編號(id)、姓名(name)、郵件(email)、評分(point)、註冊日期(regdate).

mysql執行代碼以下:

mysql>CREATE DATABASE school;

mysql> CREATE TABLE grade (

-> id TINYINT(2) UNSIGNED NOT NULL AUTO_INCREMENT,

-> name VARCHAR(20) NOT NULL,

-> email VARCHAR(40),

-> point TINYINT(3) UNSIGNED NOT NULL,

-> regdate DATETIME NOT NULL,

-> PRIMARY KEY (id) -> );

//給這個班級表grade 新增幾條學員記錄

mysql> INSERT INTO grade (name,email,point,regdate) VALUES

('zend','zend@gmail.com',95,NOW());

//依次增長

 

在web目錄下新建config.php,代碼以下 :

<?php

    header('Content-Type:text/html; charset=utf-8');

    define('DB_MS', 'mysql');

    define('DB_HOST', 'localhost');

    define('DB_NAME', 'school');

    define('DB_USER', 'root');

    define('DB_PASS', '');

    $dsn=DB_MS.':host='.DB_HOST.';dbname='.DB_NAME;

   

    try {

       //$DB=new PDO($dsn,DB_USER,DB_PASS, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));

        $DB=new PDO($dsn,DB_USER,DB_PASS);

        $DB->exec('SET NAMES UTF8');

        echo "數據庫鏈接成功!"."<br />";

        ignore_user_abort();

    }catch (PDOException $e){

        exit("數據庫鏈接錯誤提示!:".$e->getMessage()."<br />");

    };

?>

默認不是長鏈接,數據庫長鏈接,須要最後加一個參數:
$DB=new PDO($dsn,DB_USER,DB_PASS,array(PDO::ATTR_PERSISTENT=>true));
長鏈接的做用我以爲是在高負載的狀況下,經過複用長鏈接,減小了每一個頁面的創建數據庫鏈接的時間, 可以加快網站響應速度,提升用戶體驗。

 

3、       query,exec用法詳解

 

PDO::query():執行 SQL 語句,返回PDOStatement對象(結果集).

缺點:屢次使用報non-object錯誤(待實例證實).

優勢:能夠直接遍歷對象.主要用於SELECT操做。

代碼以下:

    Web目錄下新建demo.php文件

 

<?php

    header('Content-Type:text/html; charset=utf-8');

    require 'config.php';

    $query="SELECT id,name,email,point,regdate FROM grade";

    $DB->exec('SET NAMES UTF8');

    $rs=$DB->query($query);

    foreach ($rs as $row){

    echo $row['id']."---".$row['name']."---".$row['email']."---".$row['point']."---".$row['regdate'];

echo "<br />";

ignore_user_abort();

    };

?>

        

有關文檔提出query執行後,query()用於執行一次SELECT語句,執行後應當隨即便用PDOStatement::fetch()或其它獲取方法語句將結果取出,不然當即進行下一次的PDO::query()將會報non-object錯誤。

除非咱們調用 PDOStatement::closeCursor()來釋放數據庫資源與PDOStatement對象。

 

但是本人在本地測試的時候,沒有使用closeCursor()或者null(),未發生屢次使用query查詢的異常,測試代碼以下:

<?php

    header('Content-Type:text/html; charset=utf-8');

    require 'config.php';

    $query="SELECT id,name,email,point,regdate FROM grade";

    $rs=$DB->query($query);//不獲取結果集

//     while ($row=$rs->fetch(PDO::FETCH_ASSOC)){

//         var_dump($row);

//         echo "<br />";

//     };

//     $rs=null;//貌似這裏要寫null,但是不寫好像也不要緊,糾結中。

//     $rs->closeCursor();//或用關閉遊標,一樣不寫也沒事。

    echo "start using agin";//開始再次查詢

    $query="SELECT name,point FROM grade";

    $rs2=$DB->query($query);

    while ($row2=$rs2->fetch(PDO::FETCH_NUM)){

        var_dump($row2);

        echo "<br />";

    };

    echo "end";//查詢結束沒有問題

?>

那麼這樣作的目的是什麼呢?我的認爲是防止錯誤和釋放服務器內存,請朋友舉證。

 

PDO::exec執行一條 SQL 語句,並返回受影響的行數。

缺點:不適用SELECT操做,由於不能返回結果集,沒法遍歷,只能按照官方建議去使用query或prepare函數。

優勢:支持SELECT/DELETE/UPDATE/INSERT等所有SQL語句執行

代碼以下:

Web目錄下新建demo.php文件

<?php

    header('Content-Type:text/html; charset=utf-8');

    require 'config.php';

    $query="SELECT id,name,email,point,regdate FROM grade";

    $rs=$DB->query($query);

    foreach ($rs as $row){

    echo $row['id']."---".$row['name']."---".$row['email']."---".$row['point']."---".$row['regdate'];

    echo "<br />";

    };

    echo "<br />start";

    $exec="INSERT INTO grade (name,email,point,regdate) VALUE ('愛莉斯','alice@unitbuy.com','90',NOW())";

    $rs=$DB->exec($exec);

    var_dump($rs);//返回值

    echo "<br />end";

    $DB=null;//釋放內存

?>

 

 

 

4、       預處理prepare() 用法詳解

比較query和exec,預處理操做更方便,快捷,安全。

方便:預處理一次,以不一樣參數可執行N次。

快捷:避免重複編譯執行,佔服務器內存少,響應快。

安全:預處理的參數自動轉義,相對安全防止SQL注入。

 

1、簡單的預處理,代碼以下:

<?php

    header('Content-Type:text/html; charset=utf-8');

    require 'config.php';

    $sql="DELETE FROM grade WHERE name='愛莉斯'";

    $delete=$DB->prepare($sql);//預處理

    $delete->execute();//執行

    $count=$delete->rowCount();//返回處理過多少行數

      echo $count;

    ?>

       PS: PDOStatement::rowCount() 返回受 DELETE、INSERT、 或 UPDATE 語句影響的行數。

2、佔位符的使用:分別是問號參數、命名參數.

Ps:綁定參數

   PDOStatement::bindParam — 綁定一個參數到指定的變量名.

   PDOStatement::bindValue — 把一個值綁定到一個參數.

  

   傳統方式插入數據,代碼以下;

 

   <?php

    header('Content-Type:text/html; charset=utf-8');

    require 'config.php';

    $sql="INSERT INTO grade (id,name,email,point,regdate) VALUE (null,'愛莉斯','alice@gmail.com','95',NOW())";

    $insert=$DB->prepare($sql);

    $insert->execute();

    echo $insert->rowCount();

$sql=null;

    ?>

 

    問號參數綁定方式代碼以下:

         <?php

    header('Content-Type:text/html; charset=utf-8');

    require 'config.php';

    $sql="INSERT INTO grade (id,name,email,point,regdate) VALUE (?,?,?,?,?)";

    $insert=$DB->prepare($sql);

    $time=date('Y-m-d H:i:s',time()+(8*60*60));

 

   

    //第一種綁定方式

   /*  $insert->bindValue(1,null);

    $insert->bindValue(2, '愛莉斯');

    $insert->bindValue(3,  'alice@gmail.com');

    $insert->bindValue(4, '98');

    $insert->bindValue(5, $time); */

    //第二種綁定方式

    /* $insert->bindParam(1, $id);

    $insert->bindParam(2, $name);

    $insert->bindParam(3, $email);

    $insert->bindParam(4, $point);

    $insert->bindParam(5, $regdate);

    $id=null;

    $name="蘇菲";

    $email='sophie@gmail.com';

    $point='98';

    $regdate=$time; */

    //第三種綁定方式

    /* $insert->execute(array(null,'凱撒','caesar@gmail.com','90',$time)); */

    $insert->execute(array(null,'凱撒','caesar@gmail.com','90',$time));

    $count=$insert->rowCount();

    echo "<br />查詢執行完畢!改變的行數爲:".$count;

$sql=null;

?>

      

       命名參數綁定方式代碼以下:

<?php

        header('Content-Type:text/html; charset=utf-8');

        require 'config.php';

 

        $sql="INSERT INTO grade (id,name,email,point,regdate) VALUE (:id, :name, :email, :point, :regdate)";

        $insert=$DB->prepare($sql);

        $time=date('Y-m-d H:i:s',time()+(8*60*60));

       

        //第一種綁定方式

        /* $insert->bindValue("id", null);

        $insert->bindValue("name", 'caesar');

        $insert->bindValue("email", 'caesar@gmail.com');

        $insert->bindValue("point", 60);

        $insert->bindValue("regdate", $time); */

       

        //第二種綁定方式

        /* $insert->bindParam("id", $id);

        $insert->bindParam("name", $name);

        $insert->bindParam("email", $email);

        $insert->bindParam("point", $point);

        $insert->bindParam("regdate", $regdate);

        $id=null;

        $name="凱撒";

        $email="caesar@e.com";

        $point=65;

        $regdate=$time; */

       

        //第三種綁定方式

        $insert->execute(array('id'=>null,'name'=>'alice','email'=>'alice@e.com','point'=>90,'regdate'=>$time));

        $count=$insert->rowCount();

        echo "<br />查詢執行完畢!改變的行數爲:".$count;

        $sql=null;

?>

 

預處理批量查詢,分別採用2種佔位符,代碼以下:

<?php

        header('Content-Type:text/html; charset=utf-8');

        require 'config.php';

        $DB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        try {

        $sql="INSERT INTO grade (id,name,email,point,regdate) VALUE (:id, :name, :email, :point, :regdate)";

        $rs=$DB->prepare($sql);

        $time=date('Y-m-d H:i:s',time()+(8*60*60));

       

        $rs->bindParam('id', $id);

        $rs->bindParam('name', $name);

        $rs->bindParam('email', $email);

        $rs->bindParam('point', $point);

        $rs->bindParam('regdate', $regdate);

       

        $id=null;

        $name='愛莉絲';

        $email='alice@e.com';

        $point=81;

        $regdate=$time;

        $rs->execute();

       

        $id=null;

        $name='愛莉絲2';

        $email='alice2@e.com';

        $point=82;

        $regdate=$time;

        $rs->execute();

       

        $sql="INSERT INTO grade (id,name,email,point,regdate) VALUE (?,?,?,?,?)";

        $rs=$DB->prepare($sql);

       

        $rs->bindParam(1, $id);

        $rs->bindParam(2, $name);

        $rs->bindParam(3, $email);

        $rs->bindParam(4, $point);

        $rs->bindParam(5, $regdate);

       

        $id=null;

        $name='alice1';

        $email='alice@ee.com';

        $point=83;

        $regdate=$time;

        $rs->execute();

       

        $id=null;

        $name='alice2';

        $email='alice@eee.com';

        $point=84;

        $regdate=$time;

        $rs->execute();

      

        echo "ok";

        } catch (PDOException $e){

            exit($e->getMessage()."<br />");

        };

    ?>

      

5、       PDO錯誤處理模式和事務處理

PDO的異常處理

先設置錯誤處理模式

1、PDO::ERRMODE_SILENT 錯誤代碼(默認)不主動報錯,要用$DB->errorInfo()形式獲取錯誤信息。

2、PDO::ERRMODE_WARNING 主動提示傳統錯誤信息E_WARNING.

3、PDO::ERRMODE_EXCEPTION 主動拋出PDOException異常,至關於PDO:: PDO::errorCode()  或 PDO::errorInfo(),結合try{}catch(){}輸出錯誤,而且事務處理自動回滾。

也能夠在構造函數config.php文件中先設置以下:

       $DB=new PDO($dsn,DB_USER,DB_PASS, array(PDO::ATTR_ERRMODE =>                             PDO::ERRMODE_WARNING));

 

 

PS:

  PDO::errorCode() 錯誤代碼,返回一個數字。

  PDO::errorInfo() 錯誤信息提示,返回一個數組

    try{}catch(){}方法說明:

程序嘗試執行try中的語句,若是正確則徹底執行,若錯誤程序在try中當即中止,並進入catch部分執行其中代碼,且自動生成一個異常對象$e(自定義)。

例如:

<?php

    header('Content-Type:text/html; charset=utf-8');

    require 'config.php';

//預先設置PDO錯誤模式,

    $DB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

   

    //PDO異常模式採用try{}catch(){}處理

    try {

        //查找數據庫中一個並不存在的信息sex='male';

        $sql="SELECT * FROM grade WHERE sex='male'";

        $rs=$DB->prepare($sql);

        $rs->execute();

        while ($row=$rs->fetch(PDO::FETCH_ASSOC)){

            var_dump($row);

            echo "<br />";

        };

} catch (PDOException $e){

//自定義異常對象$e

        exit($e->getMessage()."<br />");

    };

    ?>

      

       常規的錯誤處理,代碼以下:

<?php

    header('Content-Type:text/html; charset=utf-8');

    require 'config.php';

    //查找數據庫中一個並不存在的信息sex='male';

    $sql="SELECT * FROM grade WHERE sex='male'";

    //rs=$DB->query($sql);

    $result=$DB->prepare($sql);

    $rs=$result->execute();

  

    if ($rs===false){

        //$err=$rs->errorInfo();

        $err=$result->errorInfo();

        echo "錯誤信息:".$err[2];

    }else {

       

        while ($row=$rs->fetch(PDO::FETCH_ASSOC)){

            var_dump($row);

            echo "<br />";

        };

    };

?>

 

PDO的事務處理機制

事務支持四大特性(ACID):

•     原子性(Atomicity)

•     一致性(Consistency)

•     隔離性(Isolation)

•     持久性(Durability)

如下手冊中的文字說明:

通俗地講,在一個事務中執行的任何操做,即便是分階段執行的,也能保證安全地應用於數據庫,並在提交時不會受到來自其餘鏈接的干擾。

事務操做也能夠根據請求自動撤銷(假設尚未提交),這使得在腳本中處理錯誤更加容易。

事務一般是經過把一批更改"積蓄"起來而後使之同時生效而實現的;這樣作的好處是能夠大大地提供這些更改的效率。

換句話說,事務可使腳本更快,並且可能更健壯(不過須要正確地使用事務才能得到這樣的好處)。

不幸的是,並不是每種數據庫都支持事務,所以當第一次打開鏈接時,PDO 須要在所謂的"自動提交"模式下運行。

自動提交模式意味着,若是數據庫支持,運行的每一個查詢都有它本身的隱式事務,若是數據庫不支持事務,則沒有。

若是須要一個事務,則必須用 PDO::beginTransaction() 方法來啓動。若是底層驅動不支持事務,則拋出一個 PDOException 異常(無論錯誤處理設置是怎樣的,這都是一個嚴重的錯誤狀態)。

一旦開始了事務,可用 PDO::commit() 或 PDO::rollBack()來完成,這取決於事務中的代碼是否運行成功。

PS: beginTransaction() 啓動一個事務

    commit() 提交一個事務

    rollBack()回滾一個事務

舉例說明:在學員表grade中查找有沒有」麗莎」這個名字,而後在她的成績中加10分.

<?php

    header('Content-Type:text/html; charset=utf-8');

    require 'config.php';

    //錯誤處理模式

    $DB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    //事務處理

    try {

    //關閉自動提交

    $DB->setAttribute(PDO::ATTR_AUTOCOMMIT, 0);

   

    //開啓事務

    $DB->beginTransaction();

   

    $sql="SELECT point FROM grade WHERE name = :name";

    $rs=$DB->prepare($sql);

    $name='麗莎';

    $rs->bindParam("name", $name);

    $rs->execute();

   

    $row=$rs->fetch(PDO::FETCH_NUM);

    if (!$row){

        throw new PDOException('沒有'.$name.'這我的');

    }else {

        echo "信息提示:這位".$name."同窗已經加分了";

    };

    $point=$row[0]+10;

 

    $add="UPDATE grade SET point=$point WHERE name= :name";

    $rs2=$DB->prepare($add);

    $rs2->bindParam('name', $name);

    $rs2->execute();

    $count=$rs2->rowCount();

    echo "<br />".$count;

   

    //提交

    $DB->commit();

} catch (PDOException $err){

    //回滾,不設置也會自動回滾

    //$DB->rollBack();

        exit("錯誤信息:".$err->getMessage());

    };

?>

PDO的事務處理,並不侷限於在事務中更改,也能夠發出複雜的查詢來提取數據,還可使用那些信息來構建更多的更改和查詢;當事務激活時,能夠保證其餘人在操做進行當中沒法做出更改。

6、       獲取和遍歷結果集

PDO獲取結果集主要有:

PDOStatement::fetch — 從結果集中獲取下一行

PDOStatement::fetchAll — 返回一個包含結果集中全部行的數組

PDOStatement::fetchColumn — 從結果集中的下一行返回單獨的一列。

PDOStatement::fetchObject — 獲取下一行並做爲一個對象返回。下一行並做爲一個對象返回。

 

fetch()的用法,參數有以下幾種.

PDO::FETCH_ASSOC:返回一個索引爲結果集列名的數組.

PDO::FETCH_BOTH(默認):返回一個索引爲結果集列名和以0開始的列號的數組.

PDO::FETCH_NUM:返回一個索引爲以0開始的結果集列號的數組.

PDO::FETCH_LAZY:結合使用 PDO::FETCH_BOTH 和 PDO::FETCH_OBJ,建立供用來訪問的對象變量名

PDO::FETCH_OBJ:返回一個屬性名對應結果集列名的匿名對象

舉例說明,以不一樣的方式獲取行,代碼以下:

<?php

    header('Content-Type:text/html; charset=utf-8');

    require 'config.php';

    $DB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    try {

    $DB->setAttribute(PDO::ATTR_AUTOCOMMIT, 0);

   

    $DB->beginTransaction();

    $sql="SELECT point FROM grade WHERE name = :name";

    $rs=$DB->prepare($sql);

    $rs->bindParam('name', $name);

    $name='露西';

    $rs->execute();

    $row=$rs->fetch(PDO::FETCH_ASSOC);

    echo "FETCH_ASSOC:---";

    print_r($row);

    echo "<br />";

   

    $name='麗莎';

    $rs->execute();

    $row=$rs->fetch(PDO::FETCH_BOTH);

    echo "FETCH_BOTH:---";

    print_r($row);

    echo "<br />";

   

    //數據庫中的保存的字段有空格會致使查詢失敗

    $name='傑克';

    $rs->execute();

    $row=$rs->fetch(PDO::FETCH_NUM);

    echo "FETCH_NUM:---";

    print_r($row);

    echo "<br />";

   

    $name='麗莎';

    $rs->execute();

    $row=$rs->fetch(PDO::FETCH_LAZY);

    echo "FETCH_LAZY:---";

    print_r($row);

    echo "<br />";

   

    $name='麗莎';

    $rs->execute();

    $row=$rs->fetch(PDO::FETCH_OBJ);

    echo "FETCH_OBJ:---";

    print_r($row);

    echo "<br />";

   

    $DB->commit();

    } catch (PDOException $e){

        $DB->rollBack();

        exit("錯誤信息:".$e->getMessage());

    };

?>

其它的函數fetchAll、fetchColumn、fetchObject相似,請查手冊,再也不累贅!

 

遍歷結果集的方法經常使用的是while和foreach,代碼以下

<?php

    header('Content-Type:text/html; charset=utf-8');

    require 'config.php';

    $DB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    try {

        $DB->setAttribute(PDO::ATTR_AUTOCOMMIT, 0);

       

        $DB->beginTransaction();

        $sql="SELECT * FROM grade WHERE name = :name";

        $rs=$DB->prepare($sql);

        $rs->bindParam('name', $name);

        $name='麗莎';

        $rs->execute();

       

        /* while ($row=$rs->fetch(PDO::FETCH_ASSOC)){

            print_r($row);

        }; */

        //或者用foreach

        $rrs=$rs->fetch(PDO::FETCH_ASSOC);

        foreach ($rrs as $key=>$value){

            echo $key."-".$value."<br />";

        };

      

        $DB->commit();

    } catch (PDOException $e){

        $DB->rollBack();

        exit("錯誤信息:".$e->getMessage());

    };

?>

 

獲取結果集的預處理方式

 

預處理SQL後綁定結果方式輸出,代碼以下:

<?php

        header('Content-Type:text/html; charset=utf-8');

        require 'config.php';

        $sql="SELECT id, name, email, point, regdate FROM grade";

        $rs=$DB->prepare($sql);

        $rs->execute();

        // PDOStatement::bindColumn — 綁定一列到一個 PHP 變量

        $rs->bindColumn(1, $id);

        $rs->bindColumn(2, $name);

        $rs->bindColumn(3, $email);

        $rs->bindColumn("point", $point );

        $rs->bindColumn("regdate", $regdate);

 

        //PDOStatement::fetchColumn — 從結果集中的下一行返回單獨的一列

        while ($row=$rs->fetch(PDO::FETCH_COLUMN)){

            //print_r($row);

            echo "{$id}:{$name}:{$email}:{$point}:{$regdate}";

            echo "<br />";

        };

       //或者以下

        /* foreach ($row as $rs){

            echo $row['id'].'---'.$row['name'].'---'.$row['email'].'---'.$row['point'].'---'.$row['regdate'];

            echo "<br />";

        }; */

?>

    預處理SQL後綁定參數輸出結果,例如查詢80分以上的學員信息,代碼以下:

<?php

        header('Content-Type:text/html; charset=utf-8');

        require 'config.php';

        $sql="SELECT * FROM grade WHERE point > :point ";

        $rs=$DB->prepare($sql);

        $point=80;

        $params=array(

            'point'=>$point,

        );

        $rs->execute($params);

//         $row=$rs->fetchAll(PDO::FETCH_ASSOC);

//         print_r($row);

        while($row=$rs->fetch(PDO::FETCH_ASSOC)){

            print_r($row);

            echo "<br />";

        };

?>

       預處理方式獲取數據,防止SQL注入,代碼以下:

<?php

    header('Content-Type:text/html; charset=utf-8');

    require 'config.php';

    $sql="SELECT * FROM grade WHERE name=?";

    $rs=$DB->prepare($sql);

    //$_POST['name']是鍵值對,爲用戶輸入,PDO自動將其用''轉義.

    if (!!$rs->execute(array($_POST['name']))){

        while($row=$rs->fetch()){

            var_dump($row);

        };

};

?>

7、       經常使用函數說明

PS:文中大多數都已用過,少數方法的運用請參考手冊

PDO 類:

PDO::beginTransaction — 啓動一個事務

PDO::commit — 提交一個事務

PDO::__construct — 建立一個表示數據庫鏈接的 PDO 實例

PDO::errorCode — 獲取跟數據庫句柄上一次操做相關的 SQLSTATE

PDO::errorInfo — 返回最後一次操做數據庫的錯誤信息

PDO::exec — 執行一條 SQL 語句,並返回受影響的行數

PDO::getAttribute — 取回一個數據庫鏈接的屬性

PDO::getAvailableDrivers — 返回一個可用驅動的數組

PDO::inTransaction — 檢查是否在一個事務內

PDO::lastInsertId — 返回最後插入行的ID或序列值

PDO::prepare — 備要執行的SQL語句並返回一個 PDOStatement 對象

PDO::query — 執行 SQL 語句,返回PDOStatement對象,能夠理解爲結果集

PDO::quote — 爲SQL語句中的字符串添加引號。

PDO::rollBack — 回滾一個事務

PDO::setAttribute — 設置屬性

 

PDOStatement 類:

PDOStatement::bindColumn — 綁定一列到一個 PHP 變量

PDOStatement::bindParam — 綁定一個參數到指定的變量名

PDOStatement::bindValue — 把一個值綁定到一個參數

PDOStatement::closeCursor — 關閉遊標,使語句能再次被執行。

PDOStatement::columnCount — 返回結果集中的列數

PDOStatement::debugDumpParams — 打印一條 SQL 預處理命令

PDOStatement::errorCode — 獲取跟上一次語句句柄操做相關的 SQLSTATE

PDOStatement::errorInfo — 獲取跟上一次語句句柄操做相關的擴展錯誤信息

PDOStatement::execute — 執行一條預處理語句

PDOStatement::fetch — 從結果集中獲取下一行

PDOStatement::fetchAll — 返回一個包含結果集中全部行的數組

PDOStatement::fetchColumn — 從結果集中的下一行返回單獨的一列。

PDOStatement::fetchObject — 獲取下一行並做爲一個對象返回。

PDOStatement::getAttribute — 檢索一個語句屬性

PDOStatement::getColumnMeta — 返回結果集中一列的元數據

PDOStatement::nextRowset — 在一個多行集語句句柄中推動到下一個行集

PDOStatement::rowCount — 返回受上一個 SQL 語句影響的行數

PDOStatement::setAttribute — 設置一個語句屬性

PDOStatement::setFetchMode — 爲語句設置默認的獲取模式。

相關文章
相關標籤/搜索