PHP PDO prepare()、execute()和bindParam()方法詳解
每次將查詢發送給MySQL服務器時,都必須解析該查詢的語法,確保結構正確並能夠執行。這是這個過程中必要的步驟,但也確實帶來了一些開銷。做一次是必要的,但如果反復地執行相同的查詢,批量插入多行並只改變列值時會怎么樣呢?預處理語句會在服務器上緩存查詢的語法和執行過程,而只在服務器和客戶端之間傳輸有變化的列值,以此來消除這些額外的開銷。
PDO為支持此特性的數據庫提供了預處理語句功能。因為MySQL支持這個特性,所以可以在適當時使用預處理語句。
預處理語句是使用兩個方法實現的:prepare()方法負責准備要執行的查詢,execute()方法使用一組給定的列參數反復地執行查詢。這些參數可以顯式地作為數組傳遞給execute()方法,也可以使用通過bindParam()方法指定的綁定參數提供給execute()方法。
使用預處理語句——prepare()方法
prepare()方法負責准備要執行的查詢。語法格式如下:PDOStatement PDO::prepare(string statement[,array driver_options])
但是,用作准備語句的查詢與以住使用的查詢略有區別,因為對於每次執行迭代中要改變的值,必須使用占位符而不是具體的列值。
查詢支持兩種不同的語法:命名參數和問號參數。
使用命名參數的查詢如下:INSERT INTO tb_chengji SET xuesheng=:xuesheng,yuwen=:yuwen;
其中,:xuesheng與:yuwen都是列占位符。
使用問號參數的查詢如下:INSERT INTO tb_chengji SET xuesheng=?,yuwen=?;
其中,?也是列占位符。
選擇哪一種語法都可以,但是前者更明確一些。
下面使用prepare()方法准備一個用於迭代執行的查詢:<?php
$pdo=new PDO($dsn,$user,$pwd); // 連接數據庫
$query="INSERT INTO tb_chengji SET xuesheng=:xuesheng,yuwen=:yuwen";
$result=$pdo->prepare($query);
?>
上面的代碼將查詢准備好了。繼續下面的操作。
執行准備查詢——execute()方法
execute()方法負責執行准備好的查詢。語法格式如下:bool PDOStatement::execute([array input_parameters])
該方法需要有每次迭代執行中替換的輸入參數。這可以通過兩種方法實現:作為數組將值傳遞給方法,或者通過bindParam()方法把值綁定到查詢中相應的變量名或位置偏移。
下面介紹第一種方法,第二種方法在bindParam()方法中介紹。
實例代碼中准備了一條語句並通過execute()方法反復執行,每次使用不同的參數:<?php
$pdo=new PDO($dsn,$user,$pwd); // 連接數據庫
$query=