在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,$search 2 将回显 %Cinc%,我认为它应该是通配符搜索。为什么通配符部分没有返回结果?
您实际上是在生成一个看起来像
WHERE something LIKE '%foobarbaz%'
这将仅匹配字段实际上包含确切字符串foobarbaz
其中某处的字段。如果要搜索单个单词foo
、bar
和baz
,则需要
WHERE something like '%foo%' OR something like '%bar%' OR something LIKE '%baz%'
对于多个单词,这很快就会变得非常丑陋,并且使用%..%
通配符也会阻止使用索引,这意味着您的查询每次执行时都会强制进行全表扫描。
您可能应该考虑使用 FULLTEXT 索引,这也将减少您的查询
WHERE MATCH (something) AGAINST ('foo bar baz')
哪里
试试这个 -
$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."')";
语法
突出显示帮助我发现了它,我从查询中的"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')