2017-01-04 11 views
1

私はデータベースの2列を更新するphp関数を持っています。しかし、私はそれは両方の姓と名の更新する代わりに、ジョーと知らんの知らないのが好きないくつかの理由でステートメントを実行するときPHP PDO foreachの問題

$fields = array("firstname" => "Joe", "lastname" = "Dunno"); 

$stmt = $connection->prepare("UPDATE users SET firstname = :firstname, lastname = :lastname WHERE user_id = :user_id"); 

foreach ($fields as $key => $value) 
{ 
    $stmt->bindParam(":" . $key, $value); 
} 

$stmt->bindParam(":user_id", $user_id); 

:それはこのようになります。

私は$key$valueをエコーし​​てみましたが、正しく出力されました。

私はループのためにこれを使用するといくつかの奇妙な理由で正しく動作します。

for ($fieldsKeys = array_keys($fields), $x = 0; $x < count($fields); $x++) 
{ 
    $stmt->bindParam(":" . $fieldsKeys[$x], $fields[$fieldsKeys[$x]]); 
} 

答えて

5

bindParamは、両方のフィールドが同じ値($valueの最後の値)に設定されている理由です、変数に結合します。あなたは代わりにbindValueを使用する必要があります:あなたのコードで

$stmt->bindValue(":" . $key, $value); 

は、PDOはそれが:firstname:lastnameため$value変数を使用する必要があることを覚えています。文の実行時に$valueDunnoなので、両方のフィールドがこの値を取得します。 bindValueを使用する場合、PDOは使用された変数ではなくその値を覚えています。これが必要なものです。

+0

ありがとうございました。私はあなたの答えをすぐに受け入れてくれます。 – Resantic

+1

誰かがそれを見つけて、実際には 'bindParam'を必要とする場合(例えば、配列の値が文の実行前に変更できる場合など)、' $ stmp-> bindParam( ':'。$ key、 $ fields [$ key]); ' – v010dya