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

使用php/mysql正确过滤并选择框

  •  2
  • Dodinas  · 技术社区  · 15 年前

    我目前在MySQL中有一个大表,有几个字段。我目前正试图允许用户通过选择框按每个字段进行筛选。

    我有四个领域:学校、部门和州。

    使用PHP,我对如何根据用户在选择框中选择的选项进行筛选没有问题。

    例如,如果提交了这3个:

    <select id="school">
     <option value="13">John Brown School</option>
    </select>
    
    <select id="division">
     <option value="I">I</option>
    </select>
    
    <select id="state">
     <option value="NY">New York</option>
    </select>
    

    我可以根据每个选项进行查询,比如:

    $school= $_POST['school'];
    $division= $_POST['division'];
    $state = $_POST['state'];
    
    Query: SELECT * from table WHERE school=$school AND division=$division and state=$state
    

    但是,如果我想要一个“全部”选项(在选择框中),我将如何在查询或WHERE子句中实现这个选项,以便它不过滤那个特定的字段?

    2 回复  |  直到 15 年前
        1
  •  4
  •   zombat    15 年前

    你只需做出一个你特别想要的选择。事实上,在这种情况下,最好的选择是让您的选择框有一个“全部”选项,或者将它们留空。空白选项可以是默认值。我会把它设置为:

    <option value="">-- All schools --</option>
     etc.
    

    现在,在设置查询变量时,可以执行以下操作:

    $whereClauses = array();
    if (! empty($_POST['school'])) $whereClauses[] = 'school='.mysql_real_escape_string($_POST['school']);
    if (! empty($_POST['division'])) $whereClauses[] ='division='.mysql_real_escape_string($_POST['division']);
    if (! empty($_POST['state'])) $whereClauses[] = 'state='.mysql_real_escape_string($_POST['state']);
    
    $where = '';
    if (count($whereClauses) > 0) {
        $where = 'WHERE '.implode(' AND ',$whereClauses);
    }
    
    $query = "SELECT * FROM table ".$where;
    

    现在,如果用空白值选择任何选择选项(例如,使用ALL),它们将不是WHERE子句的一部分。

    如果您不避开传入的$\u post数据,那么您也会受到SQL注入攻击,因此您需要做的一件事是运行 mysql_real_escape_string() 关于您的$_post值,我将其添加到示例中。听起来你已经意识到了。

        2
  •  1
  •   Eli    15 年前

    不考虑SQL注入等,这里是一种方法的基本逻辑。PSUDO代码或课程。

    <select id="select1">
        <option value="">All</option>
        <option value="value1">Value1</option>
        ...
    </select>
    
    
    
    $sql = "select ... from ... where 1 = 1 ";
    
    if ( !empty($_POST["select_1"]) ) {
        $sql .=" and field1 = select1value";
    }
    
    if ( !empty($_POST["select_2"]) ) {
        $sql .=" and field2 = select2value";
    }
    
    if ( !empty($_POST["select_one"]) ) {
        $sql .=" and field3 = select3value";
    }
    
    // Etc.
    

    这样,在1=1的情况下,您就不必担心是否要追加/预先追加“和”基于它们中的一部分或全部是否存在。默认情况下,选择“全部”(空选择值),并根据每个选择的存在进行筛选。

    当然,您需要清理一点,保护它,将值放入变量等,但这是基本逻辑。