动态下拉列表给出PHP错误未定义变量

时间:2019-04-02 21:50:48

标签: javascript php arrays foreach

我正在尝试为车辆制造商和车辆模型创建动态下拉列表。我希望用户能够在第一个下拉列表中选择车辆的制造商,然后让第二个下拉列表填充所选车辆的相关模型。我有一个包含所有车辆品牌和型号的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的错误消息:

function dynamicdropdown(listindex){switch(listindex){
通知:未定义变量: 25
行中的 C:\ xampp \ htdocs \ test \ drop.php 中的vehicle_array
警告:在 25
行的 C:\ xampp \ htdocs \ test \ drop.php 中为foreach()提供了无效的参数

有关完整的错误消息,请参见图像。再次,这里的任何帮助将不胜感激。再次感谢!

Error messages in Google Chrome

CSV file example

1 个答案:

答案 0 :(得分:0)

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

智能解决方案

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

  • 函数的标题:function buildForm($vehicle_array){
  • 该函数的调用:buildForm($vehicle_array);

选择这个。拜托。

不是那么聪明的解决方案

$vehicle_array中使用function之前,请确保此行将其用作global变量:

global $vehicle_array;

这似乎很奇怪,但这就是语法的工作原理。在此处阅读更多信息:https://phppot.com/php/variable-scope-in-php/