【问题标题】:PHP with SQL wildcard search带有 SQL 通配符搜索的 PHP
【发布时间】:2014-05-20 02:25:05
【问题描述】:

在 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”匹配“Cincinnati”。为此,查询需要一个通配符,前后都带有 % 字符。

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

【问题讨论】:

  • 你能输出完整的查询吗?
  • 您在哪里获取查询?比如query 函数中有 fetchAll 吗?
  • 可能是query 函数正在清理您的查询字符串

标签: php mysql


【解决方案1】:

试试这个 -

$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】:

    您实际上是在生成一个看起来像这样的 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')
    

    在哪里

    【讨论】:

      【解决方案3】:

      语法高亮帮助我发现了它,我从查询中的“城市”中删除了单引号,它运行良好。可能是 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')
      

      【讨论】:

        猜你喜欢
        • 2011-01-19
        • 1970-01-01
        • 1970-01-01
        • 2016-04-17
        • 2012-08-01
        • 2011-07-14
        • 1970-01-01
        • 1970-01-01
        • 2018-05-15
        相关资源
        最近更新 更多