-1

我正在研究制造型号年份汽车数据库,并且我有以下表格,可以根据制造选择型号。

    <? 

 $hostname = "";
 $database = "";
 $username = "";
 $password = "";

 $mysql_link = mysql_connect($hostname,$username,$password) or die ("can't connect to mysql");
 $mysql_select = mysql_select_db($database,$mysql_link) or die ("can't select db");
  ?> 

 <html> 
 <head> 
 <title>Dynamic Dropdown</title> 
 <script language="javascript"> 
 function setOptions(chosen) { 
   var selbox = document.myform.selectmodel; 

   selbox.options.length = 0; 
   if (chosen == "0") { 
     selbox.options[selbox.options.length] = new Option('First select a car','0');

   } 
   <? 
   $car_result = mysql_query("SELECT * FROM make") or die(mysql_error()); 
   while(@($c=mysql_fetch_array($car_result))) 
   { 
   ?> 
     if (chosen == "<?=$c['make'];?>") { 

     <? 
     $c_id = $c['make']; 
     $mod_result = mysql_query("SELECT * FROM model WHERE make='$c_id'") or die(mysql_error());
      while(@($m=mysql_fetch_array($mod_result))) 
     { 
     ?> 
       selbox.options[selbox.options.length] = new 
       Option('<?=$m['model'];?>','<?=$m['model'];?>'); 
     <? 
     } 
     ?> 
     } 
   <? 
   } 
   ?>  
   } 
  </script> 
  </head> 
  <body> 
 <form name="myform"><div align="center"> 
 <p>
     <select name="selectcar" size="1" 
     onchange="setOptions(document.myform.selectcar.options 
      [document.myform.selectcar.selectedIndex].value);"> 
       <option value="0" selected>Select a car</option> 
      <? 
     $result = mysql_query("SELECT * FROM make") or die(mysql_error()); 
     while(@($r=mysql_fetch_array($result))) 
      { 
      ?> 
       <option value="<?=$r['make'];?>">
          <?=$r['make'];?>
       </option> 
       <? 
      } 
    ?> 
     </select>
       <br>
        <br> 
   <select name="selectmodel" size="1"> 
     <option value=" " selected>First select a car</option> 
    </select>
     <br>
     <br>
      <select name="optthree" size="1">
       <option value=" " selected="selected">Please select one of the options  above               first</option>
      </select>
         </p>
       <p>
           <input type="button" name="go" value="Value Selected" 
        onclick="alert(document.myform.selectmodel.options 
     [document.myform.selectmodel.selectedIndex].value);"> 
         </p>
    </div></form> 
      </body> 
    </html>

我需要添加 javascript 代码和表单代码,以使第三个下拉框根据品牌和型号显示年份。

感谢你的协助。

这是用于填充和选择年份下拉列表的更新后的 javascript

 <script language="javascript"> 
  function setOptions(chosen) { 
  var selbox = document.myform.selectmodel; 

      selbox.options.length = 0; 
    if (chosen == "0") { 
         selbox.options[selbox.options.length] = new Option('First select a car','0');

      } 
     <? 
       $car_result = mysql_query("SELECT * FROM make") or die(mysql_error()); 
     while(@($c=mysql_fetch_array($car_result))) 
      { 
     ?> 
         if (chosen == "<?=$c['make'];?>") { 

           <? 
         $c_id = $c['make']; 
              $mod_result = mysql_query("SELECT * FROM model WHERE make='$c_id'") or die                   (mysql_error());
   while(@($m=mysql_fetch_array($mod_result))) 
     { 
  ?> 
         selbox.options[selbox.options.length] = new 
       Option('<?=$m['model'];?>','<?=$m['model'];?>'); 
     <? 
     } 
      ?> 
     if (chosen == "<?=$m['make'];?>") { 

    <? 
     $m_id = $c['make']; 
       $mod_result = mysql_query("SELECT * FROM year WHERE make='$c_id' AND model='$m_id'") or    die(mysql_error());
          while(@($y=mysql_fetch_array($year_result))) 
      { 
        ?> 
        selbox.options[selbox.options.length] = new 
      Option('<?=$y['year'];?>','<?=$y['year'];?>'); 
      <? 
           } 
     <? 
    } 
   ?> 
    } 
   </script> 
4

1 回答 1

1

要回答您的问题,您的代码是正确的(如果有效:))。然而,这段代码变得有点复杂,所以也许我可以提供一些改进它的方法。

首先,您将 HTML 和 PHP 混合在一起,这使得您很难了解正在发生的事情 - 如果您切换到模板引擎,则处理起来会容易得多。实现这一目标的一个好方法是将所有 PHP 移动到 PHP 文件的开头,然后很容易移动到单独的文件。考虑这段代码:

 <select name="selectcar" size="1" 
 onchange="setOptions(document.myform.selectcar.options 
  [document.myform.selectcar.selectedIndex].value);"> 
   <option value="0" selected>Select a car</option> 
  <? 
 $result = mysql_query("SELECT * FROM make") or die(mysql_error()); 
 while(@($r=mysql_fetch_array($result))) 
  { 
  ?> 
   <option value="<?=$r['make'];?>">
      <?=$r['make'];?>
   </option> 
   <? 
  } 
