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