dtsfnyay300457 2015-05-04 12:36
浏览 45
已采纳

使用选项编写PHP / MYSQL搜索的最佳方法[关闭]

So I am building a search form which has a lot of options for users to select from. As you can see from the image below a user selects a search criteria and it allows them to enter or check what they like. If this is unticked it removes all values/unchecks all the boxes.

I originally only had weight/height/gender as the search but since then have added more.

I already coded the weight/height/gender search options and it ended being a lot of if statements checking what was selected/null then creating the appropriate MYSQL queries.

I am not entirely sure how I should go about (if I should start again) with the rest of the options. Is there an easier away around this? I just need some direction so I can make this a bit more effective.

Thanks!

enter image description here

enter image description here

require 'functions.php';
    
    //Search data
    //$weight_min = $_POST['weight_min'];
    //$weight_max = $_POST['weight_max'];
    //$height_min = $_POST['height_min'];   
    //$height_max = $_POST['height_max'];
    //$gender_select = $_POST['gender_select'];
    
    if("" == trim($_POST['weight_min'])){
        $weight_min = '';
    }
    else
    {
        $weight_min = $_POST['weight_min'];
    }
    
    if("" == trim($_POST['weight_max'])){
        $weight_max = '';
    }
    else
    {
        $weight_max = $_POST['weight_max'];
    }
    
    if("" == trim($_POST['height_min'])){
        $height_min = '';
    }
    else
    {
        $height_min = $_POST['height_min'];
    }
    
    if("" == trim($_POST['height_max'])){
        $height_max = '';
    }
    else
    {
        $height_max = $_POST['height_max'];
    }
    
    if (!isset($_POST['gender_select'])){
        
        $gender_select = '';
    }
    else
    {
        $gender_select = $_POST['gender_select'];
    }
    
    //Show test 
    //echo "sent: weight-min: " .$weight_min. " weight-max: " .$weight_max. " height-min: ".$height_min." height-max: ".$height_max." gender-select: ".$gender_select."<p>";
    
    check_null_values($weight_min, $weight_max, $height_min, $height_max, $gender_select);
    

    function check_null_values($weight_min, $weight_max, $height_min, $height_max, $gender_select)
    {
        //Weight
        if($weight_min !=null && $weight_max != null && $height_min == null && $height_max == null && $gender_select == null)
        {
            select_weight($weight_min, $weight_max);
            //echo "select_weight";
        }
        //Height
        else if($weight_min == null && $weight_max == null && $height_min != null && $height_max != null && $gender_select == null)
        {
            select_height($height_min, $height_max);
            //echo "select_height";
        }   
        //Gender
        else if($weight_min == null && $weight_max == null && $height_min == null && $height_max == null && $gender_select != null)
        {
            select_gender($gender_select);
            //echo "select_gender";
        }
        //Weight + Height
        else if($weight_min != null && $weight_max != null && $height_min != null && $height_max != null && $gender_select == null)
        {
            select_weight_height($weight_min, $weight_max, $height_min, $height_max);
            //echo "select_weight_height";
        }
        //Weight + Gender
        else if($weight_min != null && $weight_max != null && $height_min == null && $height_max == null && $gender_select != null)
        {
            select_weight_gender($weight_min, $weight_max, $gender_select);
            //echo "select_weight_gender";
        }
        //Height + Gender
        else if($weight_min == null && $weight_max == null && $height_min != null && $height_max != null && $gender_select != null)
        {
            select_height_gender($height_min, $height_max, $gender_select);
            //echo "select_height_gender";
        }
        //All
        else if($weight_min != null && $weight_max != null && $height_min != null && $height_max != null && $gender_select != null)
        {
            select_all($weight_min, $weight_max, $height_min, $height_max, $gender_select);
            //echo "select_all";
        }
        else if($weight_min == null && $weight_max == null && $height_min == null && $height_max == null && $gender_select == null)
        {
            select_none();
            //echo "select_none";
        }
        else
        {
            //echo "Please enter missing parameter";
        }
    
    
    }

