PDO プリペアド ステートメントでのパラメーターの再利用: クリーンなソリューション
PDO のプリペアド ステートメントでは、通常、同じ名前のパラメータの再利用が制限されます。この制限により、同一のパラメーターを使用して複数の一致基準を持つクエリを構築する際に課題が生じます。 パラメーター (:term1、:term2 など) の名前を手動で変更するのは面倒で、エラーが発生しやすくなります。
MySQL ユーザー定義変数の活用
より効率的で読みやすいアプローチには、MySQL のユーザー定義変数が含まれます。この方法により、パラメータ管理が合理化され、コードの保守性が向上します。
このプロセスには次の手順が含まれます:
変数の初期化: PDOStatement::bindParam
を使用して、ユーザー定義変数に値を割り当てます。
<code class="language-php"> $stmt = $dbh->prepare("SET @term = :term"); $stmt->bindParam(":term", "%$term%", PDO::PARAM_STR);</code>
クエリの統合: SQL クエリ内の元のパラメータの複数のインスタンスをユーザー定義変数 (@term
) に置き換えます。
<code class="language-sql"> SELECT ... FROM table WHERE name LIKE @term OR number LIKE @term</code>
ステートメントの実行: 変更されたクエリを準備して実行します。
<code class="language-php"> $stmt = $dbh->prepare($sql); $stmt->execute();</code>
例:
次の複雑なクエリについて考えてみましょう:
<code class="language-sql">( SELECT t1.`name` AS resultText FROM table1 AS t1 WHERE t1.parent = :userID AND ( t1.`name` LIKE :term OR t1.`number` LIKE :term AND t1.`status` = :flagStatus ) ) UNION ( SELECT t2.`name` AS resultText FROM table2 AS t2 WHERE t2.parent = :userParentID AND ( t2.`name` LIKE :term OR t2.`ticket` LIKE :term AND t1.`state` = :flagTicket ) )</code>
ユーザー定義変数を使用したリファクタリングの結果:
<code class="language-sql">SET @term = :term; ( SELECT t1.`name` AS resultText FROM table1 AS t1 WHERE t1.parent = :userID AND ( t1.`name` LIKE @term OR t1.`number` LIKE @term AND t1.`status` = :flagStatus ) ) UNION ( SELECT t2.`name` AS resultText FROM table2 AS t2 WHERE t2.parent = :userParentID AND ( t2.`name` LIKE @term OR t2.`ticket` LIKE @term AND t1.`state` = :flagTicket ) )</code>
このアプローチの利点:
以上がPDO プリペアド ステートメントで同じパラメータを効率的に複数回使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。