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

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

DDD
リリース: 2024-11-27 15:57:14
オリジナル
997 人が閲覧しました

How to Correctly Use LIMIT in MySQL Prepared Statements with PDO?

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'
ログイン後にコピー

解析エラーが発生します。

解決策

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

  • バインドパラメータ個別に:bindParam() を使用して各パラメータの型を指定します:
$comments->bindParam(1, $post, PDO::PARAM_STR);
$comments->bindParam(2, $min, PDO::PARAM_INT);
$comments->bindParam(3, $max, PDO::PARAM_INT);
ログイン後にコピー
  • クエリからパラメータを除外します: $min パラメータと $max パラメータを削除しますクエリから取得し、それらをクエリの一部として指定します。クエリ:
$query = sprintf('SELECT id, content, date
    FROM comment
    WHERE post = ?
    ORDER BY date DESC
    LIMIT %d, %d', $min, $max);
ログイン後にコピー
  • エミュレートされた準備を無効にする: MySQL ドライバーでエミュレートされた準備を無効にする:
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
ログイン後にコピー

いずれかを実装することによりこれらのソリューションでは、MySQL のプリペアド ステートメントで LIMIT キーワードを正常に使用できます。

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

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