ホームページ > バックエンド開発 > PHPチュートリアル > MySQL でプリペアド ステートメントで LIMIT を正しく使用する方法は?

MySQL でプリペアド ステートメントで LIMIT を正しく使用する方法は?

Linda Hamilton
リリース: 2024-11-28 14:05:14
オリジナル
699 人が閲覧しました

How to Correctly Use LIMIT with Prepared Statements in MySQL?

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 の値は数値である必要があります。

解決策:

この問題を解決するには、いくつかの方法があります:

  1. バインドパラメータ 1 つずつ1 つ:

それぞれのデータ型を指定して、パラメータをステートメントに明示的にバインドします:

$comments->bindParam(1, $post, PDO::PARAM_STR);
$comments->bindParam(2, $min, PDO::PARAM_INT);
$comments->bindParam(3, $min, PDO::PARAM_INT);
ログイン後にコピー
  1. パラメータを渡さない:

LIMIT の値をパラメータとして渡す代わりに、手動でそれらをクエリ文字列に追加します:

$query = sprintf('SELECT id, content, date
    FROM comment
    WHERE post = ?
    ORDER BY date DESC
    LIMIT %d, %d', $min, $max);
ログイン後にコピー
  1. エミュレートされた準備を無効にする:

MySQL ドライバーには、準備された数値引数を引用符で囲む機能があります。発言。これを無効にするには、ATTR_EMULATE_PREPARES 属性を FALSE:

$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
ログイン後にコピー
に設定します。

以上がMySQL でプリペアド ステートメントで LIMIT を正しく使用する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート