PDOパラメーター化されたクエリが機能する方法
-
03-10-2019 - |
質問
質問を注意深く読んでください。それはいつも愚かではありません「私のコードは機能しません!!!」質問。
このコードを実行したとき 意図されたエラー
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構文にエラーがあります... near 'inn(' i 'm'、 'd ' artagnan ')'の近く
しかし、私は何年もの間、クエリとデータが個別に送信され、決して干渉しないと考えていました。したがって、私にはいくつかの質問があります(誰もが答えを得たとは思いませんが...)
- 引用され、逃げられたこのような馴染みのある文字列表現はどこにありますか?特にエラーを報告するために作成されていますか、それとも実際のクエリの一部ですか?
- それは実際にどのように機能しますか?プレースホルダーをデータで置き換えますか?
- デバッグ目的のために、クエリ全体だけでなく、クエリ全体を取得する方法はありますか?
アップデート
mysqli
予想通りにそれをしますか:それはエラーをスローします near 'INN(?,?)'
解決
追加してみてください
$dbh->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
;)
他のヒント
すべての詳細についてはわかりませんが、答えようとします。
引用符はデータベース側で発生します。データベースは、すべての値を逃げてサニタイズします(弾丸2を参照)受信して、正しく解釈されるようにします。エラーがスローされた瞬間、データベース(この場合はMySQL)が実行しようとしたクエリを印刷します。準備された部分を示しただけでは、これはそれほど役に立ちません。
いいえ、そうではありません。準備時に、クエリがサーバー側にコンパイルされます。値でクエリが実行されると、値のみが送信されます。これは、データベースの準備と実行を呼び出して直接実行するのとほぼ同じです。
これは、使用しているデータベースによって異なります。たとえば、MySQLはすべてのクエリをログファイルにログに記録できます(My.CNF設定を確認してください)。ただし、使用することもできます debugdumpparams() PHP側。
これが少し役に立ったことを願っています。