プリペアードステートメント展開時のクォーテーションのせいでLIKEにてこずったときのメモ

プリペアードステートメント展開時のクォーテーションのせいでLIKEにてこずったときのメモ

本日の問題

検索キーワードを受け取って検索を行いたいと考え、以下の様なクエリを考えました。


SELECT * FROM musics WHERE title LIKE '%query%';


これにより、musicsテーブルから「query」という文字列をtitleに含む列を取得することが可能です。

queryの部分はユーザの入力に応じて変化させたいため、プリペアードステートメントを用いて以下のようにしてみました。


SELECT * FROM musics WHERE title LIKE '%:query%';


これで、:query の部分にユーザから受け取ったキーワードが入り一件落着。

とはいかないですね。
簡単に想像出来ますが、例えば「ほげほげ」というキーワードを与えたら以下のように展開されてしまいます。


SELECT * FROM musics WHERE title LIKE '%'ほげほげ'%';


クォーテーションが邪魔ですね。

解決策

考えてみれば単純なことでした。展開された時に丁度いい具合になってくれればいいわけです。

クエリを以下のように設定し


SELECT * FROM musics WHERE title LIKE :query;


:query として %ほげほげ% を与えてやるんですね。

そうすると以下のように展開されてくれます。


SELECT * FROM musics WHERE title LIKE "%ほげほげ%";


できました。

終わりに

ううん。知っている人にとっては当然なのかな…

なかなか悩んでしまいました。

人のコードを読むのは大事なことだなぁと、しみじみ感じました。