Использование именованных параметров с PDO для LIKE

Я пытаюсь найти поле 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();

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

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


person David Renolds    schedule 31.08.2011    source источник
comment
возможный дубликат оператора PDO Prepare без обработки параметров   -  person outis    schedule 02.01.2012


Ответы (1)


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

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

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

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

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

person mario    schedule 31.08.2011
comment
Экранирование в стандартном SQL не так просто. в PL/SQL и Transact SQL, например, вы должны указать символ, который будет использоваться в качестве escape-символа. - person jswolf19; 31.08.2011
comment
@ jswolf19: jswolf19: даже не был уверен в экранировании в MySQL, и я обычно удаляю любые небуквенно-цифровые символы. (Может быть достаточно и для ОП.) - person mario; 31.08.2011
comment
Я думаю, что MySQL по умолчанию использует \ , но OP не указывает БД, а стандартный SQL не указывает escape-символ по умолчанию. Вы должны предоставить его с синтаксисом a LIKE b ESCAPE c. - person jswolf19; 31.08.2011