Долгое время искал решение, которое бы подходило мне в плане интеграции в достаточно сложную систему. В Google адекватного решения не нашёл. Те которые работали в чистом виде, не работали у меня. Разбираться не получилось поэтому я написал собственное решение с использованием библиотеки jQuery. Может быть кому-то будет полезно. Итак, у нас три файла - index.html, handler.php и jquery.js. Листинг index.html HTML: <!DOCTYPE html> <html> <head> <title>jQuery Dynamic Lists Example</title> <meta http-equiv="Content-type" content="text/html; charset=utf-8"> <script type="text/javascript" src="./jquery.js"></script> </head> <body> <div id="my-form"> <form id="form" method="post" action=""> <select id="category" size="1"> <option value="0">Выберите категорию</option> <option value="1">Автомобили</option> <option value="2">Языки программирования</option> </select> <br> <select id="sub-category" size="1"> <option value="0">---</option> </select> </form> </div> <div id="result"> </div> <script type="text/javascript"> $("#category").change(function(){ $("#sub-category").load("./handler.php", { id: $("#category option:selected").val() }); }); </script> </body> </html> Листинг handler.php PHP: <?php if ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'){ $subcategory = array(0 => array('BMW', 'Mercedes-Benz', 'Audi', 'Subaru', 'Mazda', 'ВАЗ', 'ЗАЗ', 'ГАЗ'), 1 => array('PHP', 'Java', 'Javascript', 'Python', 'C++', 'C', 'C#'), ); if (is_numeric ($_REQUEST['id']) && is_array ($subcategory[$_REQUEST['id']])){ foreach ($subcategory[$_REQUEST['id']] as $id => $value){ echo '<option value="' . $id . '">' . $value . '</option>'; } } } else { echo 'Bad request!'; exit; } Thanks to Sergey89 за решение проблемы с Firebug.
1. иногда даже второй селект прячут и грузят сразу с <select> тогда приколько появляются новые селекты. 2. когда открывается форма первый раз - загрузкт второго селекта нет? надо руками дернуть, что б загурзилось 3. можно вместо <option> возвращать JSON и уже на клиете рулить.
kostyl Это база, а не полноценное решение. PHP: <?php require_once ('./config.php'); require_once ('./init.php'); if ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'){ if (!is_numeric ($_REQUEST['id'])) exit; if ($_REQUEST['id'] == 0) die ('<option value="0">---</option>'); $query = mysql_query('SELECT `id`, `name` FROM `' . table_categories . '` WHERE `parent_id` = ' . $_REQUEST['id']); while ($subcategory = mysql_fetch_assoc ($query)){ echo '<option value="' . $subcategory['id'] . '">' . $subcategory['name'] . '</option>' . "\r\n"; } } else { echo 'Bad request!'; exit; }
Пробовал по всякому, но не проходит почему то запрос... помогите! если без запроса то работает... все данные в самом запросе менял на свои
Запрос рабочий на 100% (проверял 100 раз уже). НО - после запроса ничего не работает... если запрос поставить в самое начало, то после него вся страница не работает... PHP: <?php if ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'){ if (!is_numeric ($_REQUEST['id'])) exit; if ($_REQUEST['id'] == 0) die ('<option value="0">------</option>'); $query = mysql_query('SELECT * FROM hm_city_country WHERE `parent_id` = ' . $_REQUEST['id']); while ($subcategory = mysql_fetch_assoc ($query)){ echo '<option value="' . $subcategory['id'] . '">-' . $subcategory['name_city'] . '</option>' . "\r\n"; } } else { echo 'Bad request!'; exit; } ?>
darkgod PHP: <?php $query = mysql_query('SELECT * FROM hm_city_country WHERE `parent_id` = ' . $_REQUEST['id']) or die (mysql_error()); while ($subcategory = mysql_fetch_assoc ($query)){ print_r ($subcategory); echo '<option value="' . $subcategory['id'] . '">-' . $subcategory['name_city'] . '</option>' . "\r\n"; }
Хочу серверную часть case-ми сделать, правильно ли я передаю параметр? [js]$("#category").change(function(){ $("#sc").load("mail_ajax.php", {id:$("#category option:selected").val(), parametr: "podkatalog" }); }); [/js] Серверная часть: PHP: <? if ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') //выполняем условие передачи { $link1 = mysql_pconnect("localhost", "root", "") //Соединяемся с MySQL or die (mysql_error()); //выводим ошибку mysql mysql_select_db("objava") // Соединяемся с базой or die (mysql_error()); //выводим ошибку mysql $id=$_REQUEST['id']; $p=$_REQUEST['parametr']; switch ($p) { case "podkatalog": $query_2 = "SELECT * FROM podkatalog where katalogID=$id"; break; default: $query_2 = "SELECT * FROM katalog"; }; //выводим все каталоги $result = mysql_query($query_2) or die (mysql_error()); //Делаем выборку с параметром $query_2 while ($category = mysql_fetch_assoc ($result)) { //Начало цикла while print_r ($category); echo '<option value="' . $category['katalogID'] . '">' . $category['name'] . '</option>' . "\r\n"; } //конец цикла while }//конец цикла передачи else { echo 'Bad request!'; exit; } mysql_close($link1);//закрываем соединение MySQL ?> Почеу то не обрабатывает парметр на сервере.
Если кому надо с КЕЙСАМИ и MySQL...вот рабочий отлаженный пример [js] <script type="text/javascript"> //загружаем список-1 $(document).ready(function() { $("#category").load("mail_ajax.php"); }); //загружаем список-2 на событие change $("#category").change(function(){ $("#sc").load("mail_ajax.php", {id:$("#category option:selected").val(), parametr: "podkatalog" }); }); // На событие click кнопки but_click производим добавление элемента в список-1 $("#but_click").click(function(){ $("#category").load("mail_ajax.php", { name:$('#change_text').val(), id:$('#category option:selected').val(), parametr:"addKatalog" }); //Передаём параметр "parametr" КЕЙСУ }); </script>[/js] Серверная часть PHP: <? if ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') //выполняем условие передачи { $link1 = mysql_pconnect("localhost", "root", "") //Соединяемся с MySQL or die (mysql_error()); //выводим ошибку mysql mysql_select_db("objava") // Соединяемся с базой or die (mysql_error()); //выводим ошибку mysql $id=$_REQUEST['id'];// получаем id списка-1 $p=$_REQUEST['parametr']; //получаем параметр для КЕЙСА switch ($p) { case "podkatalog": {$query_2 = "SELECT podkatalogID,podkatalogName FROM podkatalog where katalogID='$id'";}; // Если "podkatalog" то открываем список-2 по id break; case "addKatalog": { //если "addKatalog" то производим добавление $name=iconv("utf-8","windows-1251",$_REQUEST['name']); //функция //перевода кодировки (необязательно) можно просто $name=$_REQUEST['name'] $query ="INSERT INTO katalog (`name`) VALUES ('".$name."')"; $result = mysql_query($query); $query_2 = "SELECT * FROM katalog"; }; break; default: $query_2 = "SELECT * FROM katalog"; //если не передан не один параметр, то просто открываем список-1 }; //выводим все каталоги $result_1 = mysql_query($query_2) or die (mysql_error()); //Делаем выборку с параметром $query_2 while ($row = mysql_fetch_row($result_1)) // Задаём массив { //Начало цикла while //производим выдачу echo '<option value="' . $row['0'] . '">' . $row['1'] . '</option>' . "\r\n"; //Выводим <option> } //конец цикла while }//конец цикла передачи else { echo 'Bad request!'; exit; } mysql_close($link1);//закрываем соединение MySQL ?> Спасибо всем кто отвечает на мои вопросы!
Код Код (Text): $(document).ready(function() { $("#category").load("mail_ajax.php"); }); лучше заменить на mail_ajax.php, быстрее в два раза. А так всё хорошо.
Не передается. Работает только в Опере. IE вообще не реагирует, в Мозилле возвращается массив. Если я все правильно понимаю, это связано с проблемой XMLHttpRequest в Мозилле. Или не связано... Версия jQuery 1.3.2 UPD. Проблема решена. Забыл убрать print_r массива выборки из базы.