0

PHP PDO 显示一些莫名其妙的行为。参数占位符被替换为相同的值。

$查询

UPDATE `newsletters` SET `title` = :title , `scheduled` = :scheduled , `modified` = :modified WHERE `id` = :id

$参数

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'
4

1 回答 1

2

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

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

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

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

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

来自php.net 文档

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

于 2013-04-15T23:03:16.380 回答