首页 > 解决方案 > 动态下拉列表给出 PHP 错误未定义变量

问题描述

我正在尝试为车辆品牌和车辆型号创建动态下拉列表。我希望用户能够在第一个下拉列表中选择车辆品牌,然后让第二个下拉列表填充所选车辆品牌的相关模型。我有一个包含所有车辆品牌和型号的 CSV - 文件中有 900 多个型号。我只使用 Javascript 就成功地完成了这项工作,但是有太多的车辆模型无法以这种方式编码。

我尝试使用 PHP 读取 CSV 文件并构建一个数组,然后在 PHP foreach 循环中回显 Javascript 代码。如果我只在 PHP 中运行 foreach 循环,我可以成功地将这部分 Javascript 代码回显到 HTML 页面。但是,一旦我将 PHP 代码放在函数中并在页面中调用该函数,就会出现错误。我的故障排除使我相信我需要使用 Ajax 之类的东西,但我对 Ajax 不熟悉,并希望我接近原样的解决方案,只需要一些关于如何继续的见解。另外,我没有在这里编写 Javascript 代码,我是通过 Google 搜索找到的。虽然我确实了解基础知识,但我对 Javascript 不是很精通。任何帮助将不胜感激。谢谢你。

Javascript:按原样工作,但我不想输入 900 个这样的项目:


    <script language="javascript" type="text/javascript">
    function dynamicdropdown(listindex)
    {
        switch (listindex)
        {
        case "Acura" :
            document.getElementById("status").options[0]=new Option("Select","");
            document.getElementById("status").options[1]=new Option("CL","CL");
            document.getElementById("status").options[2]=new Option("Integra","Integra");
            document.getElementById("status").options[3]=new Option("Legend","Legend");

            break;
        case "Audi" :
            document.getElementById("status").options[0]=new Option("Select","");
            document.getElementById("status").options[1]=new Option("80","80");
            document.getElementById("status").options[2]=new Option("90","90");
            document.getElementById("status").options[3]=new Option("100","100");
            break;
        }
        return true;
    }
    </script>

    <div class="category_div" id="category_div">Make:
        <select id="source" name="source" onchange="javascript:dynamicdropdown(this.options[this.selectedIndex].value);">
        <option value="">Select Make</option>
        <option value="Acura">Acura</option>
        </select>
    </div>
    <div class="sub_category_div" id="sub_category_div">Model:
        <script type="text/javascript" language="JavaScript">
        document.write('<select name="status" id="status"><option value="">Select status</option></select>')
        </script>

PHP:如果我删除该函数并在页面上回显结果,它会正确构建 Javascript:

<?php

$filename = 'list.csv';

// The nested array to hold all the arrays
$vehicle_array = []; 

// Open the file for reading
if (($h = fopen("{$filename}", "r")) !== FALSE){
  // Each line in the file is converted into an individual array called $data
  // The items of the array are comma separated
  while (($data = fgetcsv($h, 1000, ",")) !== FALSE){
    // Each individual array is being pushed into the nested array
    $vehicle_array[] = $data;       
  }
  // Close the file
  fclose($h);
}

// Display the code in a format I can read
foreach ($vehicle_array as $row) {
    if ($row[2] == -1) {
        unset($vehicle_array[$row[2]]);
        echo 'break;';
    } elseif ($row[2] == 0) {
        echo 'case "';
        echo $row[0];
        echo '"  :';
        echo 'document.getElementById("status").options[';
        echo $row[2];
        echo ']=new Option("';
        echo $row[1];
        echo '","';
        echo "";
        echo '");'; 
    } else {
        echo 'document.getElementById("status").options[';
        echo $row[2];
        echo ']=new Option("';
        echo $row[1];
        echo '","';
        echo $row[1];
        echo '");';
    }
}
?>

这是它中断的地方:我将 foreach 循环放在一个函数中,稍后在页面上调用该函数来构建 Javascript 的那部分。

    <script language="javascript" type="text/javascript">
    function dynamicdropdown(listindex)
    {
        switch (listindex)
        {

        <?php buildForm(); ?>

        }
        return true;
    }
    </script>

我收到这些错误:

  1. 未定义变量:vehicle_array
  2. 为 foreach() 提供的参数无效

以下是直接来自 Google Chrome 的错误消息:

函数 dynamicdropdown(listindex){switch (listindex){
注意:未定义变量:C:\xampp\htdocs\test\drop.php中的第25行中的 vehicle_array

警告:为C:\xampp\htdocs\中的 foreach() 提供的参数无效第25行的test\drop.php

请参阅图片以获取完整的错误消息。同样,这里的任何帮助将不胜感激。再次感谢!

Google Chrome 中的错误消息

CSV 文件示例

标签: javascriptphparraysforeach

解决方案


问题是您尝试将$vehicle_arrayinbuildForm用作全局变量,但您没有使用global关键字。有两种可能的解决方案:

智能解决方案

尽可能避免使用全局变量,因此,在我们的例子中,您需要更改两行:

  • 函数头:function buildForm($vehicle_array){
  • 函数的调用:buildForm($vehicle_array);

选择这个。请。

不是那么聪明的解决方案

在您使用之前$vehicle_array,请function确保它被用作global此行的变量:

global $vehicle_array;

这可能看起来很奇怪,但这就是语法的工作方式。在这里阅读更多:https ://phppot.com/php/variable-scope-in​​-php/


推荐阅读