PDO プリペアド ステートメントでのバインドされたパラメーターの再利用: 2 つのアプローチ
高度なデータベース クエリを構築するには、多くの場合、SQL インジェクションの脆弱性を防ぐために名前付きバインド パラメーターの使用が必要になります。 ただし、PDO は通常、単一のプリペアド ステートメント内での同じ名前のパラメータの再利用を制限します。 この制限は、2 つの主要な方法を使用して克服できます。
方法 1: パラメータの動的名前変更
このアプローチでは、クエリ文字列を動的に変更して、繰り返されるパラメータ名 (例: ":term") をすべて一意のパラメータ名 (例: ":term0"、":term1" など) に置き換えます。 これにより、バインディングに対して各パラメータを一意に識別できるようになります。
<code class="language-php">$query = preg_replace_callback('/\:term/', function ($matches) use (&$termX) { $termX++; return $matches[0] . ($termX - 1); }, $query); $stmt = $pdo->prepare($query); for ($i = 0; $i < $termX; $i++) { $stmt->bindValue(":term$i", "%$term%", PDO::PARAM_STR); }</code>
方法 2: MySQL ユーザー定義変数を活用する
MySQL のユーザー定義変数は、代替ソリューションを提供します。 最初に変数を目的の値に設定すると、SELECT
ステートメント内でその変数を再利用できるため、複数のパラメーター バインディングの必要がなくなります。
<code class="language-php">$sql = "SET @term = :term"; try { $stmt = $dbh->prepare($sql); $stmt->bindValue(":term", "%$term%", PDO::PARAM_STR); $stmt->execute(); } catch (PDOException $e) { // error handling } $sql = "SELECT ... FROM table WHERE name LIKE @term OR number LIKE @term"; try { $stmt = $dbh->prepare($sql); $stmt->execute(); $result = $stmt->fetchAll(); } catch (PDOException $e) { // error handling }</code>
このメソッドではユーザー定義変数を初期化するために追加のクエリが必要ですが、コードの可読性が向上し、パラメーターのバインドが簡素化されます。 これらの方法のどちらを選択するかは、アプリケーションの特定のニーズと、コードの明瞭さと実行効率の好みによって異なります。
以上がPDO プリペアドステートメントでバインドされたパラメーターを再利用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。