在PDOStatement 類別中兩種方法的具體說明如下
bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )<pre name="code" class="php">bool PDOStatement::bindValue ( mixed $parameter , mixed $value [, int $data_type = PDO::PARAM_STR ] )
區別1:bindParam是綁定一個參數到指定的變數名,bindValue則是把一個值綁定到一個參數
<pre name="code" class="php">$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass'); $st = $db->prepare('select * from tabletest where id = ?'); $id = 1; $st->bindParam(1,$id,PDO::PARAM_INT); //$st->bindValue(1,$id,PDO::PARAM_INT);
bindParam就會報如下錯誤,但是bindValue卻可以正常執行
區別2:不同於PDOStatement::bindValue(),PDOStatement::bindParam()中的變數作為參考被綁定,並且只在PDOStatement::execute() 被呼叫的時候才取其值
$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass'); $st = $db->prepare('select * from tabletest where id = ?'); $st->bindParam(1,1,PDO::PARAM_INT); //$st->bindValue(1,1,PDO::PARAM_INT);
Fatal error: Cannot pass parameter 2 by reference
雖然兩者都能完成sql參數的綁定,但是兩者仍然有區別,在實際應用中,我們應該選擇適合我們的,下面舉一個bindParam使用不當的例子
假設有一個數據表有整形id和字串型name兩個字段,有一數組資料$params = array(1,'張三')準備使用預處理進行插入,具體程式碼如下
$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass'); $st = $db->prepare('select * from tabletest where id = ?'); $id = 1; $st->bindParam(1,$id,PDO::PARAM_INT); $id = 2; $st->execute(); $rs = $st->fetchAll(); print_r($rs);
$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass'); $st = $db->prepare('select * from tabletest where id = ?'); $id = 1; $st->bindValue(1,$id,PDO::PARAM_INT); $id = 2; $st->execute(); $rs = $st->fetchAll(); print_r($rs);
$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass'); $st = $db->prepare('insert into tabletest(id,name) values(?,?)'); $params = array(1,'张三'); foreach($params as $k => $v){ $index = $k + 1; $st->bindParam($index,$v); } $st->execute();
以上就介紹了php pdo中PDOStatement 類別的bindParam和bindValue方法的差別,包含了面向的內容,希望對PHP教學有興趣的朋友有幫助。