8

質問をよくお読みください。「私のコードが動かない!!!」というのは、いつもの愚かなことではありません。質問。

意図したエラーでこのコードを実行すると

try {
  $sth = $dbh->prepare("SELECT id FROM users WHERE name INN(?,?) ");
  $sth->execute(array("I'm","d'Artagnan"));
} catch (PDOException $e) {
    echo $e->getMessage();
}

このエラーメッセージが表示されます

SQL 構文にエラーがあります... 1 行目の 'INN('I\'m','d\'Artagnan')' 付近

しかし、私は何年もの間、クエリとデータがサーバーに別々に送信され、決して干渉しないと考えていました。したがって、いくつか質問があります(ただし、誰も答えられなかったと思います...)

  1. 引用符で囲まれた、エスケープされた、おなじみの文字列表現はどこから得られるのでしょうか。エラーを報告するために特別に作成されたものですか、それとも実際のクエリの一部ですか?
  2. 実際にはどのように機能しますか?プレースホルダーをデータに置き換えますか?
  3. デバッグ目的で、クエリの一部だけでなく、クエリ全体を取得する方法はありますか?

アップデート

mysqli期待どおりに実行します:エラーがスローされますnear 'INN(?,?)'

4

2 に答える 2

7

詳細はわかりませんが、お答えします。

  1. 引用はデータベース側で行われます。データベースは、正しく解釈されるように、受け取ったすべての値(箇条書き2を参照)をエスケープしてサニタイズします。エラーがスローされるとすぐに、データベース(この場合はMySQL)は実行しようとしたクエリを出力します。準備された部分だけを表示した場合、これはあまり役に立ちません。

  2. いいえ、そうではありません。準備時に、クエリはサーバー側でコンパイルされます。クエリが値を使用して実行されると、値のみが送信されます。これは、データベースでPREPAREおよびEXECUTEを直接呼び出すのとほとんど同じです。

  3. これは、使用しているデータベースによって異なります。たとえば、MySQLはすべてのクエリをログファイルに記録できます(my.cnf設定を確認してください)。ただし、PHP側でdebugDumpParams()を使用することもできます。

これが少しお役に立てば幸いです。

于 2010-09-16T13:42:04.343 に答える
7

追加してみてください

$dbh->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );

;)

于 2010-09-16T15:28:51.277 に答える