PDO プリペアド ステートメントでのワイルドカードの使用法
SQL クエリの実行では、多くの場合、特定の基準に基づいてデータをフィルタリングする必要があります。プリペアド ステートメントは、SQL インジェクションの脆弱性を防止することでこれを実現する安全な方法です。ただし、プリペアド ステートメントでワイルドカードを使用すると、課題が生じる可能性があります。
課題
名前に「anyname」が含まれるユーザーを検索することを目的とした次のクエリを考えてみましょう:
SELECT * FROM `gc_users` WHERE `name` LIKE '%anyname%'
準備されたステートメントを使用してこのクエリを実行しようとする場合、一般的なアプローチ例:
$stmt = $dbh->prepare("SELECT * FROM `gc_users` WHERE `name` LIKE :name"); $stmt->bindParam(':name', "%" . $name . "%");
と
$stmt = $dbh->prepare("SELECT * FROM `gc_users` WHERE `name` LIKE '%:name%'"); $stmt->bindParam(':name', $name);
は機能しない可能性があります。これは、SQL LIKE ステートメントでワイルドカードを使用するには、プリペアド ステートメント内で特別な処理が必要なためです。
解決策
プリペアド ステートメントでワイルドカードを正しく使用するには、bindValue を利用できます。 bindParam() の代わりに () メソッドを使用します。以下に例を示します。
$stmt = $dbh->prepare("SELECT * FROM `gc_users` WHERE `name` LIKE :name"); $stmt->bindValue(':name', '%' . $name . '%');
代わりに、bindParam() を使用することもできますが、構文は少し変更されています。
$name = "%$name%"; $stmt = $dbh->prepare("SELECT * FROM `gc_users` WHERE `name` like :name"); $stmt->bindParam(':name', $name);
どちらのアプローチでも、ワイルドカード文字が適切にエスケープされ処理されることが保証されます。データベースによる。この方法でbindValue()またはbindParam()を使用すると、準備されたステートメント内でワイルドカードを使用してデータを効率的に検索でき、セキュリティと機能の両方を確保できます。
以上がPDO プリペアド ステートメントでワイルドカードを適切に使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。