зависимые списки 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, время: 08:38. |