PHP使用SQL通配符搜索

时间:2014-04-07 17:34:32

标签: php mysql

在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%,这是我认为它应该用于通配符搜索。为什么没有为通配符部分返回结果?

3 个答案:

答案 0 :(得分:2)

您实际上生成了一个类似于

的SQL搜索字符串
WHERE something LIKE '%foobarbaz%'

这将仅匹配字段中字段在其中某处包含确切字符串foobarbaz的字段。如果您要搜索单个字foobarbaz,则需要

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