PHP-jquery-ajax динамический зависимый выбор - сложность

Я программирую простую форму с динамическим зависимым выбором. Есть два файла. Один — это php-файл с html, javascript и php внутри, второй — это php-файл для получения данных для второго выбора и отправки их обратно в формате json. В первом (и основном) файле у меня есть форма с двумя полями выбора. Первое поле для провинции, второе для города. Данные находятся в базе данных MySQL, две таблицы, table_provinces для провинций (103 строки) и table_towns для городов (8000 строк). Обычно подключайтесь к базе данных, как обычно, а также ссылайтесь на jquery, используя ссылку javascript. Сначала я получаю параметры провинции для первого поля выбора, используя php для получения значений из table_provinces базы данных. Затем с помощью javascript «on('change',function(){здесь я использую ajax...})» я передаю выбранное значение с помощью ajax в файл php, который может извлекать города из table_towns и возвращать (в формате json) значения для заполнения второго поля выбора. Javascript правильно получает выбранное значение из первого поля выбора (я использовал предупреждение, чтобы узнать это), но больше ничего не происходит. Итак, это код.

Ссылка на jquery:

<script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

Поле первого выбора HTML:

<form method = "post" action = "usemychoice.php">
<select id = "province" name = "province" color = "white">
<option value = "" selected>Select a province</option>

Вот как я заполняю первое поле выбора:

 

   <?php

    $sql = "SELECT * FROM table_provinces"; 

    $result = mysqli_query($conn, $sql);

    if (mysqli_num_rows($result) > 0) {

    	while($row = mysqli_fetch_assoc($result)) {

    		echo "<option value='".$row['prov']."'>".$row['extended_province']."</option>";

    	}

    } else {

    	echo "Error: ..........";
    }

    ?>

И после закрытия этого поля с помощью /select у меня есть этот код, чтобы получить значения для заполнения названиями городов во втором поле выбора:

<script type = "text/javascript">
$(document).ready(function(){
    $('#province').on('change',function(){
        var provinceID = $(this).val();
        if (provinceID){
        	window.alert("ok you've chosen the province "+provinceID);
            $.ajax({
                type:'POST',
                url:'get_towns.php',
                data: 'prov='+provinceID,
                success:function(html){
                    $('#town').html(html);
                }
            }); 
        }else{
            $('#town').html('<option value = "">Please select the province first</option>');
        }
    });
});
</script>

Это код get_town.php:

<?php 


//*****after a require to the connection db routine"


if (!empty($_POST["prov"])) {

$sql = "SELECT * FROM table_towns WHERE prov LIKE '%" .$_POST['prov']."%'";

$result = mysqli_query($conn, $sql);

$json = [];

if (mysqli_num_rows($result) > 0) {

	while($row = mysqli_fetch_assoc($result)) {

    	$json[$row['prov']] = $row['town'];

	} else {
    
    echo "Error: .................";
    
    }

echo json_encode($json);

}

?>

Наконец у меня есть html-код:

<select id = "town" name = "town" color = "white">
<option value = "" selected>Select province first</option>

В конце концов, в коде что-то не так, потому что я не получаю никаких данных от get_town.php для заполнения второго поля выбора, и поскольку я не видел window.alert, который я поместил туда, чтобы проверьте текущее выполнение (вы не видите его в размещенном здесь коде), похоже, что оно не выполняется. Любая помощь?

Поведение ключевого слова "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) для оценки ваших знаний,...
0
0
53
2

Ответы 2

 url:'get_towns.php',

Разве это не get_town.php без множественного числа?

о да, просто ошибка при вводе здесь, потому что я изменил названия городов для этого вопроса, а не для раскрытия фактической конфигурации базы данных; )

santelia 23.02.2019 13:49

По-видимому, кажется, что вывод get_town.php - это JSON

echo json_encode($json);

но в вашем JS он напрямую выводится в элемент html

$('#town').html(html);

Решение:

Либо измените get_town.php для отправки html, либо измените функцию успеха в JS, чтобы преобразовать полученный JSON в правильный html.

Я надеюсь, это поможет.

Обновлено:

Замените эту часть php

while($row = mysqli_fetch_assoc($result)) {

    $json[$row['prov']] = $row['town'];

}

с чем-то

echo '<option value = "" selected>Select Town</option>';

while($row = mysqli_fetch_assoc($result)) {

    echo '<option  value = "'.$row['town'].'" color = "white">'.$row['town'].'</option>';

}

и, наконец, удалить строку

echo json_encode($json);

Спасибо, Qaisar, как бы вы предложили изменить код в обоих случаях?

santelia 23.02.2019 13:51

Я имею в виду, как может быть код для отправки html из get_town.php или как может быть код для изменения функции успеха в javascript для преобразования полученного JSON в правильный html

santelia 23.02.2019 13:52

Пробовал то, что вы предлагаете (добавление "</option>"), но это не решает. Второе поле выбора не возвращает ничего для заполнения.

santelia 23.02.2019 14:58

о, я пропустил часть </option>. Во всяком случае, поделитесь выводом console.info("OUTPUT: " +html);. Поместите это выше $('#town').html(html); в JS.

Qaisar Feroz 23.02.2019 15:06

<?php // ***** после требования к подпрограмме БД соединения" if (!empty($_POST["prov"])) { $sql = "SELECT * FROM table_towns WHERE prov LIKE '%" .$ _POST['prov']."%'"; $result = mysqli_query($conn, $sql); if (mysqli_num_rows($result) > 0) { while($row = mysqli_fetch_assoc($result)) { echo "< option value='".$row['town']."'></option>"; } else { echo "Ошибка:................"; } } ?>

santelia 23.02.2019 15:12

и до сих пор нет результата

santelia 23.02.2019 15:14

Попробуйте data: { 'prov' : provinceID }, вместо data: 'prov='+provinceID, в JS.

Qaisar Feroz 23.02.2019 15:20

Неа. Любая другая идея? Дело в том, что после вызова " $.ajax({ ............ " вроде нигде в исполнении жизни нет. Все как будто ничего не было ни получено, ни сделано get_town.php

santelia 23.02.2019 16:00

Хорошо, есть ли ошибки JS в инструменте разработчика браузера? Ваше оповещение в JS, window.alert("ok you've chosen the province "+provinceID); работает и правильно отображает provinceID?

Qaisar Feroz 23.02.2019 16:22

Да, он отображает сообщение и провинцию. Значит проблема после. Нет ошибок в инструментах разработчика браузера.

santelia 23.02.2019 16:56

Проверьте, доступен ли get_town.php, поставив die( "mmmmmmmmmmmmmm") ; перед оператором if (!empty($_POST["prov"]))(... в get_town.php и alert(html); в функции успеха. Оба файла php находятся в одном каталоге?

Qaisar Feroz 23.02.2019 17:27

Пытался таким образом перехватить статус в js-скрипте, но ничего не вышло: весь предыдущий код как и раньше....... data: 'prov='+provinceID, success:function(html){ if (response != " ") { window.alert ("получил ответ"); } else { window.alert("нет ответа"); } весь остальной код как прежде...

santelia 23.02.2019 17:42

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