?> 
 </select>

我会这样做:

<?php /* Start of document * ?>
<?php 
$result = mysql_query("SELECT * FROM make") or die(mysql_error()); 

// Other PHP...
?>

<!-- HTML here -->

<select
    name="selectcar"
    size="1" 
    onchange="setOptions(document.myform.selectcar.options[document.myform.selectcar.selectedIndex].value);"
>
    <option value="0" selected>Select a car</option> 
    <?php while ($r = mysql_fetch_array($result)): ?>
        <option value="<?php echo $r['make'] ?>">
            <?php echo $r['make'] ?>
        </option>
    <?php endwhile ?>

您可以在此处看到,在 HTML 标记中,所有 PHP 语句都只有一行,并且我避免使用冒号形式的语句的大括号形式,因为结束语句(endfor,endwhileendforeach更容易阅读)。此外,单个语句不需要分号行结尾,这使得标记更加清晰。

我也只使用了 PHP 开头语句的长格式 ( <?php),因为短格式可以在您的服务器配置中关闭,因此在服务器之间不是很便携。

我不建议您使用@错误抑制机制,因为它可能会导致您在上线之前错过一个错误。最好在本地机器上彻底测试代码,并关闭实时服务器上的屏幕错误报告。此外,如果可以,请切换到更好的数据库库 - 该mysql库已被弃用,并将从 PHP 的未来版本中删除。

内联事件属性不是 HTML5(onchange等)的一部分,尽管出于遗留原因它们将在浏览器中工作。因此最好使用不显眼的事件附加,例如在 jQuery 中:

$('select[name=selectcar]').change(function() { .. });

您的 JavaScript 声明当前不会通过 W3C 验证。而不是这样:

<script language="javascript">

你需要这个:

<script type="text/javascript">

接下来,您的 JavaScript 是动态生成的,这将使调试变得非常痛苦。最好将其编写为纯文本,完全不包含 PHP,然后使用 PHP 中的数组作为输入数据。(在 JavaScript 中有 PHP 的用例,但我建议你暂时避免使用它)。

我想说setOptions()JavaScript 函数的目的并不清楚。看起来您正在列出数据库的内容,然后在不使用客户端循环的情况下进行一整套比较。在这里,我建议您照原样拍摄项目的快照(最好使用诸如 Git 之类的 VCS,但如果没有文件夹副本也可以),然后重写此位。

我在这里不能提供太多建议,因为不清楚您要做什么。请记住,就目前而言,JavaScript 比较中的菜单数据仅在提供页面时才是正确的。如果每个下拉菜单都依赖于前一个下拉菜单的值,那么您可能需要 AJAX 服务器查找,正如我在评论中所说的那样。如果没有,则将数据呈现为数组(PHPjson_encode在这里很有用),然后使用循环构造在 JavaScript 中访问它。

于 2013-05-11T18:27:48.387 回答