1

私は非常に小さなPHPおよびMySQLアプリケーションに取り組んでいます。以下に示すように、createUserメソッドを含むデータベース内のユーザーデータを操作するためのUserというクラスがあります。

/**
* 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と呼ばれるデータベースと対話するための一般的なメソッドを含む別のクラスがあります。このクラスには、以下に示すように、DMLクエリを実行するためのexecuteUpdateというメソッドが含まれています。

/**
 * 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

回答:参照セマンティクスの落とし穴。

の2番目のパラメータはbindParam参照によって渡されます。

PHP変数を、ステートメントの準備に使用されたSQLステートメント内の対応する名前付きまたは疑問符のプレースホルダーにバインドします。PDOStatement :: bindValue()とは異なり、変数は参照としてバインドされ、PDOStatement :: execute()が呼び出されたときにのみ評価されます。

したがって、ステートメントが実行されると、3つのパラメーターすべてが、最後の値が何であれ、$valueこの場合は。に評価されます1

この問題を解決するには、パラメーターexecuteを明示的にバインドする代わりに、のオプションのパラメーターを使用します。

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 に答える