我的网站上有一个搜索栏,我在这个用户的帮助下使用谷歌地方api自动完成服务可以插入城市,州,国家,地址,邮政编码。我在mysql数据库中的字段是国家,州,城市,地址,邮政编码。我正在使用mysql LIKE子句来搜索记录。我的查询是:
{{1}}
我试图从搜索字符串中删除逗号,但没有运气。如果我只插入国家或仅城市或仅插入州或地址或仅邮政编码,那么它会给出正确的结果但是当我搜索地址,城市,州,国家或地区时改变它不起作用的顺序请帮助我。提前谢谢。
答案 0 :(得分:1)
注意空格和引号。试试这样:
$sql = "SELECT *
FROM location
WHERE country LIKE '%$search%'
OR city LIKE '%$search%'
OR state LIKE '%$search%'
OR address LIKE '%$search%'
OR zipcode LIKE '%$search%'";
答案 1 :(得分:0)
您正在尝试使用LIKE语句获取记录,尝试连接这样的字段:
$sql = "SELECT * FROM location WHERE CONCAT(country, ' ', state, ' ',city, ' ', address, ' ', zip_code) like '%" . $search . "%'";
如果您想获得更好的结果,可以使用 PHP function explode ,如下所示:
$words = explode(' ', $search);
$i = 0;
foreach($words as $p) {
if ($i == 0) {
$sql_aux = $sql_aux . "CONCAT(country, ' ', state, ' ',city, ' ', address, ' ', zip_code) like '%" . $p . "%'";
}
elseif($i > 0) {
$sql_aux = $sql_aux . "and CONCAT(country, ' ', state, ' ',city, ' ', address, ' ', zip_code) like '%" . $p . "%'";
}
$i++;
}
答案 2 :(得分:0)
这不是问题,只能在SQL中解决。
重要的注意事项:阅读SQL注入。在任何情况下,都不应该通过将变量直接连接到其中来构建查询。
您要做的是 - 如果您从数据库的角度停下来查看它 - 请求数据库读取表格的每一行并搜索可能的匹配项。
即使它有效,它也不会很好用,除非你有一个非常小的数据集,因为每个查询都必须读取整个表。
但是,你的比较是倒退的。
你可能真的不想评价这个:
city LIKE '%$string%'
state LIKE '%$string%'
'Houston' LIKE '%Houston, TX%' # false!
'TX' LIKE '%Houston, TX%' # also false!
当您考虑您的查询要求服务器执行的操作时,您的逻辑似乎不起作用。 LIKE
的论点在任何意义上都不是可交换的。
您实际上想要找到的更像是 this :
'$string' LIKE CONCAT('%',city,'%')
'$string' LIKE CONCAT('%',state,'%')
'Houston, TX' LIKE '%Houston%' # true!
'Houston, TX' LIKE '%TX%' # also true!
您实际上需要反转比较以使查询在逻辑上正确。
但是,对于较大的数据集,逻辑上的正确性仍然会非常糟糕,因为服务器必须完成很多工作,并且不能使用查询优化器通常可用的任何快捷方式。这是一种蛮力方法,基本上是最糟糕的方法。
正确的解决方案要复杂得多:您必须对应用程序中的地址进行标记,并进行智能查询,这将是一个完全不同的查询,具体取决于搜索框内容中的模式。一旦确定了您认为的内容,例如状态,您的WHERE
子句应该是特定的,并且是左侧锚定的:
WHERE state LIKE CONCAT($parsed_state,'%')
如果可以避免,则不要在LIKE参数的开头使用%
。如果您希望具有合理的性能并且可能能够利用列上的索引,则仅在最后使用它们。
对自由格式地址进行标记,即使是“完整”地址,也不是一件容易的事。例如,请参阅How to parse freeform street/postal address out of text, and into components