程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SyBase數據庫 >> SyBase教程 >> PDO預處理語句PDOStatement對象使用總結

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

編輯:SyBase教程

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


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 ― 獲取跟上一次語句句柄操作相關的 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是可選項,通過該參數提供任何數據庫驅動程序特定的選項。

使用命名參數作為占位符的參數綁定示例:

prepare($query);          //調用PDO對象中的prepare()方法

 

$stmt->blinparam(':name',$name);        //將變量$name的引用綁定到准備好的查詢名字參數":name"中

$stmt->blinparam(':address',$address);

$stmt->blinparam(':phone',phone);

//...

?>

使用問號(?)作為占位符的參數綁定示例:

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語句,通過改變不同的參數添加兩條記錄。如下所示:

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()的調用。將上面的示例做如下修改:

prepare($query); 

 

//傳遞一個數組為預處理查詢中的命名參數綁定值,並執行一次。

$stmt->execute(array("趙某某","海澱區","15801688348"));

?>

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved