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

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

Barbara Streisand
リリース: 2024-10-24 01:29:29
オリジナル
398 人が閲覧しました

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 サイトの他の関連記事を参照してください。

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