【问题标题】:Dynamic Query based on mulitple GET variables (Refine Search Form)基于多个 GET 变量的动态查询(优化搜索表单)
【发布时间】:2009-09-20 23:31:38
【问题描述】:

所以我试图找到一个脚本,让我开始创建一个“优化搜索”面板,该面板将是一个表单,希望与 Ebay 目前所拥有的接近。

虽然我知道这将是一个表单并使用 GET 方法,但我找不到可以解析多个参数的 url 并动态更新查询的脚本。

如果没有一百万又一个 if 语句,我不确定如何做到这一点。 (大约 10 个左右可能的 GET 变量,但很快就会更多。)

所以我需要一个简单的:

  • foreach GET add WHERE field=GET[variable]

你知道任何现成的脚本吗?

【问题讨论】:

    标签: php mysql forms url get


    【解决方案1】:

    我不知道有什么固定脚本可以做到这一点。

    但是自己写很容易。

    <?PHP
        $valid_fields = array('field1','field2',...'fieldN');
    
        $where = "WHERE 1=1 ";
    
        foreach($valid_fields as $fname){
           if (! empty($_GET[$fname])){
              $where .= " AND $fname='" . mysql_real_escape_string($_GET[$fname]) ."'";
           }
        }
    

    此代码只是循环您预期的输入变量,如果它们作为 $_GET 中的参数传递,则在 WHERE 子句中添加一个 AND。

    然后你只需将 $where 附加到查询的末尾(不管它是什么):

    $sql = 'SELECT * FROM some_table ' . $where;
    

    编辑示例代码以隐藏列名:

    <?PHP
    //keys are parameter names in _GET, values are database column names.
    $fieldmap = array(
    'fname'=>'first_name',
    'lname'=>'last_name'
    );
    
    $where = '1=1 ';
    
    foreach($fieldmap as $get_name => $col_name){
      if (! empty($_GET[$get_name])){
        $where .= " AND $col_name = '" . mysql_real_escape_string($_GET[$get_name]) . "'";
      }
    }
    ?>
    

    【讨论】:

    • 真的非常非常好,但是这暴露了我不太满意的表名!任何机会我都可以用另一个像 $valid_fields 这样的数组来掩盖它们,所以 GET[name] 会变成 GET[whateverhere]
    • 你可以使用另一个关联数组...所以 $mask = array('url_name'=>'table_name');然后不要使用 $_GET['table_name'] 你会使用 $mask[$_GET['url_name'];
    • 哦,你有点迷路了,不太清楚如何把它放在页面上,递归数组在格式方面让我有点困惑,任何机会你都可以在答案中告诉我,所以我可以看到格式了吗?顺便感谢您的帮助!
    • 答案已编辑以执行 BraedenP 所说的(我认为或多或少)
    • 是的,应该可以。 :) 这正是我所说的。
    【解决方案2】:

    我对 PHP 几乎一无所知,但这里有一些关于检索和解析查询字符串的讨论(向下滚动一点):

    http://us2.php.net/manual/en/reserved.variables.get.php

    您可能可以从那里提取一些有用的代码来提取所有 GET 参数并使用它们来构造您的 WHERE 子句。我不确定你的数据模型是如何设置的,所以我不能提供任何详细的建议——除了清理所有输入的通常建议,这样你就不会在你的手。

    【讨论】:

      【解决方案3】:

      你的意思是这样的?

      <?php
      $query = "SELECT [WHATEVER YOU'RE SELECTING] FROM your_table WHERE ";
      $length = count($_GET);
      $count = 0;
      foreach($_GET as $key => $value){
          if($count <= $length){
              $query .= "$key='{$value}' OR ";
          }else{
              $query .= "$key='{$value}'";
          }
      
          $count++;
      }
      ?>
      

      这将遍历您的 $_GET 数组,将 key='value' 类型的字符串添加到查询字符串中。然后,一旦你完成了对数组的递归,你就可以对完整的查询字符串做任何你想做的事情。

      像往常一样,在收集输入时使用标准的清理功能(strip_slashes、mysql_real_escape_string 等)

      【讨论】:

      • 我回答的最后一句话明确指出我没有包含任何消毒功能。
      • 嘎。对于那个很抱歉。进行另一次编辑,以便我可以删除反对票。
      猜你喜欢
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多