Динамический выпадающий список с ошибкой PHP Неопределенная переменная - PullRequest
1 голос
/ 03 апреля 2019

Я пытаюсь создать динамические выпадающие списки для производителей автомобилей и моделей автомобилей. Я хотел бы, чтобы пользователь мог выбрать марку автомобиля в первом раскрывающемся списке, а затем во втором раскрывающемся списке указать соответствующие модели для выбранной марки автомобиля. У меня есть CSV, содержащий все марки и модели автомобилей - в файле более 900 моделей. Я успешно справился с этой задачей, используя только Javascript, но существует слишком много моделей транспортных средств, чтобы кодировать его таким образом.

Я попытался с помощью PHP прочитать файл CSV и построить массив, а затем отобразить код Javascript в цикле foreach PHP. Если я запускаю только цикл foreach в PHP, я могу успешно отобразить эту часть кода 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) {
Примечание : неопределенная переменная: vehicle_array в C: \ xampp \ htdocs \ test \ drop.php в строке 25

Предупреждение : В foreach () указан неверный аргумент в C: \ xampp \ htdocs \ test \ drop.php в строке 25

Пожалуйста, смотрите изображение для полных сообщений об ошибках. Опять же, любая помощь здесь будет принята с благодарностью. Еще раз спасибо!

Сообщения об ошибках в Google Chrome

Пример файла CSV

1 Ответ

0 голосов
/ 03 апреля 2019

Проблема в том, что вы пытаетесь использовать $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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...