《PHP教程:PDO預處理語句PDOStatement對象使用總結》要點:
本文介紹了PHP教程:PDO預處理語句PDOStatement對象使用總結,希望對您有用。如果有疑問,可以聯(lián)系我們。
PHP教程PDO對預處理語句的支持需要使用PDOStatement類對象,但該類對象并不是通過NEW關鍵字實例化出來的,而是通過PDO對象中的prepare()辦法,在數(shù)據(jù)庫服務器中準備好一個預處理的SQL語句后直接返回的.如果通過之前執(zhí)行PDO對象中的query()辦法返回的PDOStatement類對象,只代表的是一個結果集對象.而如果通過執(zhí)行PDO對象中的prepare()辦法產生的PDOStatement類對象,則為一個查詢對象,能定義和執(zhí)行參數(shù)化的SQL命令.PDOStatement類中的全部成員辦法如下所示:
代碼如下:
PDOStatement::bindColumn ― 綁定一列到一個 PHP 變量
PDOStatement::bindParam ― 綁定一個參數(shù)到指定的變量名
PDOStatement::bindValue ― 把一個值綁定到一個參數(shù)
PDOStatement::closeCursor ― 關閉游標,使語句能再次被執(zhí)行.
PDOStatement::columnCount ― 返回結果集中的列數(shù)
PDOStatement::debugDumpParams ― 打印一條 SQL 預處理命令
PDOStatement::errorCode ― 獲取跟上一次語句句柄操作相關的 SQLSTATE
PDOStatement::errorInfo ― 獲取跟上一次語句句柄操作相關的擴展錯誤信息
PDOStatement::execute ― 執(zhí)行一條預處理語句
PDOStatement::fetch ― 從結果集中獲取下一行
PDOStatement::fetchAll ― 返回一個包含結果集中所有行的數(shù)組
PDOStatement::fetchColumn ― 從結果集中的下一行返回單獨的一列.
PDOStatement::fetchObject ― 獲取下一行并作為一個對象返回.
PDOStatement::getAttribute ― 檢索一個語句屬性
PDOStatement::getColumnMeta ― 返回結果集中一列的元數(shù)據(jù)
PDOStatement::nextRowset ― 在一個多行集語句句柄中推進到下一個行集
PDOStatement::rowCount ― 返回受上一個 SQL 語句影響的行數(shù)
PDOStatement::setAttribute ― 設置一個語句屬性
PDOStatement::setFetchMode ― 為語句設置默認的獲取模式.
PHP教程1、準備語句
PHP教程重復執(zhí)行一個SQL查詢,通過每次迭代使用不同的參數(shù),這種情況使用預處理語句運行效率最高.使用預處理語句,首先需要在數(shù)據(jù)庫服務器中先準備好“一個SQL語句”,但并不需要馬上執(zhí)行.PDO支持使用“占位符”語法,將變量綁定到這個預處理的SQL語句中.對于一個準備好的SQL語句,如果在每次執(zhí)行時都要改變一些列值,這種情況必須使用“占位符號”而不是具體的列值.在PDO中有兩種使用占位符的語法:“命名參數(shù)”和“問號參數(shù)”,使用哪一種語法要看個人的愛好.
PHP教程使用命名參數(shù)作為占位符的INSERT插入語句:
代碼如下:
$dbh->prepare(“insert into contactinfo(name,address,phone) values(:name,:address,:phone)”);
需要自定義一個字符串作為“命名參數(shù)”,每個命名參數(shù)需要冒號(:)開始,參數(shù)的命名一定要有意義,最好和對應的字段名稱相同.
使用問號(?)參數(shù)作為占位符的INSERT插入語句:
代碼如下:
$dbh->prepare(“insert into contactinfo(name,address,phone) values(?,?,?)”);
問號參數(shù)一定要和字段的位置順序對應.不管是使用哪一種參數(shù)作為占位符構成的查詢,或是語句中沒有用到占位符,都需要使用PDO對象中的prepare()辦法,去準備這個將要用于迭代執(zhí)行的查詢,并返回PDOStatement類對象.
PHP教程2、綁定參數(shù)
PHP教程當SQL語句通過PDO對象中的prepare()辦法在數(shù)據(jù)庫服務器端準備好了以后,如果使用了占位符,就需要在每次執(zhí)行時替換輸入的參數(shù).可以通過PDOStatement對象中的bindParam()辦法,把參數(shù)變量綁定到準備好的占位符上(位置或名字要對應).辦法bindParame()的原型如下所示:
代碼如下:
bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )
第一個參數(shù)parameter是必選項,如果在準備好的查詢中占位符語法使用名字參數(shù),那么將名字參數(shù)字符串作為bindParam()辦法的第一個參數(shù)提供.如果占位符語法使用問號參數(shù),那么將準備好的查詢中列值占位符的索引偏移量,作為該辦法的第一個參數(shù).
PHP教程第二個參數(shù)variable也是可選項,提供供給第一個參數(shù)所指定占位符的值.因為該參數(shù)是按引用傳遞的,所以只能提供變量作為參數(shù),不能直接提供數(shù)值.
PHP教程第三個參數(shù)data_type是可選項,為當前被綁定的參數(shù)設置數(shù)據(jù)類型.可以為以下值.
PHP教程PDO::PARAM_BOOL 代表boolean數(shù)據(jù)類型.
PDO::PARAM_NULL 代表SQL中的NULL類型.
PDO::PARAM_INT 代表SQL中的INTEGER數(shù)據(jù)類型.
PDO::PARAM_STR 代表SQL中的CHAR、VARCHAR和其他字符串數(shù)據(jù)類型.
PDO::PARAM_LOB 代表SQL中大對象數(shù)據(jù)類型.
PHP教程第四個參數(shù)length是可選項,用于指定數(shù)據(jù)類型的長度.
PHP教程第五個參數(shù)driver_options是可選項,通過該參數(shù)提供任何數(shù)據(jù)庫驅動程序特定的選項.
使用命名參數(shù)作為占位符的參數(shù)綁定示例:
代碼如下:
<?php
//...省略PDO連接數(shù)據(jù)庫代碼
$query = "insert into contactinfo (name,address,phone) values(:name,:address,:phone)";
$stmt = $dbh->prepare($query);????????? //調用PDO對象中的prepare()辦法
?
$stmt->blinparam(':name',$name);??????? //將變量$name的引用綁定到準備好的查詢名字參數(shù)":name"中
$stmt->blinparam(':address',$address);
$stmt->blinparam(':phone',phone);
//...
?>
PHP教程使用問號(?)作為占位符的參數(shù)綁定示例:
代碼如下:
<?php
//...省略PDO連接數(shù)據(jù)庫代碼
$query = "insert into contactinfo (name,address,phone) values(?,?,?)";
$stmt = $dbh->prepare($query);????????? //調用PDO對象中的prepare()辦法
?
$stmt->blinparam(1,$name,PDO::PARAM_STR);??????? //將變量$name的引用綁定到準備好的查詢名字參數(shù)":name"中
$stmt->blinparam(2,$address,PDO::PARAM_STR);
$stmt->blinparam(3,phone,PDO::PARAM_STR,20);
//...
?>
PHP教程3、執(zhí)行準備語句
PHP教程當準備語句完成,并綁定了相應的參數(shù)后,就可以通過調用PDOStatement類對象中的execute()辦法,反復執(zhí)行在數(shù)據(jù)庫緩存區(qū)準備好的語句了.在下面的示例中,向前面提供的contactinfo表中,使用預處理方式連續(xù)執(zhí)行同一個INSERT語句,通過改變不同的參數(shù)添加兩條記錄.如下所示:
代碼如下:
<?php
try {
?????$dbh = new PDO('mysql:dbname=testdb;host=localhost', $username, $passwd);
}catch (PDOException $e){
????echo '數(shù)據(jù)庫連接失敗:'.$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 = "海淀區(qū)中關村";
$phone = "15801688348";
?
$stmt->execute();?????????? //執(zhí)行參數(shù)被綁定后的準備語句
?>
如果你只是要傳遞輸入?yún)?shù),并且有許多這樣的參數(shù)要傳遞,那么你會覺得下面所示的快捷方式語法非常有幫助.是通過在execute()辦法中提供一個可選參數(shù),該參數(shù)是由準備查詢中的命名參數(shù)占位符組成的數(shù)組,這是第二種為預處理查詢在執(zhí)行中替換輸入?yún)?shù)的方式.此語法使你能夠省去對$stmt->bindParam()的調用.將上面的示例做如下修改:
代碼如下:
<?php
//...省略PDO連接數(shù)據(jù)庫代碼
$query = "insert into contactinfo (name,address,phone) values(?,?,?)";
$stmt = $dbh->prepare($query);
?
//傳遞一個數(shù)組為預處理查詢中的命名參數(shù)綁定值,并執(zhí)行一次.
$stmt->execute(array("趙某某","海淀區(qū)","15801688348"));
?>
PHP教程另外,如果執(zhí)行的是INSERT語句,并且數(shù)據(jù)表中有自動增長的ID字段,可以使用PDO對象中的lastinsertId()辦法獲取最后插入數(shù)據(jù)表中的記錄ID.如果需要查看其他DML語句是否執(zhí)行成功,可以通過PDOStatement類對象中的rowCount()辦法獲取影響記錄的行數(shù).
歡迎參與《PHP教程:PDO預處理語句PDOStatement對象使用總結》討論,分享您的想法,維易PHP學院為您提供專業(yè)教程。
轉載請注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/13872.html