Загрузка городов через AJAX

страна

регион

город

Как это реализовано
Для начала нам нужна база городов. Скачать базу в формате SQL можно здесь.

Клиентская часть

Посмотреть клиентский код можно здесь.
AJAX у меня реализован через известную библиотеку jQuery. При выборе страны (или региона) отсылаем серверному скрипту 2 параметра методом POST:
id – id объекта (страны или региона)
type – тип списка, который нужно получить (города или регионы)

<script type="text/javascript">
function getList(type, obj) {
    $("#loading_" + type).show(); // запускаем крутящееся колесико
    $.post("/ajax/city.php", {type: type, id: $("#"+obj).val()}, onAjaxSuccess);
    function onAjaxSuccess(data) {
         out = document.getElementById(type);
         for (var i = out.length - 1; i >= 0; i--) {
              out.options[i] = null;
         }
         eval(data);
         $("#loading_" + type).hide(); // скрываем крутящееся колесико
    }
}
</script>

Во время обращения к серверному скрипту следует оповестить пользователя о том, что идет какой-либо обмен данными (показываем крутящееся колесико загрузки). Индикация во время обмена данными в Web 2.0 играет очень важную роль: посетители могли еще не привыкнуть к таким способам обновления страницы.

Серверная часть

Как только на сервер пришел запрос от клиента (параметры id и type), мы формируем либо список регионов, либо список городов и отправляем его клиенту. Список формируется в виде js-объекта Option а затем, когда ответ пришел клиенту, то этот ответ (текстовая строка) выполняется через eval и получается полноценный html-код из option. Изначально я сразу формировал html-код из option, но в одном из браузеров (по-моему, IE6) он не хотел вставляться в select, поэтому пришлось использовать извращение eval().

<?php
include($_SERVER['DOCUMENT_ROOT'].'/include/config.php');
include($_SERVER['DOCUMENT_ROOT'].'/include/db.php');

$id   = (int)$_POST['id']; // id объекта (страна или регион)
$type = $_POST['type']; // тип списка, который нужно получить (города или регионы)

sleep(1); // спешить нам некуда

if ($type == 'city') {
     // выбираем города в данном регионе
     $cities = $DB->select('SELECT *
                                    FROM city
                                    WHERE region_id = ?d
                                    ORDER BY name', $id);
     if (!empty($cities)) {
         echo "out.options[out.options.length] = new Option('выберите город...','none');\n";
         foreach ($cities as $city) {
              echo "out.options[out.options.length] = new Option('".$city['name']."','".$city['city_id']."');\n";
         }
     }
     else {
          echo "out.options[out.options.length] = new Option('нет городов','none');\n";
     }
}
if ($type == 'region') {
     // выбираем регионы в данной стране
     $regions = $DB->select('SELECT *
                                      FROM region
                                      WHERE country_id = ?d
                                      ORDER BY name', $id);
     if (!empty($regions)) {
         echo "out.options[out.options.length] = new Option('выберите регион...','none');\n";
         foreach ($regions as $region) {
              echo "out.options[out.options.length] = new Option('".$region['name']."','".$region['region_id']."');\n";
         }
     }
     else {
          echo "out.options[out.options.length] = new Option('нет регионов','none');\n";
     }
}
?>

Для выборки данных из базы я использую библиотеку DBSimple (в коде объект $DB). Вы можете легко переделать работу с базой данных под свой код. Запросы элементарные, так что разберетесь.

sleep(1) – замораживает выполнение скрипта на 1 секунду. Я это сделал специально, чтобы можно было увидеть крутящееся колесико при загрузке.

#1

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

sikoshi, 25.04.2010 - 18:28
#2

Да, с JSON имел опыт. Но этот код писался в 2008 году, поэтому переделывать его влом:)
Кстати, JSON активно используется в Контакте.

admin, 25.04.2010 - 19:33
#3

Вконтакте не очень :)
на такие запросы они выдают готовый html, как я понимаю, закешированный в nginx

sikoshi, 25.04.2010 - 19:51
#4

Поиск людей, список друзей в Контакте сделан через JSON. По-моему даже API у них выдает списки в виде json.

admin, 25.04.2010 - 22:28
#5

Спасибо, Серёж!

Полезный у тебя сайт.
Последнее время часто натыкаюсь.

Апрель, 6.06.2010 - 21:14
#6

А нельзя выложить готовые скрипты в архиве как это было сделано с sql базой городов?

KuzyaK, 24.06.2010 - 12:50
#7

Да, где конфиг, где db.php

onthebest, 26.06.2010 - 21:38
#8

Что такое out.options[out.options.length] и где функция Option ? В каком виде должен содержаться ответ от city.php ?
в нем должен быть уже html список ?

Евгений, 9.07.2010 - 10:54
#9

Разобрался. Но така как не было библиотеки DB то воспользовался штатными средствами cms для запросов. потом еще были проблемы с кодировкой, т.к. сайт в windows-1251, но помог $id=iconv("UTF-8", "windows-1251", $id); в city.php

Евгений, 9.07.2010 - 11:50
#10

http://blog.wel.org.ua/index.php/2010/08/есть-где-взять-названия-городов-насел/

