将命名参数与PDO一起用于LIKE

Dav*_*lds 17 php sql search pdo

我正在尝试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();
Run Code Online (Sandbox Code Playgroud)

然后它将返回'how'的相关结果.
但是,当我把它变成准备好的声明时:

$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();
Run Code Online (Sandbox Code Playgroud)

我总是得到零结果.

我究竟做错了什么?我在我的代码中的其他地方使用预准备语句,它们工作正常.

mar*_*rio 32

绑定:placeholders不应用单引号括起来.这样他们就不会被解释,而是被视为原始字符串.

当你想使用一个作为LIKE模式时,然后将%值与值一起传递:

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

$sql->execute(array(":term" => "%" . $_GET["search"] . "%"));
Run Code Online (Sandbox Code Playgroud)

哦,实际上你需要先在这里清理输入字符串(addcslashes).如果用户%在参数中提供任何无关的字符,则它们将成为LIKE匹配模式的一部分.请记住,整个:term参数都作为字符串值传递,并且%该字符串中的所有s都成为LIKE子句的占位符.

  • [在标准SQL中转义](http://drupal.org/node/654662)并不那么简单.例如,在PL/SQL和Transact SQL中,您必须提供要用作转义字符的字符. (2认同)