2

次のクエリを使用しています

$abilityPts = xxx;
$statement = $conn->prepare('UPDATE players SET ability = (ability + $abilityPts) WHERE id = :myPlayerId');

しかし、それはmerエラーを与えています..

$abilityPts column not found

この問題を解決するにはどうすればよいですか?

{"error":"SQLSTATE[42S22]: Column not found: 1054 Unknown column '$abilityPts' in 'field list'"}
4

5 に答える 5

6
  1. 準備済みステートメントを使用しています。したがって、準備済みステートメントを使用してください。バインドと同じ方法で使用:abilityPtsおよびバインドします。$abilityPts:myPlayerId

    $conn->prepare('UPDATE players SET ability = (ability + :abilityPts) WHERE id = :myPlayerId');
    

    連結によって SQL クエリを作成し、PHP 変数を文字列に埋め込むことは非常に悪い習慣です。コードを SQL インジェクションにさらす可能性があり、これは深刻な問題です。準備されたステートメントは、はるかにクリーンで安全であり、コミュニティによってベスト プラクティスとして一般的に受け入れられています。すでに準備済みステートメントを使用している場合は、うまくいっています。そのまま使用し続けてください。

  2. 1. で説明したことを実行する必要がありますが、PHPの'との違いにも注意してください。"

    ' (一重引用符):

    二重引用符やヒアドキュメントの構文とは異なり、変数や特殊文字のエスケープ シーケンスは、単一引用符で囲まれた文字列内にある場合は展開されません。

    これは基本的に次のことを意味します。

    $a = 15;
    echo 'My favorite is $a.'; //My favorite is $a.
    echo "My favorite is $a."; //My favorite is 5.
    

    詳細については、Strings に関する PHP マニュアルを参照してください。

于 2013-03-07T08:34:21.357 に答える
-2

変数を単一引用符で囲むと、変数は評価されません。二重引用符または文字列連結を使用してください。

私のかなり一般的な答えに対するさらなる罰を避けるために:一般的に、特に準備されたステートメントを使用する場合は、データベースへのクエリで変数を直接使用しないでください。

于 2013-03-07T08:35:02.337 に答える
-2
$statement = $conn->prepare(sprintf('UPDATE players SET ability = (ability + %d) WHERE id = :myPlayerId', $abilityPts));

これを試して

于 2013-03-07T08:36:15.383 に答える
-2

以下を実行してみてください:

$statement = $conn->prepare("UPDATE players SET ability = (ability + " . $abilityPts . ") WHERE id = :myPlayerId");
于 2013-03-07T08:36:17.370 に答える
-2

以下のコードを試してください:

$abilityPts = xxx;
$statement = $conn->prepare("UPDATE players SET ability = (ability + ".$abilityPts.") WHERE id = :myPlayerId");
于 2013-03-07T08:36:40.083 に答える