PDO預先處理語句PDOStatement對象使用總結

來源:互聯網
上載者:User
PDO預先處理語句PDOStatement對象使用總結

PDO對預先處理語句的支援需要使用PDOStatement類對象,但該類對象並不是通過NEW關鍵字執行個體化出來的,而是通過PDO對象中的prepare()方法,在資料庫伺服器中準備好一個預先處理的SQL語句後直接返回的。如果通過之前執行PDO對象中的query()方法返回的PDOStatement類對象,只代表的是一個結果集對象。而如果通過執行PDO對象中的prepare()方法產生的PDOStatement類對象,則為一個查詢對象,能定義和執行參數化的SQL命令。PDOStatement類中的全部成員方法如下所示:

PDOStatement::bindColumn ― 綁定一列到一個 PHP 變數PDOStatement::bindParam ― 綁定一個參數到指定的變數名PDOStatement::bindValue ― 把一個值綁定到一個參數PDOStatement::closeCursor ― 關閉遊標,使語句能再次被執行。PDOStatement::columnCount ― 返回結果集中的列數PDOStatement::debugDumpParams ― 列印一條 SQL 預先處理命令PDOStatement::errorCode ― 擷取跟上一次語句控制代碼操作相關的 SQLSTATEPDOStatement::errorInfo ― 擷取跟上一次語句控制代碼操作相關的擴充錯誤資訊PDOStatement::execute ― 執行一條預先處理語句PDOStatement::fetch ― 從結果集中擷取下一行PDOStatement::fetchAll ― 返回一個包含結果集中所有行的數組PDOStatement::fetchColumn ― 從結果集中的下一行返回單獨的一列。PDOStatement::fetchObject ― 擷取下一行並作為一個對象返回。PDOStatement::getAttribute ― 檢索一個語句屬性PDOStatement::getColumnMeta ― 返回結果集中一列的中繼資料PDOStatement::nextRowset ― 在一個多行集語句控制代碼中推進到下一個行集PDOStatement::rowCount ― 返回受上一個 SQL 陳述式影響的行數PDOStatement::setAttribute ― 設定一個語句屬性PDOStatement::setFetchMode ― 為語句設定預設的擷取模式。

1、準備語句

重複執行一個SQL查詢,通過每次迭代使用不同的參數,這種情況使用預先處理語句運行效率最高。使用預先處理語句,首先需要在資料庫伺服器中先準備好“一個SQL語句”,但並不需要馬上執行。PDO支援使用“預留位置”文法,將變數綁定到這個預先處理的SQL語句中。對於一個準備好的SQL語句,如果在每次執行時都要改變一些列值,這種情況必須使用“預留位置號”而不是具體的列值。在PDO中有兩種使用預留位置的文法:“具名引數”和“問號參數”,使用哪一種文法要看個人的喜好。

使用具名引數作為預留位置的INSERT插入語句:

$dbh->prepare(“insert into contactinfo(name,address,phone) values(:name,:address,:phone)”);


需要自訂一個字串作為“具名引數”,每個具名引數需要冒號(:)開始,參數的命名一定要有意義,最好和對應的欄位名稱相同。

使用問號(?)參數作為預留位置的INSERT插入語句:

$dbh->prepare(“insert into contactinfo(name,address,phone) values(?,?,?)”);


問號參數一定要和欄位的位置順序對應。不管是使用哪一種參數作為預留位置構成的查詢,或是語句中沒有用到預留位置,都需要使用PDO對象中的prepare()方法,去準備這個將要用於迭代執行的查詢,並返回PDOStatement類對象。
2、綁定參數

當SQL語句通過PDO對象中的prepare()方法在資料庫伺服器端準備好了以後,如果使用了預留位置,就需要在每次執行時替換輸入的參數。可以通過PDOStatement對象中的bindParam()方法,把參數變數綁定到準備好的預留位置上(位置或名字要對應)。方法bindParame()的原型如下所示:

bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )


第一個參數parameter是必選項,如果在準備好的查詢中預留位置文法使用名字參數,那麼將名字參數字串作為bindParam()方法的第一個參數提供。如果預留位置文法使用問號參數,那麼將準備好的查詢中列值預留位置的索引位移量,作為該方法的第一個參數。
第二個參數variable也是可選項,提供供給第一個參數所指定預留位置的值。因為該參數是按引用傳遞的,所以只能提供變數作為參數,不能直接提供數值。

第三個參數data_type是可選項,為當前被綁定的參數設定資料類型。可以為以下值。

PDO::PARAM_BOOL 代表boolean資料類型。

PDO::PARAM_NULL 代表SQL中的NULL類型。

PDO::PARAM_INT 代表SQL中的INTEGER資料類型。

PDO::PARAM_STR 代表SQL中的CHAR、VARCHAR和其他字串資料型別。

PDO::PARAM_LOB 代表SQL中大對象資料類型。
第四個參數length是可選項,用於指定資料類型的長度。

第五個參數driver_options是可選項,通過該參數提供任何資料庫驅動程式特定的選項。

使用具名引數作為預留位置的參數綁定樣本:

