使用 PHP 的 PDO 类(MySQL 驱动程序)时,使用准备语句执行 MySQL LIKE 查询可以是一项令人困惑的任务。看似简单的语法通常无法产生所需的结果。
考虑以下使用 MySQL 客户端无缝检索数据的查询:
SELECT ... FROM hs ... WHERE hs.hs_text LIKE "%searchTerm%" LIMIT 25;
难题
但是,将此查询移植到 PHP 后,您可能会遇到无法返回任何结果的挫败感,无论您使用哪种语法 试图。下面的代码演示了此问题:
$sql = 'SELECT ... FROM hs ... WHERE hs.hs_text LIKE :searchTerm LIMIT 25'; $prep = $dbh->prepare($sql); $ret = $prep->execute(array(':searchTerm' => '"%'.$searchTerm.'%"'));
尝试将搜索词提供为 CONCAT('%', ?, '%')、"%:searchTerm%" 或 ":searchTerm",而相应地修改执行行,证明是徒劳的。
解决方案
解决这个难题的关键在于理解准备好的语句如何处理数据。它们与查询分开传送数据,从而在嵌入值时无需引号。
因此,正确的解决方案是:
$prep = $dbh->prepare($sql); $ret = $prep->execute(array(':searchTerm' => '%'.$searchTerm.'%'));
通过从搜索词参数中删除封闭的双引号,您现在可以利用准备好的语句的力量,让您成功执行 LIKE 查询。
以上是为什么我的 PHP PDO 准备语句不能与 MySQL LIKE 查询一起使用?的详细内容。更多信息请关注PHP中文网其他相关文章!