2017-06-27 10 views
0

私はMySQLでPHPを使用してゲームを作っています。フィールド名が1人のユーザーから別のユーザーに変わるUPDATEクエリが必要です。動的フィールドを使用してMySQLを更新する

私のコードは次のとおりです。私のデータベースで

$upd = $sql->prepare("UPDATE empire_users SET :p = :p + :p2 WHERE id = :id"); 
$upd->execute(array(
    ':p' => "p".$type, 
    ':p2' => 10, 
    ':id' => $_SESSION["id"] 
)); 

、ユーザーは3列があります。pwood、pstone、pwheat、および$のタイプは "小麦"、 "石"、または "木" である可能性があります。

選択したフィールド($ typeに依存)をp2(ここでは10)だけ増やしたいとします。

+1

* *手段が動作しませんか? – Jens

+1

列の名前にプレースホルダを使用できません。そこに文字列を連結する必要があります – Jens

答えて

2

特にコメント以下、http://php.net/manual/fr/pdo.prepare.phpを参照してください:プレースホルダの周りに引用符を追加する理由を不思議に思ったものに

が間違っている、そしてなぜあなたは、テーブルまたは列の名前のプレースホルダを使用することはできません。

共通がありますプリペアド・ステートメントのプレースホルダがどのように機能するかについての誤解。単純に(エスケープされた)文字列として代入されるのではなく、結果としてのSQLが実行されます。その代わりに、文を準備するDBMSは、どのテーブルやインデックスを使用するかなど、そのクエリをどのように実行するかについての完全なクエリプランを提示します。プレースホルダの記入方法にかかわらず同じです。

"SELECT name FROM my_table WHERE id =:value"の計画は、 ":value"の代わりに同じですが、一見類似した "SELECT name FROM:table WHERE id =:value"は計画できませんなぜなら、DBMSは実際にどのテーブルを選択するか分からないからです。あなたの答えのための

0

おかげで、私は修正:

$upd = $sql->prepare("UPDATE empire_users SET p".$type." = p".$type." + :p2 WHERE id = :id"); 
$upd->execute(array(
    ':p2' => 10, 
    ':id' => $_SESSION["id"] 
)); 
関連する問題