ホームページ  >  記事  >  データベース  >  LIMIT句を使用してPDOパラメータの配列を渡すにはどうすればよいですか?

LIMIT句を使用してPDOパラメータの配列を渡すにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-24 01:29:29322ブラウズ

How to Pass an Array of PDO Parameters with a LIMIT Clause?

LIMIT 句を使用した PDO パラメータの配列の受け渡し

PDO では、パラメータの配列を使用して LIMIT 句を含むクエリを実行するのが難しい場合があります。

問題

次のコードを考えてみましょう:

$sql = "SELECT * FROM table WHERE id LIKE CONCAT('%', :id, '%')
LIMIT :limit1, :limit2";

$stmt = $pdo->prepare($sql);
$stmt->execute($array); // Doesn't work

便宜上配列入力を使用することが望ましいですが、:limit1 および :limit2 パラメータは個別にバインドされない限り機能しません。 :

$stmt->bindParam(':limit1', $limit1, PDO::PARAM_INT);
$stmt->bindParam(':limit2', $limit2, PDO::PARAM_INT);
$stmt->execute(); // Still doesn't work

解決策

問題は、PDO::ATTR_EMULATE_PREPARES が true に設定されている PDO のデフォルト設定にあります。この設定により、PHP はネイティブ MySQL プリペアド ステートメントを使用する代わりにプリペアド ステートメントをエミュレートすることになり、LIMIT パラメータの適切なバインドが妨げられます。

この問題を解決するには、属性を false に設定してエミュレーションを無効にします。

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

エミュレーションを無効にすると、配列入力を使用してクエリを正しく実行できます。

$stmt = $pdo->prepare($sql);
$stmt->execute($array); // Works!

パフォーマンスに関する考慮事項

エミュレーションを無効にすると、ネイティブとしてパフォーマンスに影響を与える可能性があることに注意してください。特定のシナリオでは、準備されたステートメントの方が効率的です。ただし、動的な LIMIT 句を必要とするクエリの場合、これが最も信頼性の高いソリューションです。

以上がLIMIT句を使用してPDOパラメータの配列を渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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