MySQL问题与'赞'查询

时间:2011-09-13 05:27:12

标签: php mysql sql-like

我的查询存在问题,其中包含“喜欢”声明。

这是我的代码:

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服务器时,此查询不再正常工作。

2 个答案:

答案 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);

如果有人真的遇到了这个问题,我希望这也能解决它。