【问题标题】:sql checkbox and mulit select filteringsql 复选框和多选过滤
【发布时间】:2015-12-14 04:52:59
【问题描述】:

我在运行搜索时过滤我的用户时遇到了一些问题。 必须可以选择多个地区和性别。 性别是复选框,区域是多选选择器。

在我的项目中,所有内容都是动态的,但这里展示的内容太多了。

形式:

<form action="" method="get">

    <input type="checkbox" name="gender[]" value="1"> <!-- male -->
    <input type="checkbox" name="gender[]" value="2"> <!-- female -->

    <select name="region[]" multiple>

        <option value="1">North</option>
        <option value="2">East</option>
        <option value="3">West</option>
        <option value="4">South</option>

    </select>

    <input type="submit" name="submitSearch" value="Filter">
</form>

过滤功能:

<?php

    if(isset($_GET['submitSearch']){
        user_filter($db);
    }

    function user_filter($db){

        $gender = $_GET['gender'];
        $region = $_GET['region'];

        $sql = "SELECT name, region, img FROM users WHERE true $gender AND $region";
        $stmt = $db->prepare($sql);
        $stmt->execute();
        $res = $stmt->fetchAll();
        return $res;

    }

?>

不确定我是否对数组进行了循环,如果没有设置,则 WHERE true 存在问题

希望有人可以帮助我 谢谢

【问题讨论】:

    标签: php mysql search checkbox filter


    【解决方案1】:

    像这样改变你的代码

    if(isset($_GET['submitSearch']){
        user_filter($db);
    }
    
    function user_filter($db){
    
        $gender = implode(",",$_GET['gender']); //Change array to comma separated string so easy to pass in mysql using IN keyword
        $region = implode(",",$_GET['region']);
    
        $sql = "SELECT name, region, img FROM users WHERE gender IN($gender) AND region IN ($region)";
        $stmt = $db->prepare($sql);
        $stmt->execute();
        $res = $stmt->fetchAll();
        return $res;
    
    }
    

    更新了条件代码

    function user_filter($db){
    
            if(isset($_GET['gender']) && $_GET['gender'] !=''){
                $gender = implode(",",$_GET['gender']); //Change array to comma separated string so easy to pass in mysql using IN keyword
            }
            if(isset($_GET['region']) && $_GET['region'] !=''){
                $region = implode(",",$_GET['region']);
            }
    
    
            $genderSql = "";
            $regionSql = "";
            $where = "";
    
            $sql = '';
            $sql .="SELECT name, region, img FROM users";
    
            if(isset($_GET['gender']) && $_GET['gender'] !=''){
                $genderSql =" gender IN($gender)"; //Note Space at start 
            }
    
            if(isset($_GET['region']) && $_GET['region'] !=''){
                if(isset($_GET['gender']) && $_GET['gender'] !=''){
                    $regionSql =" AND region IN ($region)"; //Note Space at start 
                } else {
                    $regionSql =" region IN ($region)"; //Note Space at start 
                }
            }
    
    
            if((isset($_GET['gender']) && $_GET['gender'] !='') || (isset($_GET['region']) && $_GET['region'] !='')){
                $where =" Where";
                $sql .=$where.$genderSql.$regionSql;
            }
    
    
            $stmt = $db->prepare($sql);
            $stmt->execute();
            $res = $stmt->fetchAll();
            return $res;
    
        }
    

    【讨论】:

    • 谢谢,但如果没有设置,现在会出现问题,请参阅我忘记告诉我在搜索完成之前显示所有用户
    • 首先让我澄清两件事(1)如果没有选择性别和宗教,那么所有记录(2)两者将一起选择,也可以单独选择。
    • 抱歉不清楚。是的,首先我要显示所有记录(用户),如果只单击性别,则显示性别是男性或女性或两者兼而有之的用户。如果还设置了区域,则显示区域/区域和性别是已设置的。说得通?谢谢,已经帮了我很多:)
    • @user3426191 查看我的更新答案。请检查所有可能的情况,如果您有任何疑问,请告诉我
    • 非常感谢,它完成了这项工作,而且比我想象的要复杂得多
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 2010-09-29
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    相关资源
    最近更新 更多