【问题标题】:Building an SQL query using multiple (optional) search fields使用多个(可选)搜索字段构建 SQL 查询
【发布时间】:2010-09-22 15:40:27
【问题描述】:

我有一个表格,用于搜索支持票证表。

用户可以从一些困难的可选字段中进行搜索。

  • 日期(到/从)
  • 工单状态
  • 工程师
  • 票务联系方式

我想知道处理可选搜索过滤器的最佳方法是什么。所以我有一个从用户那里接受参数的查询。因此,如果用户同时使用 from 和 to 日期进行搜索,则查询将希望包含 BETWEEN。因此,如果用户仅搜索 from,我是否必须编写不同的查询。或者当用户没有添加任何日期参数时的另一个查询?那么如果状态下拉列表是空白的呢?这是另一个查询吗?

任何帮助解决这个问题都会很棒!

琼斯

【问题讨论】:

    标签: php forms search


    【解决方案1】:

    分部分构建您的查询。从查询中的常量开始,然后根据额外条件添加更多 SQL:

    $query = "SELECT ...
      FROM ...
      WHERE [where conditions that are always going to be present]";
    
    if (isset($_POST['date_from']) && isset($_POST['date_to']))
    {
      $query .= ... // query code for dealing with dates
    }
    
    if (isset($_POST['status']))
    {
      $query .= ... // deal with status
    }
    
    // etc.
    
    // Once you have your query fully built, execute it
    $result_set = mysql_query($query);
    

    这段代码显然只是一个框架,但这就是我构建查询的方式。

    【讨论】:

    • 抱歉回复晚了,谢谢。正是我需要的。我在一个类中处理我的所有 SQL,所以我想将变量传递给类使用这种方法的最佳方法是什么?
    【解决方案2】:

    如果不知道您使用的是哪种 DB 抽象,很难说,但假设您是手写 SQL,这相当简单,只需为每个变量单独构建 where 子句的部分即可。 (假设您的变量已经被转义/引用。)

    $where_clause = array();
    if (!empty($date_from)) {
        $where_clause[] = "table.date >= $date_from";
    }
    if (!empty($date_to)) {
        $where_clause[] = "table.date <= $date_to";
    }
    if (!empty($status)) {
        $where_clause[] = "status = $status";
    }
    
    $query = 'select * from table where ' . join(' and ', $where_clause);
    

    【讨论】:

      【解决方案3】:

      这是一种我经常使用的优雅方式,希望对您也有帮助:

      $q = 'SELECT * FROM Users';
      $buildQ = array();
      
      if (empty($idOrName) === false) {
          $buildQ[] = '(userid = "' . $idOrName . '" OR username LIKE "%' . $idOrName. '%")';
      }
      
      if (empty($nickname) === false) {
          $buildQ[] = 'nickname="' . $nickname . '"';
      }
      
      if (empty($salary) === false) {
          $buildQ[] = 'salary="' . $salary . '"';
      }
      
      // ... any other criterias like above if statements
      
      if (count($buildQ) === 1) {
          $q .= ' WHERE ' . $buildQ[0];
      } else if (count($buildQ) > 1) {
          $count = 0;
          foreach ($buildQ as $query) {
              if ($count === 0) {
                  $q .= ' WHERE ' . $query;
              } else {
                  $q .= ' AND ' . $query;
              }
      
              $count++;
          }
      }
      

      【讨论】:

        【解决方案4】:

        我认为如果您在运行时根据填充的字段动态生成查询会更好。因此,如果只传递了一个日期而另一个日期为空,或者两者都传递了等等,您可以制作一些辅助程序来附加特定的查询片段。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-10-01
          • 2010-09-24
          • 1970-01-01
          • 2022-01-09
          • 1970-01-01
          • 2016-05-10
          • 1970-01-01
          • 2015-09-15
          相关资源
          最近更新 更多