在PHP中,我有一个函数来返回搜索表单的结果。
function search($search) {
global $database;
$search2 = ( '%' . $search[0] . $search[1] . $search[2] . $search[3] . '%' );
$q1 = "SELECT * FROM location WHERE is_approved = 1
AND (city LIKE '$search'
OR state LIKE '$search'
OR state LIKE '$search2'
OR 'city' LIKE '$search2')";
$matches = $database ->query($q1);
return $matches;
}
search2变量用于通配符搜索位置中的四个字符匹配,例如' Cinc'匹配'辛辛那提'。要执行此操作,查询需要带有前后字符%的通配符。
每当我直接在MYSQL中运行查询来测试它时,它都可以正常工作。每当我在PHP代码中运行它时,通配符部分似乎都不起作用。如果我在我的例子中回显%search2,$ search2将回显%Cinc%,这是我认为它应该用于通配符搜索。为什么没有为通配符部分返回结果?
答案 0 :(得分:2)
您实际上生成了一个类似于
的SQL搜索字符串WHERE something LIKE '%foobarbaz%'
这将仅匹配字段中字段在其中某处包含确切字符串foobarbaz
的字段。如果您要搜索单个字foo
,bar
和baz
,则需要
WHERE something like '%foo%' OR something like '%bar%' OR something LIKE '%baz%'
对于多个单词,这会变得非常难看,并且使用%..%
通配符也会阻止使用索引,这意味着每次执行时您的查询都会强制进行全表扫描。
您应该考虑使用FULLTEXT index代替,这也会减少您的查询
WHERE MATCH (something) AGAINST ('foo bar baz')
在哪里
答案 1 :(得分:0)
试试这个 -
$search2 = '%'.$search[0],$search[1],$search[2],$search[3].'%';
$q1 = "SELECT * FROM location WHERE is_approved = 1
AND (city LIKE '".$search."'
OR state LIKE '".$search."'
OR state LIKE '".$search2."'
OR city LIKE '".$search2."')";
答案 2 :(得分:0)
语法突出显示帮助我发现它并删除了来自' city'的单引号。在查询中,它工作得很好。它可能是PHP解析单引号。
原始查询
SELECT * FROM tournaments
WHERE is_approved = 1
AND (city LIKE '$search'
OR state LIKE '$search'
OR state LIKE '$search2'
OR 'city' LIKE '$search2')
而不是
SELECT * FROM tournaments
WHERE is_approved = 1
AND (city LIKE '$search'
OR state LIKE '$search'
OR state LIKE '$search2'
OR city LIKE '$search2')