PDO預處理語句PDOStatement物件

2021-07-14 01:32:00 字數 4933 閱讀 5535

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::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 catch (pdoexception $e)

$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()方法獲取影響記錄的行數

mysql預處理語句 MYSQL 預處理語句

一 預處理語句介紹 mysql支援服務端預處理語句,預處理語句利用高效的客戶端 服務端二進位制協議。用佔位符替換引數值的預處理語句有下列兩個好處 每次執行語句時,解析語句的開銷更小。通常,資料庫應用程式會處理大量相似的語句,只在子句中更改文字或變數值,比如查詢和刪除的where子句,更新的updat...

php中 pdo的預處理

以下是一些pdo預處理 的一些小知識 兩種佔位符號 關聯陣列,按名稱使用,和順序無關,以冒號開頭,自己定義 引數 索引陣列,按索引順序使用 stmt pdo prepare sql sql可是是任意sql語句,這與mysqli不同 如 trycatch pdoexception e stmt pdo...

pdo中的預處理語法

什麼叫預處理語法 就是,為了 重複執行 多條結構類似的sql語句,而將該sql語句的形式 進行預先處理 編譯 該sql語句的 形式 中,含有 未給定的資料項 然後,到正式執行的時候,只要給定相應的形式上的 資料項 就可以更快速方便執行。比如 有兩種預定義語法 語法1 sql select from ...