MW211 EXIT

devlog
PDO/LIKE検索
2012年04月10日
┌──────────────────────────────────────┐
│SELECT 列 FROM 表 WHERE 検索列 LIKE '%検索値%';                             │
└──────────────────────────────────────┘
LIKE検索を行う場合、ベタだと上記のような感じだが、
PDOを使う場合は下記のような感じ。
┌──────────────────────────────────────┐
│SELECT 列 FROM 表 WHERE 検索列 LIKE :LIKE検索文字;                          │
└──────────────────────────────────────┘
で、プレースホルダに以下のような感じで「%」毎文字列としてbindしてあげる。
┌──────────────────────────────────────┐
│$sth->bindValue(':LIKE検索文字', '%'.$検索値.'%', PDO::PARAM_STR);          │
└──────────────────────────────────────┘

注意すべきなのは、検索文字の特殊文字をエスケープしてあげねばならぬこと。
「\」「%」「_」の先頭に「\」をつけてあげれよい。

「preg_replace()」で置換する例としては以下のような感じだ。
┌──────────────────────────────────────┐
│$検索値 = preg_replace('/\\\\/', '\\\\\\\\', $検索値);  // \→\\            │
│$検索値 = preg_replace('/%/'   , '\%'      , $検索値);  // %→\%            │
│$検索値 = preg_replace('/_/'   , '\_'      , $検索値);  // _→\_            │
└──────────────────────────────────────┘

なおこれらは、「standard_conforming_strings」の設定とは別の話だから注意。

ってことで、初心者が陥りやすいミスはこんな感じ。
┌─┬────────────────────────────────────┐
│  │$sql = 'SELECT * FROM 表 WHERE 列 LIKE %:like%';                        │
│×│$sth = $PDO->prepare($sql);                                             │
│  │$sth->bindValue(':like', '値', PDO::PARAM_STR);                         │
├─┼────────────────────────────────────┤
│  │$sql = 'SELECT * FROM 表 WHERE 列 LIKE :like';                          │
│○│$sth = $PDO->prepare($sql);                                             │
│  │$sth->bindValue(':like', '%値%', PDO::PARAM_STR);                       │
└─┴────────────────────────────────────┘
分類:PDO