【问题标题】:Multiple Checkbox Filter in PHPPHP中的多个复选框过滤器
【发布时间】:2013-04-13 23:32:00
【问题描述】:

我一直试图解决这个问题,但没有得到任何结果。我已经阅读了这里和互联网上发布的许多其他问题,但无法找到解决方案。特别是在使用多个复选框的情况下。

请耐心等待我试图解释我面临的问题。

在一个页面上,我有一个人员列表及其相应位置,我使用 php/sql 从数据库中提取该列表。我想要实现的是能够使用复选框根据位置过滤列表。

这是我目前用于复选框的代码。

<ul>
    <li><input type="checkbox" name="check_list[]" value="sydney">Sydney</li>
    <li><input type="checkbox" name="check_list[]" value="durban">Durban</li>
    <li><input type="checkbox" name="check_list[]" value="delhi">Delhi</li>
    <li><input type="checkbox" name="check_list[]" value="cairo">Cairo</li>
    <li><input type="checkbox" name="check_list[]" value="madrid">Madrid</li>
    <li><input type="submit"></li>
</ul>

这是我用来检查复选框是否被选中并相应地修改 SQL 查询的代码

if (empty ($_POST['check_list'])) {

    $SQLquery = 'SELECT * FROM `people`';
    $query = $conn->query($SQLquery);

} elseif (!empty($_POST['check_list'])) {

    foreach($_POST['check_list'] as $check)

    $location = $check;

    $query = $conn->prepare('SELECT * FROM `people` WHERE `p_location` = :location');
    $query->execute(array('location' => $location));

}

现在,当仅选中一个复选框时,此代码可以正常工作。但是,当检查多个复选框时,此失败。它什么也没显示。

我知道我可以使用OR 运算符修改 SQL 查询以添加其他位置,如下所示:

$query = $conn->prepare('SELECT * FROM `people` WHERE `p_location` = 'Delhi' OR `p_location` = 'Madrid')

但是,我无法弄清楚如何首先检查选中了哪些复选框,然后以一种在选择多个城市时过滤结果的方式创建 SQL 语句。

我也想知道这是否是实现此类目标的最佳方式。我对在 php/sql 范围内实现这一目标的替代方法持开放态度。

【问题讨论】:

    标签: php sql filter checkbox


    【解决方案1】:

    未经测试,但应该让您知道应该做什么。

    答案已修改!

    $markers = str_repeat('?, ', count($_POST['check_list']) - 1) . '?';
    
    $query = $conn->prepare('SELECT * FROM `people` WHERE `p_location` IN (' . $markers . ')');
    $query->execute($_POST['check_list']);
    

    【讨论】:

    • 你真的可以像那样绑定内爆值吗?您在要绑定的值中添加了一部分 SQL 语法,我不确定它是否有效,而且看起来很脏,imo。
    • 根本没想过。必须做一些谷歌搜索。 ;)
    • @Damiqib 您好,感谢您的快速回复。我尝试实现这一点,但徒劳无功。它在选择单个复选框时有效,但在有多个选择时失败。
    • @indrago 更改了我的答案,请重新测试。
    • @Damiqib 嘿!谢谢!这正是我想要的。非常感谢您花时间解决我的问题。你太棒了!
    【解决方案2】:

    试试这个方法:

    if (empty ($_POST['check_list'])) {
    
        $SQLquery = 'SELECT * FROM `people`';
        $query = $conn->query($SQLquery);
    
    } else if (!empty($_POST['check_list'])) {
        $params = implode(",", array_fill(0, count($_POST['check_list']), "?"));
    
        $sql = 'SELECT * FROM `people` WHERE `p_location` IN ($params)';
    
        $stmt   = $conn->prepare($sql);
    
        $stmt->execute($_POST['check_list']);
    }
    

    【讨论】:

    • 您好,感谢您的回复。但是,这似乎不起作用。这是我得到的错误 - Warning: call_user_func_array() expects parameter 1 to be a valid callback, class 'PDOStatement' does not have a method 'bindparams'
    • @GDB 感谢您编辑代码。我试过了它仍然无法正常工作。但是,下面 Damiqib 提供的解决方案有效。无论如何,感谢您付出的努力并试图帮助我。非常感谢。
    【解决方案3】:

    做这样的事情

    where p_location in (the values for your checkboxes)
    

    【讨论】:

    • 我实际上是 php 新手,无法自己解决。当仅选中一个复选框时,我可以实施您建议的解决方案。但是,我不知道如何为多项选择做同样的事情
    • 其实他的意思是这样的: where p_location in ('a','b','c') 。您可能希望使用 php join() 函数来获得一个好的逗号分隔列表。
    猜你喜欢
    • 2017-01-16
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    相关资源
    最近更新 更多