Использование именованных параметров с PDO для LIKE - PullRequest
17 голосов
/ 31 августа 2011

Я пытаюсь найти поле name в моей базе данных, используя LIKE.Если я создам SQL «вручную» следующим образом:

$query = "SELECT * \n"
        . "FROM `help_article` \n"
        . "WHERE `name` LIKE '%how%'\n"
        . "";
$sql = $db->prepare($query);
$sql->setFetchMode(PDO::FETCH_ASSOC);
$sql->execute();

Тогда он вернет релевантные результаты для «как».
Однако, когда я превращу его в подготовленный оператор:

$query = "SELECT * \n"
        . "FROM `help_article` \n"
        . "WHERE `name` LIKE '%:term%'\n"
        . "";
$sql->execute(array(":term" => $_GET["search"]));
$sql->setFetchMode(PDO::FETCH_ASSOC);
$sql->execute();

Я всегда получаю ноль результатов.

Что я делаю не так?Я использую подготовленные операторы в других местах моего кода, и они отлично работают.

1 Ответ

30 голосов
/ 31 августа 2011

Граница :placeholders не должна быть заключена в одинарные кавычки. Таким образом, они не будут интерпретироваться, а будут рассматриваться как необработанные строки.

Если вы хотите использовать один шаблон LIKE, передайте % вместе со значением:

$query = "SELECT * 
          FROM `help_article` 
          WHERE `name` LIKE :term ";

$sql->execute(array(":term" => "%" . $_GET["search"] . "%"));

О, и на самом деле вам нужно сначала очистить входную строку (addcslashes). Если пользователь предоставляет какие-либо посторонние символы % в параметре, они становятся частью шаблона соответствия LIKE. Помните, что весь параметр :term передается как строковое значение, и все % внутри этой строки становятся заполнителями для предложения LIKE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...