Буквально сегодня, столкнулся с небольшой проблемой. Необходимо было создать выпадающий список городов России. На первый взгляд ничего сложного, но, когда речь идет о тысячах записей, на ум приходят мысли, что это может немного притормозить проект. По ходу статьи рассмотрим очень интересный метод, по созданию списка, с большим количеством записей в короткие сроки.

Мысль первая:

Использовать мультикрусор для добавления перед названиями городов тега:

<option>

image

Возникает новая проблема: у данного тега есть атрибут «value=' '», в который также необходимо вставить значение (в данном случае название города). Получается, выполняется почти двойная работа, и тут же вспоминаем что у нас не сотня записей, не две сотни а в перспективе тысячи. Данный метод для тех у кого есть вселенское терпение, а скорее всего даже для тех, кому просто нечем заняться.

Ладно, не будем об этом.

Мысль вторая:

Поискать готовое решение. Я искал, долго, настойчиво. Нашел кажется одно решение, и то, платное, но довольно качественное.

Мысль третья:

Написать самому, что я собственно и сделал. Далее я пошагово объясню что, как и куда.

Во-первых, нужно все-таки найти эти самые города. Лучше если это будет результат выведенный не в таблицах (например, с номерами регионов и с населением), а просто, в столбик.

Копируем вставляем в какой нибудь табличный процессор (например Excel). Я работаю под Ubuntu, поэтому покажу на примере LibreOffice Calc. Вставляем города во второй столбец, в первый столбец(во весь, как и в третий) вставляем символы " (' ", в третий " ') ". Должно получиться так:

image

Для чего все это? Объясню: все это нужно нам для SQL-запроса, который мы выполним чуть позже.

Далее, копируем все это и вставляем в редактор кода. Получается что-то на подобие этого:

image

Самое трудное позади. Теперь сформируем SQL запрос для создания таблицы в базе и занесения в нее наших данных. Выглядит он как-то так:

CREATE TABLE IF NOT EXISTS `city` (
  `name` varchar(128) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `city` (`name`) VALUES

Далее вставляем ранее сформированный нами для запроса список городов. Должно получиться вот так:

image

Готовый файл прикреплен в конце статьи.
Просто импортируйте его например в phpMyAdmin.

Создаем файл «city.php». Содержание файла:

<?php
	$cities_db = mysqli_connect ("localhost"," *Имя_пользователя* "," *Пароль* "," *Название_Базы* ");
	mysqli_query($cities_db,"SET NAMES 'utf8'");
	$result = mysqli_query($cities_db,"SELECT name FROM city ORDER BY name");

	while ($row = mysqli_fetch_assoc($result)) 
	{
		$city = $row['name']; 
		echo "<option value='$city'>$city</option>";
	}
?>

Подключаемся к базе, «вытаскиваем» записи и в цикле, создаем записи выпадающего списка вставляя название города и в атрибут value и между тегами. И, в необходимом месте нашего главного документа, просто подключим все это через include.

     <select name="city" id="" name="city">
          <?php
               include('city.php')
          ?>
     </select>

Результат, меня, честно, очень порадовал. Не смотря на то, что нужно затронуть PHP и MySQL, затрачивается в сотни раз меньше времени, чем просто «клепать» все это на HTML.

Все необходимые файлы я прикрепляю ниже. Спасибо за внимание! Успехов!

Файл city.php
Файл city.sql

Комментарии (14)


  1. WebMonet
    14.09.2015 14:33
    +11

    Эпик Фейл…


  1. andrew_tch
    14.09.2015 14:33
    -1

    Это что, серьезно, статья на Хабре?

    UPD: а, тьфу, песочница, все ок.


  1. amstr1k
    14.09.2015 14:33
    +2

    это просто гениально! Данная статья действительно заслуживает инвайта! Спасибо, ждём еще :D


  1. SilverFire
    14.09.2015 14:34
    +5

    Появилось ощущение, что я где-то в ~2005 году.


  1. sankir
    14.09.2015 14:36
    +7

    Я хотел бы посмотреть на упомянутое платное решение.


  1. HaruAtari
    14.09.2015 14:42
    +1

    Хбр торт!


  1. Lisio
    14.09.2015 14:43

    Уж если используете Sublime Text и в курсе про мультикурсор, то зачем вообще надо было использовать LibreOffice Calc?


  1. la0
    14.09.2015 14:46
    +1

    Ладно, абстрагируюсь от «это что, серьезно, статья на Хабре» и добавлю комментарий по сути дела:

    СУБД в такой постановке задачи совершенно не нужен, проще уж сгенерировать php-файлик $a=array('a','b'.....); или не php, а JS и собирать селект на клиенте.
    А еще лучше: прикрутить автокомплит

    Плюс есть еще куча решений, намного лучше как описанного в посте, так и в и в этом комментарии.


  1. amstr1k
    14.09.2015 14:50

    Есть же прекрасная замена в которой можно использовать регулярки. Давайте следующий экстеншен в студию с автокомплитом


  1. kentastik
    14.09.2015 14:51
    +1

    Статья оправдана, если автору 12 лет.

    Посмотрел профиль… нет, это всё же фэил.


  1. webportal
    14.09.2015 14:55
    +1

    О господи! http://joxi.ru/QY2LOqMSaNbOm6 http://joxi.ru/L4AkDO5hZ4YDrq
    Можно было в один твит уместить!


    1. berezuev
      14.09.2015 14:58
      +1

      Там еще нужно букву ё к «а-я» дописать, ибо саблайм ее не распознает просто так…


      1. Core2Duo
        14.09.2015 15:04
        +1

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

        Отдельное внимание следует уделять буквам с диакритическими знаками, наподобие русских Ё/ё, которые, как правило, разбросаны вне основных диапазонов символов.


  1. REZ1DENT3
    14.09.2015 15:13

    благодаря таким «программистам» (заметьте, в кавычках) и складывается у многих «хорошее» впечатление о PHP;)
    Хорошо что он хотя бы использует mysqli функции, а не оригинальное API mysql.
    Про PDO я молчу…

    «статья», конечно — феил…