Для выборки данных из базы я использовал PDO, у автора пример с DBSimple.
Жду предложений

Валера, 30.08.2010 - 14:19
#11

Не могли бы вы выложить/отослать эти скрипты в архиве. У меня до конца все получается с клиентской частью.

Заранее спасибо!

adetpps, 15.11.2010 - 13:44
#12

Огромное человеческое спасибо за базу и скрипты!
сразу заработали. ща буду переделывать под свой сайт :)
Удачи и дальнейших вдохновений!

Юрий, 17.11.2010 - 06:25
#13

Извините, я совсем недавно стал учить php и я вот не могу понять, что это за строчки:
include($_SERVER['DOCUMENT_ROOT'].'/include/config.php');
include($_SERVER['DOCUMENT_ROOT'].'/include/db.php');

И где указаны название БД, из которой будем брать страны, регионы и города?

Ketsyki, 21.11.2010 - 18:40
#14

Отошлите пожалуйста и мне эти скрипты в архиве.
Тоже проблема с клиентской частью.

Дима, 22.11.2010 - 01:19
#15

Не работает
echo "out.options[out.options.length] = new Option('".$city['name']."','".$city['city_id']."');\n";
Хотя из базы данные приходят

Дима, 22.11.2010 - 11:52
#16

Реально, скиньте, пожалуйста, архив с всеми скриптами и библиотеками, чтоб распаковал его, и все работает. А то у меня и без того подключена куча библиотек в которых я еще почти не разобрался, а с этой DBSimple начинаются траблы :)

Ketsyki, 22.11.2010 - 15:55
#17

Непонятно что писать в options html

вот тут какой код должен быть чтоб показывало регионы?

Plexx, 21.01.2011 - 13:07
#18

Огромная просьба, скиньте мне тоже скрипты в архиве. Потому что, не могу до конца разобраться что да как. А ваш скрипт очень нужная весчь, давно ее ищу.

Антон, 27.05.2011 - 14:49
#19

Если можно и мне пожалуйста скиньте скрипты, буду очень признателен)

Painbot, 6.06.2011 - 21:14
#20

Мне тоже интересно! а..где..:
??? и где его вставить???

Евгений, 17.06.2011 - 18:26
#21

Скиньте мне тоже клиентскую часть, а то писать что-то лень)))

panda, 24.06.2011 - 08:25
#22

Комменты ваще писец)

Лень читать доки - вон из профессии!

SofTie, 12.08.2011 - 16:20
#23

Даже если не лень читать просто с готовым решением проще разбираться.
Я пока понял даже не понял что в какой файл.
Что например имеется ввиду серверная часть.
db.php вроде подключение к базе, или я ошибаюсь.
config.php что тогда тут за конфиг
Я крутил, вертел и ничего не понял!!!
Толи я чет не до понимаю либо...

SASA, 23.08.2011 - 18:17
#24

Выложите еще и сам скрипт
Заранее спасибо...

SASA, 23.08.2011 - 18:23
#25

В чужом скрипте всегда лень ковыряться, уже бы выложил весь скрипт, а там мне например легче свой целиком написать)))))

Алашка, 17.09.2011 - 11:11
#26

Напишите как выводится сам html код. Т.е сами селекты как встраиваются в форму...

Mikluha, 16.12.2011 - 14:37
#27

Если можно скиньте и мне пожалуйста все скрипты. Спасибо

аноним, 17.12.2011 - 13:52
#28

И мне можно тоже скрипты! пожалуйста-пожалуйста!)

Ника, 23.12.2011 - 06:18
#29

Добрый день. Я начинающий РНР-программист, сейчас как раз на курсах по РНР, и у меня тоже возникла проблема с реализацией клиентской части. Пожалуйста, пришлите и мне архив со всеми скриптами и полностью рабочим кодом, а то ночь просидел и так и не получилось прикрутить Ваш код к моему проекту, так как с javascript совсем мало опыта. Заранее благодарен.

Максим, 14.01.2012 - 09:52
#30

Аналогичная проблема. Не разобрался DbSimple . просьба прислать готовое решение для сервера в архиве . ну или хотя б эти проклятые db.php а config.php я нашел.да только подключение к базе данных осущ. $DB = DbSimple_Generic::connect("mysql://brendbar_l2cri:memento@localhost/brendbar_bd");

l2cri, 2.02.2012 - 12:30
 
английский язык для начинающих
Ашманов Египет Москва РХТУ Россия США Снежинск Таиланд Тушино Урал Челябинская область Яндекс алкоголь английский язык баги база данных безопасность бизнес блоги взлом видео выставка выходные горные лыжи дайвинг дауншифтинг допинг идиотизм инвентарь интернет книги кэширование мозг море музей ноутбук образование оптимизация отдых отпуск пароль плагин пора сваливать программирование программисты путешествия работа работоспособность радиация реклама самогоноварение собеседование социальные сети спам стартап статистика страны тайм-менеджмент техника учеба фантастика фото фриланс хакер экология электронные деньги юмор Ajax CMS DbSimple DDOS email FireFox Google honda htaccess HTML javascript jQuery life md5 MySQL PHP SEO soft SQL vkontakte Web web 2.0 wordpress