1

我正在开发一个非常小的 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 命名约定、编码标准等相关的输入都是受欢迎的。

4

1 回答 1

3

答案:参考语义陷阱。

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

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

因此,当执行该语句时,所有三个参数都将评估为最后一个值$value是什么——在这种情况下,1.

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

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

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

        //commit transaction
        $connection->commit();
    }
}    
于 2012-05-22T09:51:06.897 回答