【问题标题】:PHP mysql - ...AND column='anything'...?PHP mysql - ...AND column='anything'...?
【发布时间】:2011-02-23 05:37:40
【问题描述】:

有什么方法可以检查列是否为“任何内容”?原因是我有一个搜索功能,它从 URL 中获取一个 ID,然后它通过 sql 算法传递它并显示结果。但是如果那个 URL “function” (?) 没有填写,它只会搜索:

...AND column=''...

这根本不会返回任何结果。我试过使用“%”,但没有任何作用。

有什么想法吗?

这是查询:

mysql_query("SELECT * FROM filer 
             WHERE real_name LIKE '%$searchString%' 
                   AND public='1' AND ikon='$tab' 
                   OR filinfo LIKE '%$searchString%' 
                   AND public='1' 
                   AND ikon='$tab' 
             ORDER BY rank DESC, kommentarer DESC");

问题是“ikon=''”...

【问题讨论】:

  • 您的查询已经错了。在不带括号的情况下混合 AND 和 OR 会带来错误的结果
  • 小心 SQL 注入攻击 - 确保您转义了查询中的变量。另见:en.wikipedia.org/wiki/SQL_injection
  • 我不知道,但它就像我现在想要的那样工作。而且我没有看到任何改变它的区别。

标签: php mysql search url function


【解决方案1】:

and ikon like '%' 将检查包含“任何东西”的列。请注意,like 也可用于与没有通配符的文字字符串进行比较,因此,如果您将 SQL 的该部分更改为使用 like,那么您可以将变量预先设置为 '%' 并全部设置。

但是,正如下面其他人提到的,请注意 SQL 注入攻击。我始终强烈建议人们使用mysqli 并准备好查询,而不是依赖mysql_real_escape_string()

【讨论】:

    【解决方案2】:

    您可以动态创建查询,例如:

    $query = "SELECT * FROM table WHERE foo='bar'";
    
    if(isset($_GET['id'])) {
        $query .= " AND column='" . mysql_real_escape_string($_GET['id']) . "'";
    }
    

    更新:更新代码以更接近 OP 的问题。

    【讨论】:

    • 问题中AND 的存在意味着他总是想要一个WHERE 子句,但其中一个子句应该是可选的。
    • @Mark Byers:是的,我知道。这只是一个例子,我认为它可以很容易地适应使用AND。它应该给出正确的想法。 (无论如何,更新了我的例子......)
    • 这是个好主意!我会记住这一点以备将来使用。然而这一次,我认为这不是一个好主意。
    【解决方案3】:

    试试这个:

    AND ('$tab' = '' OR ikon = '$tab')
    

    如果给出空字符串,则条件总是成功。

    或者,您可以从 PHP 构建两个不同的查询,具体取决于 $id 是否为空。

    【讨论】:

    • 仍然没有结果。在传入 URL 变量之前,我检查它是否已设置,如果没有,我将其设置为“”。这与以下内容相同:AND column='something' OR column='',对吗?好吧,仍然无法正常工作。 ://
    • @Nike:不,不一样。你需要括号。
    • 好吧,它仍然给我同样的结果。
    • @Nike:你输入的是column=''而不是'$id' = ''
    • 其实应该是"ikon=''"而不是ID。
    【解决方案4】:

    如果通过将搜索字符串包装在if-else 条件中来提供搜索字符串,则运行您的查询:

    $id = (int) $_GET['id'];
    
    if ($id)
    {
      // run query
    }
    else
    {
      // echo oops
    }
    

    【讨论】:

    • 是的,我可以这样做,我已经考虑过了,但我不想让代码过于混乱。有没有办法只检查它是否是*?
    【解决方案5】:

    无法检查列是否为“任何内容”
    将所有值包含到查询结果中的方法是从查询中排除此字段。
    但您始终可以动态构建查询。
    只是一个小例子:

    $w=array();
    if (!empty($_GET['rooms'])) $w[]="rooms='".mysql_real_escape_string($_GET['rooms'])."'";
    if (!empty($_GET['space'])) $w[]="space='".mysql_real_escape_string($_GET['space'])."'";
    if (!empty($_GET['max_price'])) $w[]="price < '".mysql_real_escape_string($_GET['max_price'])."'";
    
    
    if (count($w)) $where="WHERE ".implode(' AND ',$w); else $where='';
    $query="select * from table $where";
    

    您的查询非常简单:

    $ikon="";
    if ($id) $ikon = "AND ikon='$tab'";
    mysql_query("SELECT * FROM filer 
                 WHERE (real_name LIKE '%$searchString%' 
                       OR filinfo LIKE '%$searchString%')
                       AND public='1' 
                       $ikon 
                 ORDER BY rank DESC, kommentarer DESC");
    

    我希望你已经把所有的字符串都转义了

    【讨论】:

    • 你能解释一下最后一个 IF 语句的实际作用吗?
    • @Nike 适用于未通过任何标准的情况。
    • 啊啊,突然间一切对我来说都变得更有意义了! :) 然而,这也会使代码混乱。如果没有更简单的方法,我想我会用一个简单的 if 语句。 if(isset($_GET['foo'])){query..}else {另一个查询...}
    • 哦,看起来即使是非常简单的代码对您来说也显得“杂乱无章”。下次我会写慢一点。
    • 月经来了还是怎么了?没必要写 6 行代码来完成我只用几句话就能完成的事情。
    【解决方案6】:

    我认为您正在从变量中添加值。变量来了,你需要用它做点什么——在里面硬编码一个“OR 1 = 1”部分已经太晚了。您需要了解 LIKE 不是它听起来的样子(仅部分匹配) - 它也完全匹配。不需要“字段=任何东西”:

    • {field LIKE '%'} 将为您提供一切
    • {field LIKE 'specific_value'} 只会为您提供该值 - 它不像听起来那样是部分匹配。

    使用 'specific_value%' 或 '%specific_value' 将开始进行部分匹配。因此,当您有一个可能是 '%' 的变量传入时, LIKE 应该做所有您需要的事情,以获取您想要完全匹配的所有内容或特定值。这就是我所期望的搜索过滤行为通常会发生的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-15
      • 2022-12-27
      • 2020-01-19
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      • 2018-02-24
      相关资源
      最近更新 更多