基于多个下拉选择从mysql数据库中获取数据

Posted

技术标签:

【中文标题】基于多个下拉选择从mysql数据库中获取数据【英文标题】:Fetch data from mysql database based on multiple dropdown selections 【发布时间】:2021-10-23 18:42:31 【问题描述】:

我正在开展一个项目,其中有关治疗师的数据存储在数据库中,我的页面上有 5 个下拉列表,我希望根据用户选择的下拉值获取数据。

<div id="dropdowns"> 
        <form method="post">    
            <?php
                session_start();
                
                $username = "root";
                $password = "";
                $database = "align";
                $mysqli = new mysqli("localhost", $username, $password, $database);

                $sql = "SELECT DISTINCT `Designation` FROM `therapists`"; 
                if($res = $mysqli->query($sql))
                

                    echo '<div class="select">
                                <select id="profession" name="profession" onchange="getSelectDesignation(this.value);">
                                <option selected disabled>Filter by Profession</option> ';              
                    while ($row = $res->fetch_assoc()) 
                        echo "<option value='" . $row['Designation'] ."'>" . $row['Designation'] ."</option>";
                    
                    echo '      </select>
                        </div>';
                    $res->free();
                
                 

                $ids = "SELECT DISTINCT `Identifies As` FROM `therapists`";
                if($res = $mysqli->query($ids))
                
                    echo '<div class="select">
                                <select id="idas" name="idas" onchange="getSelectIdentifiesas(this.value);">
                                <option selected disabled>Identifies as</option> ';              
                    while ($row = $res->fetch_assoc()) 
                        echo "<option value='" . $row['Identifies As'] ."'>" . $row['Identifies As'] ."</option>";
                    
                    echo '      </select>
                        </div>';
                    $res->free();
                
                
                
                $clgr = "SELECT DISTINCT `Client Group` FROM `therapists`";
                if($res = $mysqli->query($clgr))
                

                    echo '<div class="select">
                            <select id="clgr" name="clgr" onchange="getSelectClientGroup(this.value);">
                                <option selected disabled>Client Group</option> ';

                    while ($row = $res->fetch_assoc()) 
                        echo "  <option value='" . $row['Client Group'] ."'>" . $row['Client Group'] ."</option>";
                     
                    echo '   </select>
                        </div>';
                    $res->free();
                

                $istr = "SELECT DISTINCT `Issues Treated` FROM `therapists`";
                if($res = $mysqli->query($istr))
                

                    echo '<div class="select">
                            <select id="istr" name="istr" onchange="getSelectIssuesTreated(this.value);">
                                <option selected disabled>Issues treated</option> ';

                    while ($row = $res->fetch_assoc()) 
                        echo "  <option value='" . $row['Issues Treated'] ."'>" . $row['Issues Treated'] ."</option>";
                     
                    echo '   </select>
                        </div>';
                    $res->free();
                 
                
                $lan = "SELECT DISTINCT `Languages` FROM `therapists`";
                if($res = $mysqli->query($lan))
                

                    echo '<div class="select">
                            <select id="idas" name="lan" onchange="getSelectLanguages(this.value);">
                                <option selected disabled>Languages</option> ';

                    while ($row = $res->fetch_assoc()) 
                        echo "  <option value='" . $row['Languages'] ."'>" . $row['Languages'] ."</option>";
                     
                    echo '   </select>
                        </div>';
                    $res->free();
                
              
            ?>
        </form>      
    </div> 

每当用户选择下拉选项时,都会调用每个下拉列表的特定函数,该函数获取所选选项的值并将其发送到名为 fetch_data 的不同页面,该页面显示有关治疗师的信息。

function getSelectDesignation(val1)

    $.ajax(
        type: 'post',
        url: 'fetch_data.php',
        data: 
            get_option1:val1,
        ,
        success: function (response) 
            document.getElementById("boxes").innerhtml=response; 
        
    );


function getSelectIdentifiesas(val2)

    $.ajax(
        type: 'post',
        url: 'fetch_data.php',
        data: 
            get_option2:val2,
        ,
        success: function (response) 
            document.getElementById("boxes").innerHTML=response; 
        
    );


function getSelectClientGroup(val3)

    $.ajax(
        type: 'post',
        url: 'fetch_data.php',
        data: 
            get_option3:val3,
        ,
        success: function (response) 
            document.getElementById("boxes").innerHTML=response; 
        
    );


function getSelectIssuesTreated(val4)

    $.ajax(
        type: 'post',
        url: 'fetch_data.php',
        data: 
            get_option4:val4,
        ,
        success: function (response) 
            document.getElementById("boxes").innerHTML=response; 
        
    );


function getSelectLanguages(val5)

    $.ajax(
        type: 'post',
        url: 'fetch_data.php',
        data: 
            get_option5:val5,
        ,
        success: function (response) 
            document.getElementById("boxes").innerHTML=response; 
        
    );

以下是我的 fetch_data 页面中的代码:

<?PHP
   session_start();
   
   $username = "root";
   $password = "";
   $database = "align";
   
   
   $mysqli = new mysqli("localhost", $username, $password, $database);

   $state1 = $_POST['get_option1'];
   $state2 = $_POST['get_option2'];
   $state3 = $_POST['get_option3'];
   $state4 = $_POST['get_option4'];
   $state5 = $_POST['get_option5'];
   $loc = $_SESSION['location'];

   $find="SELECT * FROM `therapists` AS `T` inner join `personal details` as `P` ON `T`.`Therapist ID` = `P`.`Therapist ID` WHERE(`Location` LIKE '%".$loc."%' AND  `Designation` LIKE '%".$state1."%' AND  `Identifies As` LIKE '%".$state2."%' AND  `Client Group` LIKE '%".$state3."%' AND  `Languages` LIKE '%".$state5."%'  AND  `Issues Treated` LIKE '%".$state4."%')";
   if ($result = $mysqli->query($find)) 
                   
       while ($row = $result->fetch_assoc()) 
           $field1name = $row["Therapist ID"];
           $field2name = $row["Name"];
           $field3name = $row["Designation"];
           $field4name = $row["Identifies As"];
           $field5name = $row["Client Group"];
           $field6name = $row["Languages"];
           $field7name = $row["Issues Treated"];
           $field8name = $row["Location"];
           $field9name = $row["Phone Number"];
           $field10name = $row["Intro"];
           $field11name = $row["Instagram Link"];
           $field12name = $row["Linkedin Link"];
           $field13name = $row["Aasha URL"];
           
           echo '<div id="profile-card">
           <div id="info">
               <div class="name-desig-img">
                   <div class="name-desig">          
                       <a class="therapist-name" href="http://localhost/aasha/profile.php/'. $field2name .'">';echo $field2name;echo'</a>
                       <p>';echo $field3name;echo'</p>
                   </div>
                   <div class="p-img">
                       <img class="prof-img" src="';echo $field14name;echo'">
                   </div>  
               </div>
               <div class="intro">
                   <p>';echo $field10name;echo'</p>
               </div>
               <div class="location">  
                   <p>';echo $field8name;echo'</p><p>
               </div>
           </div>    
           <div id="links">
               <div id="t-socials">
                   <div class="tp"><a class="t-links" href="';echo $field13name;echo'">';echo' Profile </a></div>
                   <div class="tli">|</div>
                   <div class="tli"><a class="t-links" href="';echo $field12name;echo '"><i class="fab fa-linkedin">';echo'</i></a> </div>  
                   <div class="tli">|</div>
                   <div class="tli"><a class="t-links" href="';echo $field11name;echo '"><i class="fab fa-instagram-square">';echo'</i></a></div>
               </div>  
               <p class="showphone">
                   <span class="clickshow" style="display: inline;"><b>Show Phone Number</b></span>
                   <span class="hiddenphone" style="display: none;">
                       <span>';echo $field9name;echo'</span>
                   </span>
               </p>
           </div>
           </div>';       
       
       
   /*freeresultset*/
   $result->free();
   

?>

现在的问题是,每当我选择一个下拉选项时,其他下拉列表的值为空,并且我在 PHP 中得到未定义的数组键错误。例如,如果我选择作为第一个下拉列表的 option1,则会收到 option2、option3、option4 和 option5 的未定义数组键错误。如果我选择 option2,则会收到 option1、option3、option4 和 option 的未定义数组键错误,依此类推。即使在 1 个或多个下拉菜单中未选择任何选项,我也需要找到一种方法来使查询正常工作。

【问题讨论】:

您尝试过什么解决问题的方法?你被困在哪里了? 还有,这是JS问题,jQuery问题,PHP问题,还是MySQL问题? @NicoHaase 我尝试了下面 Prakhar Singh 给出的解决方案,但我不再收到未定义的数组键错误。我猜这是 PHP 和 jQuery 的问题,但我想知道使用 PHP 或 jQuery,或 JS 或全部使用它们来解决它的最佳方法是什么。 @PrakharSingh 给出的解决方案有效,但我现在有一个不同的问题,例如,如果我的数据库中有关于辅导员的信息,并且用户从下拉列表中选择了 2 个过滤器,例如辅导员和男性在 2 个单独的下拉列表中,我得到的数据显示所有男性,即使他们不是顾问。我希望查询仅获取与用户选择的任何下拉选项匹配的数据。 如果您遇到新问题,请打开一个新问题 【参考方案1】:

您可以使用以下方法检查选项是否已设置 isset() 如果未设置值,只需将长度为零的字符串分配给'' 这些变量即可。

if(isset($_POST['get_option1']))
    $state1 = $_POST['get_option1'];
else
    $state1 = '';

对于所有其他变量也是如此。

【讨论】:

谢谢,您的解决方案完美运行,我不再收到未定义数组键错误。 那太好了?你可以考虑接受答案?【参考方案2】:

首先,ajax一次只能发出1个请求,根据你的代码,请求是在onchange()时发送的,所以只会发出1个请求。

一切看起来都很好,但是您正在从 _POST 获取所有变量,因为一次只发送 1 个,因此,您需要一次发送所有变量以使您的查询 $find="SELECT * FROM `therapists` AS `T` inner join `personal details` as `P` ON `T`.`Therapist ID` = `P`.`Therapist ID` WHERE(`Location` LIKE '%".$loc."%' AND `Designation` LIKE '%".$state1."%' AND `Identifies As` LIKE '%".$state2."%' AND `Client Group` LIKE '%".$state3."%' AND `Languages` LIKE '%".$state5."%' AND `Issues Treated` LIKE '%".$state4."%')"; 工作。

做这样的事.....

<div id="dropdowns"> 
        <form>   
         <!-- Your selectors here -->
            <select id="idas" name="lan">
                <option> ...... </option>
            </select>
            <select id="clgr" name="lan">
                <option> ...... </option>
            </select>
            <select id="istr" name="lan">
                <option> ...... </option>
            </select>
            <input type="button" onclick = "gettheValues()" value="GetIt"> 
        </form>      
    </div> 

Java 脚本

function gettheValues()

    var val1 = document.getElementById("idas").value;
    var val2 = document.getElementById("clgr").value;
    var val3 = document.getElementById("istr").value;
    $.ajax(
        type: 'post',
        url: 'fetch_data.php',
        data: 
            get_option1:val1,
            get_option2:val2,
            get_option3:val3
        ,
        success: function (response) 
            document.getElementById("boxes").innerHTML=response; 
        
    );//Send values all together...

我想在 php 代码中不需要更改任何内容。

还有I need to find a way to make the query work even if no option is selected in 1 or more dropdowns.你这是什么意思?

如果这些状态 state1 - state5 对您的查询很重要,则无法运行该查询。 是您知道该查询中状态的重要性,因此不适合回答。

如果您认为可以根据不同的选择器进行查询,请这样做。

<?php 
if(isset($_POST['get_option1']))
 
 //appropriate query here

$query = "Your query with option1";

if(isset($_POST['get_option2']))
 
 //appropriate query here
$query = "Your query with option2";

...
..etc to option5

//Here your result of query with html
?>

对于下面的任何查询评论,如果您需要一个工作示例,我会做一个。

【讨论】:

感谢您的解决方案我也会尝试这个,但是您的解决方案要求我添加一个按钮,用户必须在从不同的下拉列表中选择选项后单击该按钮,我希望过滤器每次都能自动应用用户从 5 个下拉列表中的任何一个中选择一个选项。 I need to find a way to make the query work even if no option is selected in 1 or more dropdowns. 我的意思是即使用户从 dropdown1 和 dropdown2 中选择选项并且没有从 dropdown3、4 和 5 中选择任何选项,我也希望查询能够工作。 如果我理解正确,它是某种排序的东西吗?如果是,你想在用户检查选择器时对输出进行排序?然后按照我在最后提到的,因为你的查询使用 $state1,..$state4LIKE 子句,您需要为每个选定的选项定义单独的查询。 是的,它正在排序。您的解决方案也有效。

以上是关于基于多个下拉选择从mysql数据库中获取数据的主要内容,如果未能解决你的问题,请参考以下文章

从Yii上的多个选择下拉列表中获取值以插入数据库

根据多个下拉选择从对象中获取相应的值

从下拉列表中选择数据时,从 MYSQL 数据库中设置输入字段值属性

如何在codeigniter中将ajax选择的依赖下拉选项传递给mysql数据库

从表中保存多个下拉选择 - PHP MySQL

从MySQL加载数据并使用jQuery Mobile,PHP选择填充下拉列表