我正在尝试使用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();
然后它将返回'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();
我总是得到零结果。
我做错了什么?我在我的代码中的其他地方使用预准备语句,它们工作正常。
答案 0 :(得分:30)
绑定的:placeholders
不能用单引号括起来。这样他们就不会被解释,而是被视为原始字符串。
当您想要使用LIKE
模式时,请将%
与值一起传递:
$query = "SELECT *
FROM `help_article`
WHERE `name` LIKE :term ";
$sql->execute(array(":term" => "%" . $_GET["search"] . "%"));
哦,实际上你需要先在这里清理输入字符串(addcslashes)。如果用户在参数中提供任何无关的%
个字符,则它们将成为LIKE匹配模式的一部分。请记住,整个:term
参数都作为字符串值传递,该字符串中的所有%
都成为LIKE子句的占位符。