Показать сообщение отдельно
  #11 (permalink)  
Старый 04.11.2016, 12:51
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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

Из всего сказано ясно, что именно живой поиск вам и нужен, а "могли ТОЛЬКО выбирать из предлагаемого списка вариантов", это и есть ваше ограничение, и имеет иной смысл.

Сообщение от veg
autocomplete у меня вообще OFF стоит.
Это атрибут формы/полей, а таким же образом называют и плагины которые и занимаются живым поиском, Их наплодили уже достаточно много, можете для интереса найти и просмотреть их демонстрации.

А теперь по вашему.

Города в базе нужно держать в отдельной таблице под уникальным идентификатором каждый. Вывод списка городов, это вывод названия города как текста опции, а его идентификатора как ее значения. Другими словами, в вашем случае лучше иметь костомизированный список, который будет работать в фонов режиме и отправлять на сервер выбор пользователя, а список UL отображать данные. Можно конечно поступить так как и у вас, но LI должны иметь в атрибутах идентификатор городов, которые передаются в скрытое поле при выборе, которое будет отправлять серверу выбор пользователя.

Если пользователь может выбрать только из предлагаемого, то скрытое поле должно очищаться уже при получении фокуса полем ввода поиска.

Если пользователь осведомлен, что он не может ввести произвольный город, а список предложений будет только в случае найденного, то сообщать что ничего не найдено большого смысла нет. Просто списка естественно не будет в этом, что и есть результат "не найдено", разве это не понятно и без сообщения?

$i=0;
while ($row = $db_referal -> fetch_array()) {
$i++;

Зачем этот не нужный счетчик? Сам результат запроса уже отвечает на этот вопрос - есть ли записи или нет - $db_referal->num_rows(). Если вернется более 0, значит есть совпадения, и сразу отдаем клиенту весь набор как JSON, если вместо $db_referal->fetch_array() использовать $db_referal->fetch_all():

$db_referal = $mysqli -> query("SELECT field_id, field_name from ".PREFIX."city WHERE city LIKE '%$referal%'"); //надеюсь баг с дырой будет исправлен
//отдаем клиенту результат и выход
exit(json_encode($db_referal->num_rows() ? $db_referal->fetch_all() : null));
//или проще, так как если не будет найдено то будет возвращен пустой массив
//и проверять количество возвращенный записей нет необходимости
exit(json_encode($db_referal->fetch_all() ?: null));


На клиенте:

//response выбросить
dataType: 'json',
success: function(data){
                    if($data) //строим и показываем список по полученным данным
                    else //ничего не найдено, списка не будет
                }


И еще раз - отдавать клиенту html с намеренно добавленным \n, кстати в Win, это \r\n (в РНР для этого есть константа PHP_EOL, она сама разберется что конкретно на платформе) это просто бессмысленно, мусор это. Идеальный html, это одна длиииииинная строка, а структуру его всегда можно просмотреть в отладчике.

Последний раз редактировалось laimas, 04.11.2016 в 12:57.
Ответить с цитированием