Php脚本/ java脚本帮助放置两个动态生成的双下拉菜单

时间:2013-12-08 22:02:11

标签: javascript php ajax

虽然对于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>";?>

1 个答案:

答案 0 :(得分:0)

看起来你的javascript正在选择这两个菜单。 - &GT;那不是......

有一些拼写错误,比如

self.location='reg_practice_details.php?cat=' + val  + '&location=' + val1 ;

在while循环中缺少},还有其他几个。

除此之外,您要做的事情如下:如果用户在catstate下拉菜单中分别选择subcat和{{ 1}}下拉菜单应该更改并仅提供适用的值。

就像我说的那样,您正在刷新完整的表单(city)来更改一个下拉菜单。您使用reload(this.form)变量设置selected值。这些是从URL中检索的,因此更改表单不会重新加载整个页面,因此不会拾取任何(新的)$_GET变量。 (有趣的是,这个错误出现在网络上的所有execersis上。要么你的老师/教授创造了一个混蛋,要么不理解客户端/服务器端编程)

有两种可能的选择。

  1. 让PHP将数据库结果回显到Javscript(作为数组)。浏览器会选择这个,Javascript可以访问这些结果。然后使用javascript的onChange()方法检测$_GETcat下拉菜单的任何更改,如果检测到,让javascript重新创建/重新填充带有子选项的正确下拉菜单(因此statecity
    虽然这不是最好的,但它是最简单的。

    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。 (在这个例子中,它是一个对象,但多维数组也可以

  2. 另一种可能性是使用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文档也很棒)。

  3. 无论您选择哪个选项,这都应该为您提供一些起点。由于这是一种来自某种功课的练习,我不会给你完整的代码;)(另外,没有PHP测试环境atm。)

    要考虑的一些事情

    • 过度使用echo。真的没有必要 压制错误,所以不要:)。
    • 如果此代码来自教程, 找另外一个。代码显然很旧,Google会回复问题 从2007年开始。在2007年,这段代码一直如此,现在已经明确禁止了。
    • 如果 你会得到任何具体的错误/问题,搜索SO /谷歌 它,或创建一个新的具体问题。

    希望你现在可以进一步了!