PHP 与 SQL 通配符搜索


PHP with SQL wildcard search

在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其中某处的字段。如果要搜索单个单词foobarbaz,则需要

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