MySQL のプリペアド ステートメントで LIMIT キーワードを使用する
MySQL の LIMIT 句は、SELECT クエリによって返される行数を制限するために使用されます。 。ただし、プリペアド ステートメント (PDO) で LIMIT を使用する場合、パラメーターの値を文字列として指定すると問題が発生する可能性があります。
問題の特定:
エラーが発生するPDO のexecute() メソッドは、実際のデータ型に関係なく、すべてのパラメータを自動的に文字列として扱うためです。 LIMIT 句で数値が予期されている場合、これにより解析エラーが発生する可能性があります。
たとえば、次のクエリは解析エラーで失敗します。
SELECT id, content, date FROM comment WHERE post = ? ORDER BY date DESC LIMIT ?, ?
パラメータ ($minおよび $max) が文字列として渡されると、結果の SQL ステートメントは次のようになります:
LIMIT '0', '10'
これは MySQL では無効な構文です。 LIMIT の値は数値である必要があります。
解決策:
この問題を解決するには、いくつかの方法があります:
それぞれのデータ型を指定して、パラメータをステートメントに明示的にバインドします:
$comments->bindParam(1, $post, PDO::PARAM_STR); $comments->bindParam(2, $min, PDO::PARAM_INT); $comments->bindParam(3, $min, PDO::PARAM_INT);
LIMIT の値をパラメータとして渡す代わりに、手動でそれらをクエリ文字列に追加します:
$query = sprintf('SELECT id, content, date FROM comment WHERE post = ? ORDER BY date DESC LIMIT %d, %d', $min, $max);
MySQL ドライバーには、準備された数値引数を引用符で囲む機能があります。発言。これを無効にするには、ATTR_EMULATE_PREPARES 属性を FALSE:
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
以上がMySQL でプリペアド ステートメントで LIMIT を正しく使用する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。