29 June 2013

在使用PDO的时候,经常会使用bingParam或者bindValue方法进行参数绑定。(对这两个方法的描述参见官方文档,bingValue vs. bindParam)

正如文档中描述的,这两个方法最重要的区别在于,binParam方法的参数绑定是在调用PDOStatement::execute()方法才完成的。

Binds a PHP variable to a corresponding named or question mark placeholder in the SQL statement that was used to prepare the statement. Unlike PDOStatement::bindValue(), the variable is bound as a reference and will only be evaluated at the time that PDOStatement::execute() is called.

因此,如果在使用bindParam方法进行绑定后,并在调用PDOStatement::execute()方法之前,修改了变量值,则先前的绑定会失效。例如:

private function bingParam($stmt, $config_name, $config) {
    $stmt->bingParam(':config_name', $config_name);
        foreach ($config as $key => $value) {
            $temp_key = ':content_'.$key;
            $stmt->bingParam($temp_key, $value);
        }   
    }   
}

在上面的方法中,本意是遍历对象属性进行参数绑定,但由于使用了bindParam方法,因此,实际绑定的参数值都是最后一个属性值,导致最终赋值错误。

针对这种情况可以用bindValue方法完成所需功能。