MySQL プリペアド ステートメントでの LIMIT キーワードの使用
MySQL で PDO を使用してプリペアド ステートメントを使用すると、LIMIT キーワードで問題が発生する可能性があります。次のクエリ:
SELECT id, content, date FROM comment WHERE post = ? ORDER BY date DESC LIMIT ?, ?
は PDO プリペアド ステートメントでは機能しませんが、LIMIT 0, 10 に変更すると機能します。この問題は、PDO がパラメータを処理する方法に原因があります。
PDO パラメータ バインディング
PDOStatement::execute() は、デフォルトですべての入力パラメータを文字列として扱います。その結果、LIMIT 句のパラメータ $min と $max は文字列として挿入されます。 MySQL はクエリを次のように解析します。
LIMIT '0', '10'
解析エラーが発生します。
解決策
この問題を解決するには、いくつかの方法があります。 :
$comments->bindParam(1, $post, PDO::PARAM_STR); $comments->bindParam(2, $min, PDO::PARAM_INT); $comments->bindParam(3, $max, PDO::PARAM_INT);
$query = sprintf('SELECT id, content, date FROM comment WHERE post = ? ORDER BY date DESC LIMIT %d, %d', $min, $max);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
いずれかを実装することによりこれらのソリューションでは、MySQL のプリペアド ステートメントで LIMIT キーワードを正常に使用できます。
以上がPDO を使用した MySQL プリペアド ステートメントで LIMIT を正しく使用する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。