繁体   English   中英

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变量用于通配符搜索位置中的四个字符匹配,例如匹配'Cincinnati'的'Cinc'。 要执行此操作,查询需要前后带%字符的通配符。

每当我直接在MYSQL中运行查询来测试它时,它都可以正常工作。 每当我在PHP代码中运行它时,通配符部分似乎不起作用。 如果我在我的例子中回显%search2,$ search2将回显%Cinc%,这是我认为它应该用于通配符搜索。 为什么通配符部分没有返回结果?

你真的生成一个看起来像的SQL搜索字符串

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."')";

语法突出显示帮助我发现它,我从查询中的“城市”中删除了单引号,它工作得很好。 它可能是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')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM