对LIKE使用带有PDO的命名参数


Using named parameters with PDO for LIKE

我正在尝试使用LIKE在我的数据库中搜索name字段。如果我像这样"手工"编写SQL:

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

然后它将返回"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();

我总是得到零结果。

我做错了什么?我在代码的其他地方使用准备好的语句,它们工作得很好。

绑定的:placeholders不能用单引号括起来。这样它们就不会被解释,而是被当作原始字符串处理。

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

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

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