<?php//...省略PDO串連資料庫代碼$query = "insert into contactinfo (name,address,phone) values(:name,:address,:phone)";$stmt = $dbh->prepare($query);          //調用PDO對象中的prepare()方法 $stmt->blinparam(':name',$name);        //將變數$name的引用綁定到準備好的查詢名字參數":name"中$stmt->blinparam(':address',$address);$stmt->blinparam(':phone',phone);//...?>

使用問號(。)作為預留位置的參數綁定樣本:

<?php//...省略PDO串連資料庫代碼$query = "insert into contactinfo (name,address,phone) values(?,?,?)";$stmt = $dbh->prepare($query);          //調用PDO對象中的prepare()方法 $stmt->blinparam(1,$name,PDO::PARAM_STR);        //將變數$name的引用綁定到準備好的查詢名字參數":name"中$stmt->blinparam(2,$address,PDO::PARAM_STR);$stmt->blinparam(3,phone,PDO::PARAM_STR,20);//...?>

3、執行準備語句

當準備陳述式完成,並綁定了相應的參數後,就可以通過調用PDOStatement類對象中的execute()方法,反覆執行在資料庫緩衝區準備好的語句了。在下面的樣本中,向前面提供的contactinfo表中,使用預先處理方式連續執行同一個INSERT語句,通過改變不同的參數添加兩條記錄。如下所示:

<?php try {     $dbh = new PDO('mysql:dbname=testdb;host=localhost', $username, $passwd);}catch (PDOException $e){    echo '資料庫連接失敗:'.$e->getMessage();    exit;} $query = "insert into contactinfo (name,address,phone) values(?,?,?)";$stmt = $dbh->prepare($query); $stmt->blinparam(1,$name);      $stmt->blinparam(2,$address);$stmt->blinparam(3,phone); $name = "趙某某";$address = "海澱區中關村";$phone = "15801688348"; $stmt->execute();           //執行參數被綁定後的準備語句?>


如果你只是要傳遞輸入參數,並且有許多這樣的參數要傳遞,那麼你會覺得下面所示的捷徑文法非常有協助。是通過在execute()方法中提供一個選擇性參數,該參數是由準備查詢中的具名引數預留位置組成的數組,這是第二種為預先處理查詢在執行中替換輸入參數的方式。此文法使你能夠省去對$stmt->bindParam()的調用。將上面的樣本做如下修改:

<?php //...省略PDO串連資料庫代碼$query = "insert into contactinfo (name,address,phone) values(?,?,?)";$stmt = $dbh->prepare($query);  //傳遞一個數組為預先處理查詢中的具名引數綁定值,並執行一次。$stmt->execute(array("趙某某","海澱區","15801688348"));?>

另外,如果執行的是INSERT語句,並且資料表中有自動成長的ID欄位,可以使用PDO對象中的lastinsertId()方法擷取最後插入資料表中的記錄ID。如果需要查看其他DML語句是否執行成功,可以通過PDOStatement類對象中的rowCount()方法擷取影響記錄的行數。 

參考來源: 
PDO預先處理語句PDOStatement對象使用總結
http://www.lai18.com/content/369336.html
延伸閱讀

《PHP資料庫PDO系列》系列技術文章整理收藏 

1php資料庫抽象層 PDO

2php資料庫抽象層之PDO介紹及簡單一實例

3PHP PDO類解決資料庫連接問題

4PHP 5資料對象(PDO)抽象層與Oracle

5PHP PDOStatement:bindParam插入資料錯誤問題分析

6PDO防注入原理分析以及使用PDO的注意事項總結

7PHP資料庫抽象層之PDO(一)——簡介和安裝配置

8PHP資料庫抽象層之PDO(五)——錯誤與錯誤處理

9PHP資料庫抽象層之PDO(三)——事務與自動認可

10PHP資料庫抽象層之PDO(二)——串連與串連管理

11PHP資料庫抽象層之PDO(四)——預先處理語句與預存程序

12PHP資料庫抽象層之PDO(七)——相關類和方法

13PHP資料庫抽象層之PDO(六)——大對象(LOBs)

14PHP PDO操作總結

15PHP PDOStatement對象bindpram()、bindvalue()和bindcolumn之間的區別

16PDO預先處理語句PDOStatement對象使用總結

17PHP中MySQL、MySQLi和PDO的用法和區別【原創】

18PHP實現PDO的mysql資料庫操作類

19php使用pdo串連報錯Connection failed SQLSTATE的解決方案

20php使用pdo串連並查詢sql資料庫的方法

21php使用pdo串連mssql server資料庫執行個體

22php使用PDO方法詳解

23php下pdo的mysql交易處理用法執行個體

24php使用PDO操作MySQL資料庫執行個體

25PHP PDO fetch 模式各種參數的輸出結果一覽

26對PHP PDO的一些認識小結

27php中資料庫連接方式pdo和mysqli對比分析

28PDO防注入原理分析以及注意事項

29php中mysql串連方式PDO使用詳解

30PHP使用PDO串連ACCESS資料庫

31php中PDO方式實現資料庫的增刪改查

32淺談PDO的rowCount函數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.