CodeIgniter и Ajax: динамически зависимый раскрывающийся список не работает

Я пытаюсь создать динамически зависимый раскрывающийся список с помощью Ajax и CodeIgniter 4. Однако мне не удалось заставить его работать. Можете ли вы помочь мне понять, что не так? Я пытаюсь следовать этому руководству онлайн: ССЫЛКА

Ошибка на консоли

jquery.min.js:2 
POST http://localhost/sidsci/public/sd/getAjaxBrgy 500 (Internal Server Error)

База данных

mcb_id | mcb_name | mcb_brgy

Вид

<div class = "form-row">
   <div class = "form-group col-md-6">
      <label><b>Municipal / City<span class = "text-danger">*</span></b></label>
      <select name = "s_muncity" class = "form-control" id = "s_muncity" required>
         <option value = "">-Select-</option>
         <?php foreach($mcb as $mcb_row):?>
         <option value = "<?= $mcb_row->mcb_name;?>"><?= $mcb_row->mcb_name;?></option>
         <?php endforeach;?>
      </select>
   </div>
   <div class = "form-group col-md-6">
      <label><b>Barangay<span class = "text-danger">*</span></b></label>
      <select class = "form-control" name = "s_brgy" id = "s_brgy" required></select>
   </div>
</div>

$('#s_muncity').change(function(){
        var mcb_name = $(this).val();

        $.ajax({
            url:'<?=base_url('/sd/getAjaxBrgy')?>',
            method: 'POST',
            data: {mcb_name: mcb_name},
            dataType: 'json',
            success: function(response){
                $('#s_brgy').find('option').not(':first').remove();
                $.each(response,function(index,data){
                $('#s_brgy').append('<option value = "'+data['mcb_brgy']+'">'+data['mcb_brgy']+'</option>');
                });
            }
        });
    });

Контроллер

public function getAjaxBrgy(){

        $model = new McbModel();
        $postData = array(
            'mcb_name' => $this->request->getPost('mcb_name'),
        );

        $data = $model->getBrgyData($postData);
        echo json_encode($data);
    }

Модель

  public function getBrgyData($postData) {
      $sql = 'select mcb_brgy from mcb where mcb_name ='.$postData['mcb_name'];
      $query =  $this->db->query($sql);
      return $query->getResult();
  }

У меня также есть <script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> в заголовке.

Вы говорите, что в вашей базе данных есть столбец с именем mcb_barangay, но вы используете select mcb_brgy ... в своем запросе, что немного отличается. Вы уверены, что имя столбца, который вы используете в своем запросе, правильное?

Marleen 07.07.2024 14:09

@Марлин, я уже отредактировал это. это mcb_brgy.

cjvdg 07.07.2024 14:36
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В разметке представления надежно идентифицируйте параметры, назначив идентификатор базы данных в качестве значения атрибута параметра value. В подавляющем большинстве случаев отношения должны строиться на идентификаторах, а не на именах.

<div class = "form-row">
    <div class = "form-group col-md-6">
        <label for = "s_muncity">
            <b>Municipal / City<span class = "text-danger">*</span></b>
        </label>
        <select name = "s_muncity" class = "form-control" id = "s_muncity" required>
            <option value = "">-Select-</option>
            <?php foreach ($mcb as $mcb_row) { ?>
                <?php printf('<option value = "%d">%s</option>', $mcb_row->mcb_id, $mcb_row->mcb_name); ?>
            <?php } ?>
        </select>
    </div>
    <div class = "form-group col-md-6">
        <label for = "s_brgy"><b>Barangay<span class = "text-danger">*</span></b></label>
        <select class = "form-control" name = "s_brgy" id = "s_brgy" required>
            <option value = "">-Select-</option>
        </select>
    </div>
</div>

Если в вашем Javascript вы не собираетесь использовать mcb_id в качестве значений параметров, полностью опустите значение атрибута value — нет смысла повторять текст параметра в качестве атрибута value. Этот ajax-запрос представляет собой просто «чтение» данных (а не «запись») данных, поэтому общепринятой практикой является выполнение запроса GET, а не запроса POST.

$('#s_muncity').change(function() {
    $.get(
        '<?php echo base_url("/sd/getAjaxBrgy/"); ?>' + $(this).val(),
        function (response) {
            $('#s_brgy').find('option').not(':first').remove();
            $.each(response, function(index, data) {
                $('#s_brgy').append(
                    '<option>' + data.mcb_brgy + '</option>'
                );
            });
        },
        'json'
    );
});

Контроллер

public function getAjaxBrgy(int $mcbId)
{
    echo json_encode(
        (new McbModel())->getBrgy(['mcb_id' => $mcbId])
    );
}

Модель: (ваша предыдущая попытка не заключалась в цитировании передаваемой переменной - я предполагаю, что значение не было целым числом или числом с плавающей запятой)

public function getBrgy(array $where, string $order = 'mcb_name'): array
{
    return $this->db
        ->table('mcb_brgy')
        ->orderBy($order)
        ->getWhere($where)
        ->getResult();
}

При этом я вообще не буду выполнять никаких запросов AJAX!

Поскольку у вас уже есть один набор результатов, содержащий все данные таблицы базы данных, вам следует объявить объект поиска в JavaScript как константу. Свойствами будут значения mcb_id, а значения для каждого mcb_id будут подмассивом, содержащим все связанные значения mcb_brgy.

Все, что вам нужно, будет доступно для мгновенного доступа к Javascript, и вам не придется беспокоить свой сервер.

Заполнение поиска:

const mcbLookup = <?php echo json_encode(
    array_reduce(
        $mcv,
        function ($result, $row) {
            $result[$row->mcb_id][] = $row->mcb_brgy;
            return $result;
        },
        []
    )
); ?>;

Добавляем слушателя:

$('#s_muncity').change(function(){
    $('#s_brgy').find('option').not(':first').remove();
    $.each(
        mcbLookup[$(this).val()],
        function(index, data) {
            $('#s_brgy').append('<option>' + data.mcb_brgy + '</option>');
        }
    );
});

Другие вопросы по теме