【问题标题】:How to filter based on two arguments from php, in a SQL database如何在 SQL 数据库中根据来自 php 的两个参数进行过滤
【发布时间】:2015-10-25 14:07:45
【问题描述】:

我有一个 MySQL 数据库,我需要使用的表有 9 列信息。我的目标是能够根据两个参数进行过滤。例如,该表是关于学生的,因此它包含名字、姓氏、身份证、他们注册的课程、状态、职业年龄和另外两个不那么重要的字段的数据。我需要能够根据学生的状态和/或课程进行过滤。

到目前为止,我设法完成了 php 工作,使用表单和选择标记,根据状态进行过滤,但我不知道如何添加第二部分。完成的事情应该能够过滤,仅基于状态,仅基于课程,或基于所选状态和课程。代码如下所示:

if (isset($_POST['filter'])) {
        $search_term = mysqli_real_escape_string($conn, $_POST['filter_status']);
        $q .= " WHERE status = '$search_term'";
    }
    echo $q;
<form method="POST" action="index.php">
    <select name="filter_status" > 
        <option value="confirmed">confirmed</option>
        <option value="declined">declined</option>
        <option value="rejected">rejected</option>
        <option value="pending">pending</option>
        <option value="unconfirmed">unconfirmed</option>
    </select>
    <input type="submit" name="filter">
</form>

这可以正常工作,第二个条件我第二次使用它,但它们不能一起工作。

【问题讨论】:

    标签: php html mysql sql forms


    【解决方案1】:

    WHERE 之后的查询中使用术语ANDOR

    WHERE status = '$search_term' AND course = '$something'
    

    【讨论】:

    • 它必须是 AND 和 OR。必须有一个选项,用户可以根据状态和课程进行过滤,此外,他必须能够仅根据一个进行过滤,所以它必须是 AND 和 OR。在想,如果我有两个查询,并且表单数据在 if 语句中,如果一个选择字段为空,则只需使用第二个字段中的数据,如果两者都选择了数据,则像您说的那样过滤,同时查询和AND 在查询的 WHERE 语句中,但我不知道这是否可行。
    【解决方案2】:

    尝试改变,

    $q .= " WHERE status = '$search_term'";
    

    $q .= " WHERE CONCAT_WS(',',status,course) like %'$search_term'%";
    

    您可以在课程结束后添加任意数量的列。

    【讨论】:

    • 这看起来很棒。但是我必须有 2 个包含 2 列的下拉列表,第二个列表是否也应该输出到 $search_term?
    • 只需添加另一个 like %'$search_term'%" 部分,例如AND like %'$search_term_2'%" 用于您的第二个列表,但您可以随意命名
    • 或者如果你想一次允许一个过滤器使用OR like %'$search_term_2'%"
    【解决方案3】:

    $filter_status = $_POST['filter_status']; $course = $_POST['course']; $where = 'WHERE 1'; $where .= $filter_status ? " AND status = {$filter_status}" : ''; $where .= $course ? " AND course = {$course}" : '';

    你是这个意思吗?当用户选择 course 和 filter_status 使用这两个条件时,另一方面使用正在选择的条件之一。

    WHERE 1 将始终为TRUE,因此它后面可以跟AND 语句

    【讨论】:

    • 是的,我想是的。用户必须能够仅选择一个过滤器,例如按状态过滤或按课程过滤,或者能够同时选择两者。我在表格中添加了空白字段,您在上面写的内容应该完成了图片。现在测试它。感谢您的意见。
    【解决方案4】:

    感谢大家的意见。它帮助我朝着正确的方向前进。最终完成我需要的代码如下。它不是很优雅,但做得很好:

    $q = "SELECT *
    FROM students";
    
    if (isset($_POST['filter'])) {
        if ($_POST['filter_status'] == null) {
        $search_term2 = mysqli_real_escape_string($conn, $_POST['filter_course']);
        $q .= " WHERE course = '$search_term2'";
    } elseif ($_POST['filter_course'] == null) {
        $search_term = mysqli_real_escape_string($conn, $_POST['filter_status']);
        $q .= " WHERE status = '$search_term'";
    } else {
        $search_term = mysqli_real_escape_string($conn, $_POST['filter_status']);
        $search_term2 = mysqli_real_escape_string($conn, $_POST['filter_course']);
        $q .= " WHERE status = '$search_term' AND course = '$search_term2'";
    }
    
    }
    

    还有形式:

    <form method="POST" action="index.php">
        <select name="filter_status" > 
            <option value= ""></option>
            <option value="confirmed">confirmed</option>
            <option value="declined">declined</option>
            <option value="rejected">rejected</option>
            <option value="pending">pending</option>
            <option value="unconfirmed">unconfirmed</option>
        </select>
    
        <select name="filter_course">
        <option value= ""></option> 
            <option value="php">php</option>
            <option value="java">java</option>
        </select>
        <input type="submit" name="filter">
    </form>
    

    【讨论】:

      猜你喜欢
      • 2019-04-02
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      相关资源
      最近更新 更多