配列パラメータの受け渡しと PDO での LIMIT 句の使用
データベース クエリを操作する場合、パラメータの配列をLIMIT 句を使用しているときの PDO ステートメント。ただし、bindParam メソッドを使用して個々のパラメーターを設定する場合、これは困難になる可能性があります。
ジレンマ
LIMIT 句では特定の数値をバインドする必要があるため、この問題が発生します。一方、execute メソッドは名前付きパラメータの配列を期待します。この非互換性のため、両方のアプローチを同時に使用することはできません。
問題の解決
解決策は、PDO::ATTR_EMULATE_PREPARES のデフォルト設定を無効にすることです。有効にすると、PDO は内部で動的 SQL を生成し、値を引用符で囲み、基本的に準備されたステートメントをエミュレートします。ただし、このデフォルトの動作は名前付きパラメータの受け渡しを妨げます。
エミュレートされた Prepares の無効化
setAttribute メソッドを使用して PDO::ATTR_EMULATE_PREPARES を false に設定すると、デフォルトの動作が無効になります。 。これにより、PDO は実際のプリペアド ステートメントを使用できるようになり、LIMIT 句を利用しながら名前付きパラメータのバインドが可能になります。
$pdo->setAttribute (PDO::ATTR_EMULATE_PREPARES、false); $sql = "SELECT * FROM table WHERE id LIKE CONCAT('%', :id, '%') LIMIT :limit1, :limit2"; $stmt = $pdo->prepare($sql); $stmt->execute(array(':id' => $id, ':limit1' => $limit1, ':limit2' => $limit2)); // Works!
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$sql = "SELECT * FROM table WHERE id LIKE CONCAT('%', :id, '%') LIMIT :limit1, :limit2";
$stmt = $pdo->prepare($sql);
$stmt->execute(array(':id' => $id, ':limit1' => $limit1, ':limit2' => $limit2)); // Works!
エミュレートされた準備は、パフォーマンスを向上させるために MySQL でデフォルトで使用されます。エミュレートされた準備を無効にすると、パフォーマンスがわずかに低下する可能性がありますが、パラメーター バインディングの柔軟性が向上します。
追加リソース
このトピックの詳細については、次のリソースを参照してください。
[PDO MySQL: PDO::ATTR_EMULATE_PREPARES を使用するか、そうでない?](https://stackoverflow.com/questions/3273325/pdo-mysql-use-pdo-attr-emulate-prepares-or-not)
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3