Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   зависимые списки select (https://javascript.ru/forum/dom-window/47083-zavisimye-spiski-select.html)

zazula 07.05.2014 22:19

зависимые списки 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 );  
                }
            });
        });
    }); 
})();

jsnb 08.05.2014 06:59

Данные до сервера доходят? Сервер возвращает корректный JSON? Путь до php скрипта корректно в запросе указан?

zazula 08.05.2014 07:49

А как узнать доходят ли данные до сервера?
Путь до PHP скрипта это тот что в параметре "data" указан? Вопросы у меня, наверно, глупые, но я сосем не знакома ни с ajax ни с javascript, только пытаюсь разобраться во всем этом. Поэтому параметр "data" не уверена, что правильно написан. Запрос на PHP проверяла, он работает.

jsnb 08.05.2014 08:00

Цитата:

Сообщение от zazula (Сообщение 310836)
А как узнать доходят ли данные до сервера?

Посмотреть на сервере выполняется ли php скрипт при запросе или нет... Как вариант прописать сохранение какой-нибудь файла при запуске скрипта или еще какие-нибудь косвенные операции, которые помогут понять запускался ли скрипт вообще или нет и какие данные ему приходят.

Цитата:

Сообщение от zazula (Сообщение 310836)
Путь до PHP скрипта это тот что в параметре "data" указан?

Это то что указано в url параметре. Там сейчас query.php и это значит, что query.php должен лежать в той же директории, что и страница откуда запускается аякс запрос.

Еще у вас указан dataType: "json", а это значит, что php скрипт должен возвращать данные в формате JSON, если он вернет данные в другом формате, то будет ошибка при попытке распарсить эти данные.

zazula 08.05.2014 08:18

query.php есть, в конце файла данные преобразуются в формат json, так что с этим тоже должно быть все в порядке. Попробую проверить, доходят ли данные до сервера

jsnb 08.05.2014 08:39

И сделайте вывод ошибки на стороне клиента так:
error: function (xhr, status, error) {    
  alert( status + ' | ' + error );  
}

И скажите что оно у вас там выводит.

zazula 08.05.2014 08:54

parsererror | SyntaxError: Unexpected end of input
Я так понимаю, что что-то с запросом PHP не так?

jsnb 08.05.2014 09:02

Цитата:

Сообщение от zazula (Сообщение 310849)
parsererror | SyntaxError: Unexpected end of input
Я так понимаю, что что-то с запросом PHP не так?

Данные в некорректном формате с сервера приходят. У вас там точно корректный JSON возвращается?

zazula 08.05.2014 09:08

не знаю, еще не проверила. не могу понять, как именно формат проверить

jsnb 08.05.2014 09:12

Цитата:

Сообщение от zazula (Сообщение 310851)
не знаю, еще не проверила. не могу понять, как именно формат проверить

Поменяйте свой ajax на такой:
$.ajax({
                type: "POST",   
                url: "query.php",   
                dataType: "text",   
                data: "query=getTip&kat_id=" + kat_id,  
                error: function () {    
                    alert( "При выполнении запроса произошла ошибка :(" );  
                },
                success: function ( data ) {                    
                    alert(data) 
                }
});

И посмотрите что там у вас сервера приходит.

zazula 08.05.2014 09:29

пустой алерт выводит

jsnb 08.05.2014 09:30

Ну значит ваш php скрипт ничего не возвращает. Где у вас там вывод данных то? В том коде, который вы приводили в первом посте я не вижу где данные там выводятся.

zazula 08.05.2014 09:34

у меня что-то с массивом, данные в массив из бд заводит, а из массива не выводит

zazula 08.05.2014 09:35

$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;

jsnb 08.05.2014 09:38

Это я уже видел. Где сам вывод данных то? echo там или еще что-нить в этом духе?

zazula 08.05.2014 09:41

<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>

jsnb 08.05.2014 09:55

Это всё в query.php? Вы понимаете, что скрипт, к которому обращаетесь аяксом должен выводить только данные в JSON формате, а не отдавать целую страницу?

zazula 08.05.2014 10:51

нет, это в отдельном файле в 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);

jsnb 08.05.2014 11:58

return $arr;

А вот это зачем? Оно же при выполнении скрипта его завершит и выполнение не дойдет до echo.

zazula 08.05.2014 12:19

я массив поправила, теперь отдельно он работает, но без 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 08.05.2014 12:22

Цитата:

