PHP中的多个Checkbox过滤器

时间:2013-04-20 18:36:14

标签: php sql filter checkbox

我一直试图解决这个问题,但是我没有随处可见。我已经阅读了很多此处和互联网上发布的其他问题,但我无法找到解决方案。特别是在使用多个复选框的情况下。

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

在页面上,我有一个人员列表及其对应的位置,我使用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范围内实现这一目标。

3 个答案:

答案 0 :(得分: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']);

答案 1 :(得分:0)

做这样的事情

where p_location in (the values for your checkboxes)

答案 2 :(得分:0)

尝试这种方式:

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']);
}