PHP PDO占位符替换为相同的值

时间:2013-04-15 21:56:53

标签: php mysql pdo

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'

1 个答案:

答案 0 :(得分:2)

bindParam方法绑定对变量的引用,而不是变量的值。

您的foreach循环会在每次迭代时更新$v的值。

由于bindParam在您实际执行查询之前不绑定值,因此示例中所有绑定参数的值将相同。它们都将被绑定到上一次循环迭代中$v的值。

使用bindValue绑定变量的实际值而不是引用。

$statement->bindValue($k, $v);

来自php.net documentation

  

bool PDOStatement :: bindParam
  将PHP变量绑定到相应的命名或问号占位符     在用于准备语句的SQL语句中。不像     PDOStatement :: bindValue(),该变量被绑定为引用和     只会在调用PDOStatement :: execute()时进行评估。