這篇文章主要介紹了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(':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()方法來取得影響記錄的行數。
以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!
相關推薦:
#
以上是PDO預處理語句PDOStatement對象的詳細內容。更多資訊請關注PHP中文網其他相關文章!