MySQL のプリペアド ステートメントで LIMIT が機能しないのはなぜですか?

Barbara Streisand
リリース: 2024-11-26 19:27:10
オリジナル
794 人が閲覧しました

Why Doesn't LIMIT Work with Prepared Statements in MySQL?

MySQL のプリペアド ステートメントを使用した LIMIT キーワード

この質問は、プリペアド ステートメントを使用するときに LIMIT 句が期待どおりに機能しない問題を解決します。 MySQL の PDO ライブラリを使用します。

提供されたコード内スニペット:

<pre class="brush:php;toolbar:false">
$comments = $db->prepare($query); 
/* where $db is the PDO object */ 
$comments->execute(array($post, $min, $max)); 
ログイン後にコピー

パラメータ $min と $max は、PDOStatement::execute メソッドによって文字列として扱われます。その結果、最終的な SQL ステートメントは次のようになります:

LIMIT '0', '10'
ログイン後にコピー

MySQL では LIMIT 句に数値が必要なため、構文エラーが発生します。

考えられる解決策:

この問題を解決するには、次の点を考慮してください。オプション:

  • パラメータを手動でバインド:

    • bindParam を使用して各パラメータを適切なタイプにバインドします。
    • For例: $comments->bindParam(2, $min, PDO::PARAM_INT);
  • 文字列補間の使用:

    • $min と $max の値を直接埋め込むクエリ文字列を使用するsprintf.
    • 例:

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

    • を設定しますPDO::ATTR_EMULATE_PREPARES 属性を FALSE に設定して、MySQL が数値引数を引用できないようにします。
    • 例: $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);

注:
これらのメソッドを使用すると、プリペアド ステートメントで LIMIT 句を正しく使用できるようになります。

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

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