代码之家  ›  专栏  ›  技术社区  ›  gerdemb

MySQL where子句等于anything(选择*where col=ANY\u值)

  •  19
  • gerdemb  · 技术社区  · 14 年前

    我想在MySQL中创建一个具有可选值的查询。如果指定了该值,查询将按该值过滤,如果未指定该值,则返回所有行。想法如下:

    public function doQuery($item = 'ANY_VALUE') {
      $query = "SELECT * FROM table WHERE item = ?";
      db->fetchAll($query,array($item))
      ...
    }
    
    doQuery(); // Returns everything
    doQuery($item='item1'); // Returns only rows where item = 'item1'
    

    有没有一种简单的方法可以做到这一点,而不必根据$item的值创建两个查询字符串?

    4 回复  |  直到 14 年前
        1
  •  25
  •   Pekka    14 年前

    据我所知,没有这样的“任何”占位符存在。

    如果你能用LIKE,你就能做到

    SELECT * FROM table WHERE item LIKE '%'
    

    item 像这样的条款:

    SELECT * FROM table WHERE item = ? OR 1=1
    

    这就是我所能看到的所有选项—处理两个查询,删除 WHERE

    这可能有用,但我不确定从数据库的角度看这是否是个好主意。

    public function doQuery($item = 'ANY_VALUE') {
      $query = "SELECT * FROM table WHERE item = ? OR 1 = ?";
      db->fetchAll($query,array($item, ($item == 'ANY_VALUE' ? 1 : 0))
      ...
    }
    
        2
  •  3
  •   René Höhle oasisfleeting    12 年前

    更好的方法是首先从需要处理的参数生成sql查询,然后执行。

    function doQuery($params) {
        $query = 'SELECT * FROM mytable ';
        if (is_array($params) // or whatever your condition ) { 
            $query .= 'WHERE item = ' . $params[0];
        }
        $query .= ' ;';
    
        // execute generated query
        execute($query);
    }
    
        3
  •  0
  •   Max    6 年前

    使用 $q = "... WHERE item = '$item'" 您确实可以根据$item的值创建不同的查询字符串,因此这与使用 $q = "..." . ($item=='ANY_VALUE' ? something : s_th_else);

    也就是说我看到了两到三个选择:

    • 使用 function doQuery($item = "%") { $query = "SELECT ... WHERE item LIKE '$item'"; ...}
    • 使用 function doQuery($item = NULL) { $query = "SELECT ..."; if ($item !== NULL) $query .= " WHERE item = '$item' "; ...} (其中我使用NULL允许任何其他字符串或数值作为有效的“非空”参数;如果您还想允许搜索空值(不带引号),则必须选择另一个“不可能”的默认值,例如。, [] ,并且您必须使用不带单引号的独特查询,但单引号在一般情况下非常重要),甚至:
    • function doQuery($item = NULL) { if($item === NULL) $query = "SELECT ..."; else $query = "SELECT ... WHERE item = '$item' "; ...}

    我认为第二个&第三种选择比第一种好。你应该解释为什么你想避免这些更好的解决方案。

    PS:注意不要忘记SQL中的引号,甚至要正确地转义参数中的任何特殊字符(引号,…),这些字符可能依赖于用户输入,以避免 SQL injections . 你可能热衷于寻找最短可能的解决方案(就像我一样),但忽略这些方面是不可能的:这不是一个有效的解决方案,所以它是 最短的解决方案!