使用 PDO 准备语句从搜索字段中使用多个关键字进行 LIKE 查询
Posted
技术标签:
【中文标题】使用 PDO 准备语句从搜索字段中使用多个关键字进行 LIKE 查询【英文标题】:LIKE query using multiple keywords from search field using PDO prepared statement 【发布时间】:2012-11-03 23:57:37 【问题描述】:网站用户使用搜索表单来查询产品数据库。输入的关键字在数据库中搜索产品的标题。
public function startSearch($keywords)
$keywords = preg_split('/[\s]+/', $keywords);
$totalKeywords = count($keywords);
foreach($keywords as $key => $keyword)
$search .= '%'.$keyword.'%';
if($key != ($totalKeywords)-1)
$search .= ' AND itemTitle LIKE ';
$sql=$this->db->prepare("SELECT * FROM prodsTable WHERE itemTitle LIKE ?");
$sql->bindParam(1, $search);
$sql->execute ();
$sql->fetchALL(PDO::FETCH_ASSOC);
如果用户输入单个关键字,则搜索有效,但如果使用多个关键字,则不会执行查询。
如果: $keywords = '苹果 ipod'; $search = '%apple% AND itemTitle LIKE %ipod%';
所以准备好的语句应该是这样的:
"SELECT * FROM prodsTable WHERE itemTitle LIKE %apple% AND itemTitle LIKE %ipod%"
当两个产品应返回标题中同时包含“apple”和“ipod”时,不会返回任何结果。
我做错了什么?
【问题讨论】:
"SELECT * FROM prodsTable WHERE itemTitle LIKE '%apple%' AND itemTitle LIKE '%ipod%'"
。你喜欢的模式被引用了吗?
在 foreach 语句中,它是 '%'.$keyword.'%',它返回以下准备好的语句: SELECT * FROM prodsTable WHERE itemTitle LIKE %apple% 有效。但是,当添加第二个或第三个关键字时,$search 变量变为:'%'.$keyword.'%' AND itemTitle LIKE --> 给出准备好的语句:SELECT * FROM prodsTable WHERE itemTitle LIKE %apple% AND itemTitle LIKE %ipod% 不起作用。添加多个关键字不会提供结果。我已经尝试过: itemTitle LIKE '%aple%' 但这也不起作用。我准备的没有引号的原件有效。
bindParam
会在需要时添加引号,所以没关系
一旦关键字搜索有效。不止一个没有。这是执行的确切语句,但没有结果。 SELECT * FROM prodsTable WHERE itemTitle LIKE %apple% AND itemTitle LIKE %ipod%
【参考方案1】:
Prepared statements 保护您免受sql注入,因此参数中的sql代码不会被解释。在调用 prepare() 之前,您必须使用正确编号的 AND itemTitle LIKE ?
构建一个 sql 查询。
$keywords = preg_split('/[\s]+/', $keywords);
$totalKeywords = count($keywords);
$query = "SELECT * FROM prodsTable WHERE itemTitle LIKE ?";
for($i=1 ; $i < $totalKeywords; $i++)
$query .= " AND itemTitle LIKE ? ";
$sql=$this->db->prepare($query);
foreach($keywords as $key => $keyword)
$sql->bindValue($key+1, '%'.$keyword.'%');
$sql->execute ();
【讨论】:
谢谢!我必须进行以下更改,因为它不会让我通过引用传递。 foreach($keywords as $key => $keyword) $search = '%'.$keyword.'%'; $sql->bindParam($key+1, $search);非常感谢您的帮助,我也感谢您的解释。 这个答案更值得称赞...救了我的命! :)以上是关于使用 PDO 准备语句从搜索字段中使用多个关键字进行 LIKE 查询的主要内容,如果未能解决你的问题,请参考以下文章
使用 PHP PDO 准备语句和 MySQL 选择字段为空的行