PDOのWHERE句で、LIKEを使う場合を紹介します。
(参考: SQLのLIKE自体の解説)
LIKE演算子を使うには、ワイルドカードの"%"が必要ですが、
PHPのPDO内でこのワイルドカードを使うためには、ひと工夫必要です。
"%"とプレースホルダーの組み合わせ方と、"%"のエスケープ法を解説します。
%の正しいつけ方
×ダメな例
名前付きプレースホルダーの前後に、直接%を使うことはできません。
1 | $sql = "select * from sample where name like '%:keyword%'" ; |
○OKな例
文字列結合で埋め込んであげる必要があります。
1 2 3 4 5 6 | // $keywordを"%"で挟んであげる $keyword = "%" . $keyword . "%" ; // $sqlを設定 $sql = "select * from sample where name like :keyword" ; // 値をバインド $stmt ->bindParam(':keyword', $keyword , PDO::PARAM_STR); |
「%」と「_」はエスケープ
LIKE検索で「%」と「\_」は特殊な意味を持つので、エスケープが必要です。
以下では、エスケープ文字として"#"を使っています。
エスケープが必要なすべての文字("_", "%", "#")の頭に、"#"を付け足し、
$sql内部のSQL句で、"#"をエスケープ文字にすることを宣言しています。("escape '#'")
1 2 3 | $keyword = mb_ereg_replace('([_%#])', '#¥1', $keyword ]); $sql = "select * from sample where name like :keyword escape '#'" ; $stmt ->bindParam(':keyword', $keyword , PDO::PARAM_STR); |