2011-09-13 120 views
0

我遇到了包含'like'语句的查询问题。与'Like'查询相关的MySQL问题

这里是我的代码:

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; 
} 

我期待查询返回在标签匹配无论是“名”或“标签”字段的行,而是它只会返回行,其中标签匹配。

如果我切换查询:

$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

请[不要添加签名或标语到您的帖子](http://stackoverflow.com/faq#signatures)。 – meagar

回答

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

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

1

您可能需要更改:

tags LIKE :tag OR name LIKE :tag 

tags LIKE ':tag' OR name LIKE ':tag' 

或更改您的代码:

$statement->bindValue(':tag', '\'%'.$tag.'%\'', PDO::PARAM_STR); 

像表达应该b E在引号.eg名LIKE“%约翰%”

+0

我刚刚尝试了这两种解决方案,但现在似乎没有返回任何行,但是当我从mysql命令行运行以下命令时: 'select * from zipource = 92346和disabled = 0,名称像'%Am%'或标签''%Am'');' 它能够返回这两个字段,所以绑定不会翻译成该命令。 – OrangeGrover