//Weight only selected
    function select_weight($weight_min, $weight_max)
    {
        include 'db_connect.php';
        $result = mysqli_query($db, 
        "SELECT * FROM character_information 
        WHERE 
        (char_min_weight BETWEEN '".$weight_min."' AND '" .$weight_max."'
        OR char_max_weight BETWEEN '".$weight_min."' AND '" .$weight_max."')
        OR
        ('".$weight_min."' BETWEEN char_min_weight AND char_max_weight
        OR '" .$weight_max."' BETWEEN char_min_weight AND char_max_weight)
        ");
        
        return get_result($result);
    }
    
    //Height only selected
    function select_height($height_min, $height_max)
    {
        include 'db_connect.php';
        $result = mysqli_query($db, 
        "SELECT * FROM character_information 
        WHERE 
        (char_min_height BETWEEN '".$height_min."' AND '" .$height_max."'
        OR char_max_height BETWEEN '".$height_min."' AND '" .$height_max."')
        OR
        ('".$height_min."' BETWEEN char_min_height AND char_max_height
        OR '" .$height_max."' BETWEEN char_min_height AND char_max_height)
        ");
        
        get_result($result);
    }
    
    //Gender only selected
    function select_gender($gender_select)
    {
        include 'db_connect.php';
        
        $result = mysqli_query($db, 
        "SELECT * FROM character_information 
        WHERE char_gender = '".$gender_select."'
        "); 
        
        get_result($result);    
        
    }
    
    //Weight + Height selected
    function select_weight_height($weight_min, $weight_max, $height_min, $height_max)
    {
        include 'db_connect.php';
        
        $result = mysqli_query($db, 
        "SELECT * FROM character_information 
        WHERE 
        ((char_min_weight BETWEEN '".$weight_min."' AND '" .$weight_max."'
        OR char_max_weight BETWEEN '".$weight_min."' AND '" .$weight_max."')
        OR
        ('".$weight_min."' BETWEEN char_min_weight AND char_max_weight
        OR '" .$weight_max."' BETWEEN char_min_weight AND char_max_weight))
        AND
        ((char_min_height BETWEEN '".$height_min."' AND '" .$height_max."'
        OR char_max_height BETWEEN '".$height_min."' AND '" .$height_max."')
        OR
        ('".$height_min."' BETWEEN char_min_height AND char_max_height
        OR '" .$height_max."' BETWEEN char_min_height AND char_max_height))
        "); 
        
        get_result($result);
    }

</div>
  • 写回答

2条回答 默认 最新

  • douyeke2695 2015-05-04 12:43
    关注

    I'm using this way :

    if(empty($_GET['weightMin'])) {
        $weightMin= null;
    } else $weightMin= $_GET['weightMin'];
    
    if(empty($_GET['weightMax'])) {
        $weightMax= null;
    } else $weightMin= $_GET['weightMax'];
    

    And the statement would be :

    SELECT * FROM TABLE 
    WHERE ((weight >= :weighttMin AND weight <= :weightMax) OR (weight >= :weightMin AND :weightMax is null) OR (weight <= :weightMax AND :weightMin is null) OR (:weightMax is null AND :weightMin is null))
    

    This is pretty long when it is x < filter < y

    Else if this is only one type like 'Gender' :

    if(empty($_GET['gender'])) {
        $gender = null;
    } else $gender = $_GET['gender'];
    

    The SQL:

    SELECT * FROM TABLE
    WHERE (gender = :gender or :gender is null)
    

    If gender is selected, it will search the good one, else it returns true and doesn't impact your statement.

    The combined query:

    SELECT * FROM TABLE 
    WHERE
    ((weight >= :weighttMin AND weight <= :weightMax) OR (weight >= :weightMin AND :weightMax is null) OR (weight <= :weightMax AND :weightMin is null) OR (:weightMax is null AND :weightMin is null))
    AND
    (gender = :gender or :gender is null)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 急,ubuntu安装后no caching mode page found等
  • ¥15 联想交换机NE2580O/NE1064TO安装SONIC
  • ¥15 防火墙的混合模式配置
  • ¥15 Ubuntu不小心注销了要怎么恢复啊
  • ¥15 win10电脑安装完plcsim advanced4.0运行时为什么会提示找不到虚拟网卡
  • ¥15 安装powerbuilder10卡在安装程序正在运行这个页面 没有下一步任何指令
  • ¥15 关于mpi的问题:请问遇到这种情况需要怎么解决,出现这个问题后电脑不能进行mpi多核运行只能进行单核运行
  • ¥50 微信聊天记录备份到电脑提示成功了,但还是没同步到电脑微信
  • ¥15 python怎么在已有视频文件后添加新帧
  • ¥20 虚幻UE引擎如何让多个同一个蓝图的NPC执行一样的动画,