【问题标题】:Using named parameters with PDO for LIKE将命名参数与 PDO 一起用于 LIKE
【发布时间】:2011-11-07 07:30:51
【问题描述】:

我正在尝试使用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();

然后它将返回“如何”的相关结果。
但是,当我把它变成一个准备好的语句时:

$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();

我总是得到零结果。

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

【问题讨论】:

标签: php sql search pdo


【解决方案1】:

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

当你想使用LIKE 模式时,将% 与值一起传递:

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

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

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

【讨论】:

  • Escaping in standard SQL 并不是那么简单。例如,在 PL/SQL 和 Transact SQL 中,您必须提供要用作转义字符的字符。
  • @jswolf19:我什至不确定是否要在 MySQL 中转义,我通常宁愿去掉任何非字母数字字符。 (对于 OP 来说可能也足够了。)
  • 我认为 MySQL 确实默认为 \ ,但 OP 没有指定数据库,标准 SQL 也没有指定默认转义字符。您必须使用 a LIKE b ESCAPE c 语法来提供它。
猜你喜欢
  • 1970-01-01
  • 2022-07-29
  • 2015-04-06
  • 1970-01-01
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多