Как вы выполняете нечеткие поиски с использованием связанных параметров в PDO?

Попытка сделать такое...

WHERE username LIKE '%$str%'

... но используя связанные параметры для подготовленных операторов в PDO. например:.

$query = $db->prepare("select * from comments where comment like :search");
$query->bindParam(':search', $str);
$query->execute();

Я пробовал множество перестановок одинарных кавычек и знаков%, и он просто перекрещивался со мной.

Кажется, я вспоминаю борьбу с этим в какой-то момент раньше, но я не могу найти никаких ссылок. Кто-нибудь знает, как (если?) Вы можете сделать это в PDO с именованными параметрами?

Ответ 1

Ах. Нашел комментарий на php.net, который напомнил мне ответ; вам нужно подстановить свое значение перед оценкой bindParam и не беспокоиться о его цитировании. Так, например, это прекрасно работает:

$str = "%$str%";
$query = $db->prepare("select * from comments where comment like :search");
$query->bindParam(':search', $str);
$query->execute();

Ответ 2

5 лет спустя, если кто-то еще наткнется на это, есть альтернативный метод, который я обнаружил. Принятое решение было не совсем выполнимо для моей ситуации, но этот метод, похоже, также выполняет свою работу:

$query = $db->prepare("select * FROM table WHERE field LIKE CONCAT('%',:search,'%')");
$query->bindParam(':search', $str);
$query->execute();

Я не уверен, произойдет ли поражение производительности из-за накладных расходов на вызов функции CONCAT, но я хотел бы передать это как вариант. Надеюсь, это поможет кому-то.