首頁 >後端開發 >php教程 >PDO預處理語句PDOStatement對象

PDO預處理語句PDOStatement對象

不言
不言原創
2018-07-03 16:53:142097瀏覽

這篇文章主要介紹了PDO預處理語句PDOStatement物件使用總結,本文介紹了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 — 获取跟上一次语句句柄操作相关的 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 — 为语句设置默认的获取模式。

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(&#39;:name&#39;,$name);        //将变量$name的引用绑定到准备好的查询名字参数":name"中
$stmt->blinparam(&#39;:address&#39;,$address);
$stmt->blinparam(&#39;:phone&#39;,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(&#39;mysql:dbname=testdb;host=localhost&#39;, $username, $passwd);
}catch (PDOException $e){
    echo &#39;数据库连接失败:&#39;.$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()方法來取得影響記錄的行數。

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

thinkPHP2.1自訂標籤庫的導入方法的介紹

使用pthreads實作真正的PHP多執行緒的方法

#

以上是PDO預處理語句PDOStatement對象的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn