基于多个下拉选择从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,..$state4
和 LIKE
子句,您需要为每个选定的选项定义单独的查询。
是的,它正在排序。您的解决方案也有效。以上是关于基于多个下拉选择从mysql数据库中获取数据的主要内容,如果未能解决你的问题,请参考以下文章
从下拉列表中选择数据时,从 MYSQL 数据库中设置输入字段值属性