PHP PDO显示出一些莫名其妙的行为。参数占位符将替换为相同的值。
$查询
UPDATE `newsletters` SET `title` = :title , `scheduled` = :scheduled , `modified` = :modified WHERE `id` = :id
$ parameter
Array
(
[:title] => New Newsletter22
[:scheduled] => 2013-04-15 21:47:00
[:modified] => 2013-04-15 21:47:51
[:id] => 35
)
功能
public static function execute($query=null,$parameters=array())
{
global $dbnew;
$statement= $dbnew->prepare($query);
foreach($parameters as $k=>$v){
if(is_array($v)){
$statement->bindParam($k, $v[0],$v[1]);
}else{
$statement->bindParam($k, $v);
}
}
$statement->execute();
return $statement;
}
执行查询
1132 Query UPDATE `newsletters` SET `title` = '35' , `scheduled` = '35' , `modified` = '35' WHERE `id` = '35'
答案 0 :(得分:2)
bindParam
方法绑定对变量的引用,而不是变量的值。
您的foreach
循环会在每次迭代时更新$v
的值。
由于bindParam
在您实际执行查询之前不绑定值,因此示例中所有绑定参数的值将相同。它们都将被绑定到上一次循环迭代中$v
的值。
使用bindValue
绑定变量的实际值而不是引用。
$statement->bindValue($k, $v);
bool PDOStatement :: bindParam
将PHP变量绑定到相应的命名或问号占位符 在用于准备语句的SQL语句中。不像 PDOStatement :: bindValue(),该变量被绑定为引用和 只会在调用PDOStatement :: execute()时进行评估。