我的查询存在问题,其中包含“喜欢”声明。
这是我的代码:
function get_number_of_locations_by_zip_tag($zip, $tag)
{
global $db;
$query = "SELECT * FROM location WHERE zip = :zip AND disabled = 0 AND (tags LIKE :tag OR name LIKE :tag) LIMIT :start, :number";
$statement = $db->prepare($query);
$statement->bindValue(':zip', $zip);
$statement->bindValue(':tag', '%'.$tag.'%', PDO::PARAM_STR);
$statement->execute();
$locations = $statement->fetchAll(); //fetch();
$statement->closeCursor();
return $locations;
}
我希望查询返回标记与'name'或'tags'字段匹配的行,但它只会返回标记匹配的行。
如果我将查询切换为:
$query = "SELECT * FROM location WHERE zip = :zip AND disabled = 0 AND (name LIKE :tag OR tags LIKE :tag) LIMIT :start, :number";
然后结果相反,它只返回名称字段匹配的行,并忽略标记字段。
有人看到这个查询有什么问题吗?当我开始开发时,它按照我在Windows上的XAMPP服务器上的预期工作,但当我将所有内容切换到我的LAMP服务器时,此查询不再正常工作。
答案 0 :(得分:1)
您可能想要更改:
tags LIKE :tag OR name LIKE :tag
到
tags LIKE ':tag' OR name LIKE ':tag'
或更改代码:
$statement->bindValue(':tag', '\'%'.$tag.'%\'', PDO::PARAM_STR);
因为表达式应该在引号中.eg名称LIKE'%john%'
答案 1 :(得分:0)
在我问过几周之后,我确实最终解决了这个问题,我认为我已经发布了我的解决方案,但我猜不是..
根据我读过的所有文件,似乎DhruvPathak的答案应该有效,但无论出于何种原因,它对我都不起作用。 相反,我有点欺骗并做到了这一点:
$query = "SELECT * FROM location WHERE zip = :zip AND disabled = 0 AND (name LIKE :tag OR tags LIKE :tag2) LIMIT :start, :number";
我没有尝试使用单个绑定值两次,而是将其分成两个变量,然后用相同的值绑定它们:
$statement->bindValue(':tag', '%'.$tag.'%', PDO::PARAM_STR);
$statement->bindValue(':tag2', '%'.$tag.'%', PDO::PARAM_STR);
如果有人真的遇到了这个问题,我希望这也能解决它。