虽然对于PHP脚本来说并不陌生,但我确实将它与JavaScript结合起来用于此目的。 我有一个表单,包含一个类别dropmenu,选择类别修改了子类别下拉菜单可用的选项...我已经能够用PHP和JavaScript做到这一点 我的问题是以相同的形式,我有状态和城市下拉菜单动态生成,任何时候选择状态,并删除在子类别中选择的选项。 有关如何在同一页面上将这2个不同类别的下拉菜单组合在一起的任何帮助?
以下是与我的问题相关的主要代码。
function reload(form)
{
var val=form.cat.options[form.cat.options.selectedIndex].value;
var val1=form.location.options[form.location.options.selectedIndex].value;
self.location='reg_practice_details.php?cat=' + val + ''location=' + val1 ;
}
<?php
@$location=htmlentities($_GET['location']);
@$cat=$_GET['cat'];
// Getting the data from Mysql table for first list box
$quer2=mysql_query("SELECT DISTINCT class_id,class FROM categories order by class");
// End of query for first list box
// for 2nd dropdown check if category is selected else display the subcategory
if(isset($cat) and strlen($cat) > 0){
$quer=mysql_query("SELECT DISTINCT subcategory FROM subcategories where class_id=$cat order by subcategory");
}
else{
$quer=mysql_query("SELECT DISTINCT subcategory FROM subcategories order by subcategory");
}
// end of query for 1st group of drop down list box
//Dropdown menu for state and city
$sql2=mysql_query("SELECT DISTINCT state_id,state FROM state order by state");
// for second drop down list we will check if category is selected else we will display all the subcategory
if(isset($location) and strlen($location) > 0){
$sql=mysql_query("SELECT DISTINCT city FROM city where state_id=$location order by city");
}else{$sql=mysql_query("SELECT DISTINCT city FROM city order by city"); }
// end of query for second group drop down list box
?>
<form action="details.php" method="post" name="practiceDetails">
//Dropdown code for the category/subcategory group of dropdown menu
<?php
// Add your form processing page address to action in above line.
// Starting of first dropdownlist
echo "<select name='cat' onchange=\"reload(this.form)\">
<option value=''>Select one</option>";
while($noticia2 = mysql_fetch_array($quer2)) {
if($noticia2['class_id']==@$cat){
echo "<option selected value='$noticia2[class_id]'>$noticia2[class]</option>"."<BR>";
}
else {
echo"<option value='$noticia2[class_id]'>$noticia2[class]</option>";
}
}
echo "</select>";
?>
<?php
echo "<select name='subcat'><option value=''>Select one</option>";
while($noticia = mysql_fetch_array($quer)) {
echo "<option value='$noticia[subcategory]'>$noticia[subcategory]</option>";
}
echo "</select>";?>
///Dropdown code for the state/city group of dropdown menu
<?php
echo "<select name='location' onchange=\"reload(this.form)\">
<option value=''>Select one</option>";
while($noticia2 = mysql_fetch_array($sql2)) {
if($noticia2['state_id']==@$location){
echo "<option selected value='$noticia2[state_id]'>$noticia2[state]</option>"."<BR>";
}
else{
echo "<option value='$noticia2[state_id]'>$noticia2[state]</option>";}
}
echo "</select>";
?>
<?php
echo "<select name='city'><option value=''>Select one</option>";
while($noticia = mysql_fetch_array($sql)) {
echo "<option value='$noticia[city]'>$noticia[city]</option>";
}
echo "</select>";?>
答案 0 :(得分:0)
看起来你的javascript正在选择这两个菜单。 - &GT;那不是......
有一些拼写错误,比如
self.location='reg_practice_details.php?cat=' + val + '&location=' + val1 ;
在while循环中缺少}
,还有其他几个。
除此之外,您要做的事情如下:如果用户在cat
或state
下拉菜单中分别选择subcat
和{{ 1}}下拉菜单应该更改并仅提供适用的值。
就像我说的那样,您正在刷新完整的表单(city
)来更改一个下拉菜单。您使用reload(this.form)
变量设置selected
值。这些是从URL中检索的,因此更改表单不会重新加载整个页面,因此不会拾取任何(新的)$_GET
变量。 (有趣的是,这个错误出现在网络上的所有execersis上。要么你的老师/教授创造了一个混蛋,要么不理解客户端/服务器端编程)
有两种可能的选择。
让PHP将数据库结果回显到Javscript(作为数组)。浏览器会选择这个,Javascript可以访问这些结果。然后使用javascript的onChange()方法检测$_GET
和cat
下拉菜单的任何更改,如果检测到,让javascript重新创建/重新填充带有子选项的正确下拉菜单(因此state
或city
)
虽然这不是最好的,但它是最简单的。
subcat
// Getting the data from Mysql table for first list box
$class_query=mysql_query("SELECT DISTINCT class_id,class FROM categories order by class");
// get all subcategories, we do the 'where class_id=$cat on the client-side
$subcat_query=mysql_query("SELECT DISTINCT subcategory FROM subcategories");
//Dropdown menu for state and city
$state_query=mysql_query("SELECT DISTINCT state_id,state FROM state order by state");
// get all the cities, we'll check for the state ( state_id=$location) client-side
// note that getting DISTINCT cities, means that if cities appear in more states,
// they're not fetched...
$city_query=mysql_query("SELECT DISTINCT city FROM city order by city");
?>
然后你可以使用javascript来切割数组,其中subcat_array中的class_id等于类子菜单中所选元素的class_id。 (在这个例子中,它是一个对象,但多维数组也可以
另一种可能性是使用AJAX。简而言之,AJAX在单独的调用中检索结果。所以在javascript中,你像上面的选项一样使用<script type="text/javascript">
var class_array = Array();
var subcat_array = Array();
<?php
// prepare all dropdown menus.
// the output is written as javascript (JS) arrays
// as the browser loads the page, it reads the arrays as JS, and JS can use it
// position this somewhere in your <body>, after the queries, before the form
while($noticia2 = mysql_fetch_array($class_query)) {
echo "class_array = [" . $noticia2[class_id] . "] = " . $noticia2[class];
}
$n=0
while($noticia = mysql_fetch_array($subcat_query)) {
echo "subcat_array = [".$n."] = {
subcategory: \"" . $noticia[subcategory] . "\"
class_id: \"" . $noticia[class_id] . "\"}";
$n++;
}
?>
</script>
,但不是用一个数组切片重新填充下拉菜单,而是对执行原始sql-query的php文件进行AJAX调用
onChange()
ajax调用将收到结果(显然你需要if(isset($cat) and strlen($cat) > 0)
{
$quer=mysql_query("SELECT DISTINCT subcategory FROM subcategories where class_id=$cat order by subcategory");
}
else
{
$quer=mysql_query("SELECT DISTINCT subcategory FROM subcategories order by subcategory");
}
你的查询结果在那个php文件中)你可以使用它来(重新)填充下拉菜单。
由于AJAX实现因浏览器/操作系统而异,因此使用像jQuery这样的库可以显着简化操作。 (jQuery文档也很棒)。
无论您选择哪个选项,这都应该为您提供一些起点。由于这是一种来自某种功课的练习,我不会给你完整的代码;)(另外,没有PHP测试环境atm。)
要考虑的一些事情
echo
。真的没有必要
压制错误,所以不要:)。 希望你现在可以进一步了!