しょうもないネタだけど結構ハマったので…
以下のようなテーブルがあるとする(MySQL)。
mysql>DESC books;
+-----------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| title | varchar(255) | NO | UNI | NULL | |
+-----------+---------------------+------+-----+---------+----------------+
ここで、titleによる検索のため、以下のようなSQLが実行されるように実装したい。
SELECT * FROM books WHERE title LIKE '%PHP%';
クエリビルダ(Phalcon\Mvc\Model\Criteria)で雑に実装すると以下のようになる。
Books::query()->where("title LIKE '%" . $search . "%'");
当然だけど、この実装にはSQLインジェクションの脆弱性がある。しかし、
Books::query()->where("title LIKE '%:title:%'", ['title' => $search]);
は動かない。では、どうするか。
Books::query()->where("title LIKE ':title:'", ['title' => '%' . $search . '%']);
という風に、バインドするパラメータの前後に%をつければよい。
以上。