使用关联数组在PHP中使用PDO准备的语句会产生错误的结果

使用关联数组在PHP中使用PDO准备的语句会产生错误的结果,php,pdo,associative-array,insert-update,Php,Pdo,Associative Array,Insert Update,我正在开发一个非常小的PHP和MySQL应用程序。我有一个名为User的类,用于处理数据库中的用户数据,其中包含createUser方法,如下所示:- /** * Creates a new user record in the users table for a new user * * @return void */ public function createUser($user_id, $user_name, $location_id) { // query to exe

我正在开发一个非常小的PHP和MySQL应用程序。我有一个名为User的类,用于处理数据库中的用户数据,其中包含createUser方法,如下所示:-

/**
* Creates a new user record in the users table for a new user
*   
* @return void
*/
public function createUser($user_id, $user_name, $location_id) {

    // query to execute
    $query = "INSERT INTO 
                      users(user_id,user_name,location_id)
                      VALUES(:id,:name,:location)";

    // query parameters
    $parameters = array (
        ':id' => $user_id,
        ':name' => $user_name,
        ':location' => $location_id
    );

    $databaseInteractions = new DatabaseInteractions();
    $databaseInteractions->executeUpdate($this->_connection, $query, $parameters);

}
我有另一个类,它包含与数据库交互的常用方法,称为DatabaseInteractions,如上面的代码所示。此类包含一个名为executeUpdate的方法,用于执行DML查询,如下所示:-

/**
 * A function for executing DML queries using a prepared statement
 * @param $connection The database connection object
 * @param $query The dml query to be executed
 * @param $parameters The input parameters for the query as a hash 
 */
public function executeUpdate($connection,$query, $parameters) {

    if ($stmt = $connection->prepare($query)) {

        //bind query parameters
        foreach ($parameters as $key => $value) {
            $stmt->bindParam($key, $value);
        }
        //begin transaction
        $connection->beginTransaction();

        $stmt->execute();
        $stmt->closeCursor();

        //commit transaction
        $connection->commit();
    }
}    
当我在User类中调用createUser方法时,如下所示

$user->createUser(3,"NewUser",1);
数据库中插入的值如下:-

   user_id   user_name  location_id
    1              1             1
我花了一些时间调试代码,但似乎仍然找不到发生这种情况的原因。user_id是PK,是int。user_name是varchar,location_id是FK,是int


我是一名Java开发人员,对PHP不熟悉,因此欢迎您提供与PHP命名约定、编码标准等相关的任何输入。

回答:参考语义明白了

的第二个参数通过引用传递:

将PHP变量绑定到相应的命名或问号 SQL语句中的占位符,用于准备 陈述与PDOStatement::bindValue()不同,变量绑定为 参考,仅在 调用PDOStatement::execute()

因此,当执行该语句时,所有三个参数的计算结果都是
$value
的最后一个值——在本例中是
1

要解决此问题,请使用的可选参数,而不是显式绑定参数:

public function executeUpdate($connection,$query, $parameters) {
    if ($stmt = $connection->prepare($query)) {
        $connection->beginTransaction();

        $stmt->execute($parameters);
        $stmt->closeCursor();

        //commit transaction
        $connection->commit();
    }
}    

工作起来很有魅力。谢谢。如果我想使用bindParam函数,我是否必须使用&$value作为第二个参数,而不仅仅是$value?@bot:No,
&
将是多余的。如果要使用
bindParam
,则必须显式地编写
$parameters[$key]
而不是
$value
——这使得
foreach
看起来很傻,并且是“修复”的主要候选对象下次有人检查代码时,应该在考虑附加&之前使用一些常识。感谢您的提示。您应该能够编辑
foreach
语句以传递原始引用<代码>foreach($key=>和$value形式的参数)