Сообщение от zazula (Сообщение 310879)
я массив поправила, теперь отдельно он работает, но без 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;

В чем может быть дело?

Не понял какой массив вы поправили и куда и что вы там вставляете... Вы там говорили, что у вас query.php через include в другом скрипте вызывается. Может для аякса отдельный скрипт сделать?

zazula 08.05.2014 12:45

jsnb, не увидела ваш предыдущий ответ. я сама понимаю, что с ним массив не дойдет, но без него не работает вообще, даже select не выводит

zazula 08.05.2014 12:47

этот запрос находится у меня в query.php

zazula 08.05.2014 12:48

для ajax и так отдельный скрипт вроде

zazula 08.05.2014 12:48

я уже ничего не понимаю:((

zazula 08.05.2014 12:50

У меня 4 файла, index(там вывод), query.php, my.script.js, jquery.min.js

jsnb 08.05.2014 13:07

Цитата:

Сообщение от zazula (Сообщение 310868)
нет, это в отдельном файле в index, а к нему подключены query.php

query.php как к index подключен? Через include? Сделайте отдельннй php файл, в него втсавьте код, который идет после return $arr; и попробуйте в аякс запросе обращаться уже к этому файлу.

zazula 08.05.2014 13:11

да, через include. сейчас попробую

zazula 08.05.2014 13:51

попробовала, выводит "Нет данных определяющих тип запроса"
Убрала все ifы из query.php, оставила только запросы с массивом.
зависимый select стал активным, но выводятся пустые строки

jsnb 08.05.2014 14:15

Если оно пишет "Нет данных определяющих тип запроса", то значит переменная $_POST['query'] не определена, что странно. Попробуйте data параметр в ajax записать так:
data: {query: 'getTip', kat_id: kat_id},

zazula 08.05.2014 14:20

написала, все по-прежнему

zazula 08.05.2014 14:29

дак она и не может быть определена, пока не выбран параметр из первого списка, а как он может быть выбран, если списки select вообще не выводятся. Может быть нужно еще какое-то условие?

zazula 08.05.2014 14:30

добавила еще одно условие, теперь запрос не ругается, и зависимый список становится акивным, при выборе первого, но опять данные не видны

jsnb 08.05.2014 14:37

Я, если честно, уже не понимаю куда вы там чего надобавляли и чего у вас там где не выводится. Я просил вас только скопировать часть после return $arr в новый php файл и при этом ничего не менять в query.php и остальных файлах. Ну и в url параметре аякса написать имя файла в который был скопирован код. Но вы начали какие-то условия менять и еще чего-то непонтное делать. Я должен методом телепатии узнавать что вы там меняете что ли?

zazula 08.05.2014 14:55

Я разделила, но это не помогло. Теперь у меня 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 );	
				}
			});
		});
	}); 
})();

jsnb 08.05.2014 15:26

В общем, так еще хуже стало. Возвращайте всё как было. Надо смотреть что конкретно в переменных на каждом этапе и что в конце возвращается. Я не могу узнать, что у вас там в базе, что выбирается и что в результате из этого получается. Вы сами можете посмотреть что у вас там в переменных? И я так и не понял зачем к index файлу подключается query.php?

zazula 08.05.2014 16:17

А куда подключать query если не к индексу? Пытаюсь вывести пост, но ничего не выводится, может быть первый select POST не передает? Еще все время выводится NULL, т.е. что данные не определены

jsnb 08.05.2014 16:45

Цитата:

Сообщение от zazula (Сообщение 310948)
А куда подключать query если не к индексу?

Еще раз, зачем он туда подключается? В чем его там роль состоит?

Цитата:

Сообщение от zazula (Сообщение 310948)
Пытаюсь вывести пост, но ничего не выводится, может быть первый select POST не передает? Еще все время выводится NULL, т.е. что данные не определены

Я не могу сказать, что у вас там передается, потому что у меня нет доступа к вашим данным. Откройте вкладку сеть в средствах разработчика браузера и посмотрите что у вас уходит на сервер в POST запросе.

zazula 08.05.2014 17:04

Цитата:

Сообщение от jsnb
Еще раз, зачем он туда подключается? В чем его там роль состоит?

Он нужен для вывода категорий в первый select

zazula 08.05.2014 17:06

Но в общем вы правы) Я перенесла запрос для первого select в index, убрала этот include и у меня исчез NULL)))


Часовой пояс GMT +3, время: 09:59.