ホームページ >データベース >mysql チュートリアル >文字列パラメータを使用すると、LIMIT を指定した MySQL プリペアド ステートメントが失敗するのはなぜですか?

文字列パラメータを使用すると、LIMIT を指定した MySQL プリペアド ステートメントが失敗するのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-06 15:01:11984ブラウズ

Why Does My MySQL Prepared Statement with LIMIT Fail When Using String Parameters?

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

問題:

MySQL で LIMIT 句を使用してプリペアド ステートメントを使用する場合、パラメータが次のように渡されると失敗します。 strings.

SELECT id, content, date
FROM comment
WHERE post = ?
ORDER BY date DESC
LIMIT ?, ?
$comments = $db->prepare($query);
$comments->execute(array($post, $min, $max));

回答:

この問題は、PDOStatement::execute() メソッドがすべてのパラメータを文字列として扱い、無効なパラメータが発生するために発生します。 SQL ステートメント。 MySQL が文字列パラメーターを数値にキャストしないため、解析エラーが発生するという事実により、この問題はさらに悪化します。

解決策:

  • バインド パラメーター個別:
$comments->bindParam(1, $post, PDO::PARAM_STR);
$comments->bindParam(2, $min, PDO::PARAM_INT);
$comments->bindParam(3, $min, PDO::PARAM_INT);
  • sprintf() を使用して数値パラメーターをハードコードします:
$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);

以上が文字列パラメータを使用すると、LIMIT を指定した MySQL プリペアド ステートメントが失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。