将命名参数与 PDO 一起使用

2022-08-30 19:54:05

我正在尝试使用 搜索数据库中的字段。如果我像这样“手工”制作SQL:nameLIKE

$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

绑定不应括在单引号中。这样,它们就不会被解释,而是被视为原始字符串。:placeholders

如果要将一个作为模式使用,则将 一起传递:LIKE%

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

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

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


答案 2

推荐