зависимые списки select
Добрый вечер! Пытаюсь сделать зависимые списки select и видимо где-то ошибка. Так как я только разбираюсь в ajax, не могу понять где она. Помогите, пожалуйста. Мне кажется, что ошибка где-то в запросе, т.к. при выборе категории выходит alert "При выполнении запроса произошла ошибка " Но что именно не так с запросом? Заранее благодарю за помощь!
Сам запрос $tip = $mysqli->query("SELECT * FROM `tip` WHERE `id_kat` = '".$_POST['kat_id']."'"); $arr = array(); while($row = mysqli_fetch_assoc($tip)){ $arr[] = array($row['tid'] => $row['tname']); } return $arr; if (!isset($_POST['query']) || !$_POST['query']) { exit("Нет данных определяющих тип запроса"); } else { $query = trim($_POST['query']); // Определяем тип запроса switch($query) { case 'getTip': // Формируем массив с ответом $result = NULL; $i = 0; foreach ($arr as $tip_id => $tip) { $result[$i]['tip_id'] = $tip_id; $result[$i]['tip'] = $tip; $i++; } break; default: // Если данные не определены $result = NULL; break; } } (function () { "use strict"; jQuery(function () { $( '#kat' ).change(function () { $( '#tip').find( 'option:not(:first)' ) .remove() .end() .prop( 'disabled',true ); var kat_id = $( this ).val(); if (kat_id == 0) { return; } $.ajax({ type: "POST", url: "query.php", dataType: "json", data: "query=getTip&kat_id=" + kat_id, error: function () { alert( "При выполнении запроса произошла ошибка :(" ); }, success: function ( data ) { for ( var i = 0; i < data.length; i++ ) { $( '#tip' ).append( '<option value="' + data[i].tip_id + '">' + data[i].tip + '</option>' ); } $( '#tip' ).prop( 'disabled', false ); } }); }); }); })(); |
Данные до сервера доходят? Сервер возвращает корректный JSON? Путь до php скрипта корректно в запросе указан?
|
А как узнать доходят ли данные до сервера?
Путь до PHP скрипта это тот что в параметре "data" указан? Вопросы у меня, наверно, глупые, но я сосем не знакома ни с ajax ни с javascript, только пытаюсь разобраться во всем этом. Поэтому параметр "data" не уверена, что правильно написан. Запрос на PHP проверяла, он работает. |
Цитата:
Цитата:
Еще у вас указан dataType: "json", а это значит, что php скрипт должен возвращать данные в формате JSON, если он вернет данные в другом формате, то будет ошибка при попытке распарсить эти данные. |
query.php есть, в конце файла данные преобразуются в формат json, так что с этим тоже должно быть все в порядке. Попробую проверить, доходят ли данные до сервера
|
И сделайте вывод ошибки на стороне клиента так:
error: function (xhr, status, error) { alert( status + ' | ' + error ); } И скажите что оно у вас там выводит. |
parsererror | SyntaxError: Unexpected end of input
Я так понимаю, что что-то с запросом PHP не так? |
Цитата:
|
не знаю, еще не проверила. не могу понять, как именно формат проверить
|
Цитата:
$.ajax({ type: "POST", url: "query.php", dataType: "text", data: "query=getTip&kat_id=" + kat_id, error: function () { alert( "При выполнении запроса произошла ошибка :(" ); }, success: function ( data ) { alert(data) } }); И посмотрите что там у вас сервера приходит. |
пустой алерт выводит
|
Ну значит ваш php скрипт ничего не возвращает. Где у вас там вывод данных то? В том коде, который вы приводили в первом посте я не вижу где данные там выводятся.
|
у меня что-то с массивом, данные в массив из бд заводит, а из массива не выводит
|
$tip = $mysqli->query("SELECT *
FROM `tip` WHERE `id_kat` = '".$_POST['kat_id']."'"); $arr = array(); while($row = mysqli_fetch_assoc($tip)){ $arr[] = array($row['tid'] => $row['tname']); } return $arr; if (!isset($_POST['query']) || !$_POST['query']) { exit("Нет данных определяющих тип запроса"); } else { $query = trim($_POST['query']); // Определяем тип запроса switch($query) { case 'getTip': // Формируем массив с ответом $result = NULL; $i = 0; foreach ($arr as $tip_id => $tip) { $result[$i]['tip_id'] = $tip_id; $result[$i]['tip'] = $tip; $i++; } break; |
Это я уже видел. Где сам вывод данных то? echo там или еще что-нить в этом духе?
|
<form action="" method="post" id="dynamic_selects"> <div class="row"> <label for="kat">Категория</label> <select id="kat"> <option value="0">Выберите из списка</option> <?php for($i=0;$i<$kolvo_kat;$i++) { $stroka_kat=mysql_fetch_assoc($dannye_kat); $sel=''; if($stroka_kat['kid']==$kat_sel) { $sel=' selected="selected"'; } echo '<option value="'.$stroka_kat['kid'].'"'.$sel.'>'.$stroka_kat['kname'].'</option>'; } ?> </select> </div> <div class="row"> <label for="tip">Тип</label> <select id="tip" disabled> <option value="0">Выберите из списка</option> </select> </div> </form> |
Это всё в query.php? Вы понимаете, что скрипт, к которому обращаетесь аяксом должен выводить только данные в JSON формате, а не отдавать целую страницу?
|
нет, это в отдельном файле в index, а к нему подключены query.php, скрипт и библеотека jQuery
вот как полностью выглядит query.php $stroka_zaprosa_kat="SELECT * FROM kat"; $dannye_kat=mysql_query($stroka_zaprosa_kat, $connect) or die(mysql_error()) ; $kolvo_kat=mysql_num_rows($dannye_kat); $kat_sel=""; if(isset($_POST['kat'])) { $kat_sel=$_POST['kat']; } $tip = $mysqli->query("SELECT * FROM `tip` WHERE `id_kat` = '".$_POST['kat_id']."'"); $arr = array(); while($row = mysqli_fetch_assoc($tip)){ $arr[] = array($row['tid'] => $row['tname']); } return $arr; if (!isset($_POST['query']) || !$_POST['query']) { exit("Нет данных определяющих тип запроса"); } else { $query = trim($_POST['query']); // Определяем тип запроса switch($query) { case 'getTip': // Формируем массив с ответом $result = NULL; $i = 0; foreach ($arr as $tip_id => $tip) { $result[$i]['tip_id'] = $tip_id; $result[$i]['tip'] = $tip; $i++; } break; default: // Если данные не определены $result = NULL; break; } } // Преобразуем данные в формат json, чтобы их смог обработать JavaScript-сценарий, приславший запрос echo json_encode($result); |
return $arr; А вот это зачем? Оно же при выполнении скрипта его завершит и выполнение не дойдет до echo. |
я массив поправила, теперь отдельно он работает, но без return $arr;, но если я вставляю его в код и убираю return, то выводится "Нет данных определяющих тип запроса"
$tip = $mysqli->query("SELECT * FROM `tip` WHERE `id_kat` = '".$_POST['kat_id']."'"); $arr = array(); while($row = mysqli_fetch_assoc($tip)) { $arr[$row['tid']] = $row['tname']; } return $arr; В чем может быть дело? |
Цитата:
|
jsnb, не увидела ваш предыдущий ответ. я сама понимаю, что с ним массив не дойдет, но без него не работает вообще, даже select не выводит
|
этот запрос находится у меня в query.php
|
для ajax и так отдельный скрипт вроде
|
я уже ничего не понимаю:((
|
У меня 4 файла, index(там вывод), query.php, my.script.js, jquery.min.js
|
Цитата:
|
да, через include. сейчас попробую
|
попробовала, выводит "Нет данных определяющих тип запроса"
Убрала все ifы из query.php, оставила только запросы с массивом. зависимый select стал активным, но выводятся пустые строки |
Если оно пишет "Нет данных определяющих тип запроса", то значит переменная $_POST['query'] не определена, что странно. Попробуйте data параметр в ajax записать так:
data: {query: 'getTip', kat_id: kat_id}, |
написала, все по-прежнему
|
дак она и не может быть определена, пока не выбран параметр из первого списка, а как он может быть выбран, если списки select вообще не выводятся. Может быть нужно еще какое-то условие?
|
добавила еще одно условие, теперь запрос не ругается, и зависимый список становится акивным, при выборе первого, но опять данные не видны
|
Я, если честно, уже не понимаю куда вы там чего надобавляли и чего у вас там где не выводится. Я просил вас только скопировать часть после return $arr в новый php файл и при этом ничего не менять в query.php и остальных файлах. Ну и в url параметре аякса написать имя файла в который был скопирован код. Но вы начали какие-то условия менять и еще чего-то непонтное делать. Я должен методом телепатии узнавать что вы там меняете что ли?
|
Я разделила, но это не помогло. Теперь у меня 5 файлов. Добавила новое условие в query.php.
Теперь select второй становится активным, но параметры нужные не выводятся. Вот что у меня получилось: query.php include('zapros.php'); // Проверяем наличие переменной, которая укажет данному сценарию какие именно данные нужны if(isset($_POST['kat_id'])) { if (!isset($_POST['query']) || !$_POST['query']) { exit("Нет данных определяющих тип запроса"); } else { // Сохраняем строку запроса данных в отдельной переменной $query = trim($_POST['query']); // Очищаем от лишних пробелов // Определяем тип запроса switch($query) { case 'getTip': // Запрос на получение // Сохраним в переменную значение выбранного типа транспорта $kat_id = trim($_POST['kat_id']); // Очистим его от лишних пробелов // Формируем массив с ответом $result = NULL; $i = 0; foreach ($arr as $tip_id => $tip) { $result[$i]['tip_id'] = $tip_id; $result[$i]['tip'] = $tip; $i++; } break; default: // Если данные не определены $result = NULL; break; } } } echo json_encode($result); zapros.php $stroka_zaprosa_kat="SELECT * FROM kat"; $dannye_kat=mysql_query($stroka_zaprosa_kat, $connect) or die(mysql_error()) ; $kolvo_kat=mysql_num_rows($dannye_kat); $kat_sel=""; if(isset($_POST['kat'])) { $kat_sel=$_POST['kat']; } if(isset($_POST['kat_id'])) { $tip = $mysqli->query("SELECT * FROM `tip` WHERE `id_kat` = '".$_POST['kat_id']."'"); $arr = array(); while($row = mysqli_fetch_assoc($tip)) { $arr[$row['tid']] = $row['tname']; } } ну и скрипт остался прежним (function () { "use strict"; jQuery(function () { $( '#kat' ).change(function () { $( '#tip').find( 'option:not(:first)' ) .remove() .end() .prop( 'disabled',true ); var kat_id = $( this ).val(); if (kat_id == 0) { return; } $.ajax({ type: "POST", url: "query.php", dataType: "json", data: {query: 'getTip', kat_id: kat_id}, error: function (xhr, status, error) { alert( status + ' | ' + error ); } , success: function ( data ) { for ( var i = 0; i < data.length; i++ ) { $( '#tip' ).append( '<option value="' + data[i].tip_id + '">' + data[i].tip + '</option>' ); } $( '#tip' ).prop( 'disabled', false ); } }); }); }); })(); |
В общем, так еще хуже стало. Возвращайте всё как было. Надо смотреть что конкретно в переменных на каждом этапе и что в конце возвращается. Я не могу узнать, что у вас там в базе, что выбирается и что в результате из этого получается. Вы сами можете посмотреть что у вас там в переменных? И я так и не понял зачем к index файлу подключается query.php?
|
А куда подключать query если не к индексу? Пытаюсь вывести пост, но ничего не выводится, может быть первый select POST не передает? Еще все время выводится NULL, т.е. что данные не определены
|
Цитата:
Цитата:
|
Цитата:
|
Но в общем вы правы) Я перенесла запрос для первого select в index, убрала этот include и у меня исчез NULL)))
|
Часовой пояс GMT +3, время: 09:59. |