Главная > Статьи > Поиск на AJAX (аяксе), 'Живой поиск' - поиск без перезагрузки страницы

Поиск на AJAX (аяксе), 'Живой поиск' - поиск без перезагрузки страницы

1
19.09.2012 09:41

    По просьбе одного из пользователей я решил сделать небольшой ликбез про то как создать своего рода "Живой поиск" на php и avascript, т.е. используя систему AJAX.

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

    Но в данном случае я решил, что достаточно будет все лишь проверки на отсутствие строки состоящей из пробелов.

    Так же кто не знает, что такое "Живой поиск" - это поиск осуществляющийся без перезагрузки страницы, с незамедлительной выдачей результатов.

    Первое, что мы сделаем - это создадим файлик index.php с 3-мя полями которые нам будут служить:
   1. Для ввода поискового запроса (input типа text);
   2. Для подсчитывания количество символов в тексте (скрытый input);
   3. Для дублирования текста поискового запроса (скрытый input);
а также создаем блок div с id = search_result для результатов поиска и подключим в шапке библиотеку jquery.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru-ru" lang="ru-ru" >
<head>
<script type="text/javascript" src="http://yandex.st/jquery/1.8.1/jquery.min.js"></script>
</head>
<body>
<input id="search_words" type="text" />
<input id="count_chars" type="hidden" value="0" />
<input id="re_chars" type="hidden" value="" />
<div id="search_result"> </div>
</body>
</html>

    Следующим шагом будет javascript, объясню кратко логику работы скрипта. После загрузки страницы, а именно после загрузки DOM - модели страницы у нас запускается таймер который с периодичностью (сами можете указать в микросекундах) 1000 микросекунд - 1 секунда, будет запускать проверку на наличие текста в поле ввода поискового запроса. В скрытых полях с id = count_chars будет храниться количество символов введенных поле (после загрузки страницы равен 0), в поле с id = re_chars хранится копия запроса потому как только по количеству символов мы не сможем определить изменился ли запрос или нет. После изменения в поле запроса проверяется и сравнивается длина и содержимое текста с выше указанными полями, если изменился - отправляем запрос серверу.

    Скрипт для обработки данных введенных в поле поиска:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru-ru" lang="ru-ru" >
<head>
<script type="text/javascript" src="http://yandex.st/jquery/1.8.1/jquery.min.js"></script>
<script type="text/javascript">
function getSearchInput(){
var maskInput = $("#search_words").val();
var cStart = $("#count_chars").val();
var countChars = maskInput.replace(/\s+/g, "").length;
if(countChars != 0)
{
var cStartw = $("#re_chars").val();
var searchInput = $("#search_words").val();
}
else
{
var cStartw = ""
var searchInput = ""
}
if(cStart != countChars || cStartw != searchInput)
{
$("#count_chars").val(countChars);
$("#re_chars").val(searchInput);
}
}
$(document).ready(function(){
setInterval(getSearchInput,1000);
});
</script>
</head>
<body>
<input id="search_words" type="text" />
<input id="count_chars" type="hidden" value="0" />
<input id="re_chars" type="hidden" value="" />
<div id="search_result"> </div>
</body>
</html>

    Дальше подготовим базу данных для поиска нужного нам значения выполнив запрос в вашем phpMyAdmin или любом другом MySQL клиенте (Естественно если вы будете использовать данную схему в реальных проектах то данные базы данных будут другие и скорее всего вам не потребуется создавать базу отдельно!!!):

CREATE DATABASE metal;
USE metal;
CREATE TABLE metal_name (name_metal VARCHAR(255));
INSERT INTO metal_name (name_metal) VALUES ('iron'),('good iron'),('bad iron'),('cloud metal'),('better metal'),('loopers'),('all metal'),('pre_metal');

    Следующим шагом будет дополнение нашего файла php кодом который будет обрабатывать запрос и приведем его в такой вид:

<?php
   if(isset($_GET["search_words"])){
      $db_name = "metal";//Здесь название вашей базы данных
      $db_user = "a";//Здесь имя пользователя базы данных
      $db_password = "a";//Здесь пароль вашего пользователя
      $db_host = "localhost";//Здесь хост или IP адрес серевера MySQL
      $html = "";
      $search_words = $_GET["search_words"];
      if(!mysql_connect($db_host,$db_user,$db_password))
      exit("NO CONNECT TO MYSQL");
      $db = mysql_select_db($db_name);
      $query = "SELECT * FROM metal_name WHERE name_metal LIKE '%{$search_words}%'";
      $pre_result = mysql_query($query);
      while($result = mysql_fetch_assoc($pre_result)){
         $result = str_replace($search_words,"<b><i>".$search_words."</i></b>",$result["name_metal"]);
         $html .= "<p>".$result."</p>";
      }
      echo !empty($html)?$html:"No result";
   }
   else {
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru-ru" lang="ru-ru" >
<head>
   <script type="text/javascript" src="http://yandex.st/jquery/1.8.1/jquery.min.js"></script>
   <script type="text/javascript">
      function getSearchInput(){
         var maskInput = $("#search_words").val();
         var cStart = $("#count_chars").val();
         var countChars = maskInput.replace(/\s+/g, "").length;
         if(countChars != 0)
         {
            var cStartw = $("#re_chars").val();
            var searchInput = $("#search_words").val();
         }
         else
         {
            var cStartw = "";
            var searchInput = "";
         }
         if(cStart != countChars || cStartw != searchInput)
         {
            $("#count_chars").val(countChars);
            $("#re_chars").val(searchInput);
         }
      }
      $(document).ready(function(){
         setInterval(getSearchInput,1000);
      });
   </script>
</head>
<body>
   <input id="search_words" type="text" />
   <input id="count_chars" type="hidden" value="0" />
   <input id="re_chars" type="hidden" value="" />
   <div id="search_result"></div>
</body>
</html>
<?php } ?>

    Ну и на конец добавим javascript AJAX запрос который будет выгружать результат на страницу:

$("#search_result").load("index.php?search_words=" + searchInput);

    В итоге имеем файл с таким содержимым:

<?php
   if(isset($_GET["search_words"])){
      $db_name = "metal";//Здесь название вашей базы данных
      $db_user = "a";//Здесь имя пользователя базы данных
      $db_password = "a";//Здесь пароль вашего пользователя
      $db_host = "localhost";//Здесь хост или IP адрес серевера MySQL
      $html = "";
      $search_words = $_GET["search_words"];
      if(!mysql_connect($db_host,$db_user,$db_password))
      exit("NO CONNECT TO MYSQL");
      $db = mysql_select_db($db_name);
      $query = "SELECT * FROM metal_name WHERE name_metal LIKE '%{$search_words}%'";
      $pre_result = mysql_query($query);
      while($result = mysql_fetch_assoc($pre_result)){
         $result = str_replace($search_words,"<b><i>".$search_words."</i></b>",$result["name_metal"]);
         $html .= "<p>".$result."</p>";
      }
      echo !empty($html)?$html:"No result";
   }
   else {
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru-ru" lang="ru-ru" >
<head>
   <script type="text/javascript" src="http://yandex.st/jquery/1.8.1/jquery.min.js"></script>
   <script type="text/javascript">
      function getSearchInput(){
         var maskInput = $("#search_words").val();
         var cStart = $("#count_chars").val();
         var countChars = maskInput.replace(/\s+/g, "").length;
         if(countChars != 0)
         {
            var cStartw = $("#re_chars").val();
            var searchInput = $("#search_words").val();
         }
         else
         {
            var cStartw = "";
            var searchInput = "";
         }
         if(cStart != countChars || cStartw != searchInput)
         {
            $("#search_result").load("index.php?search_words=" + searchInput);
            $("#count_chars").val(countChars);
            $("#re_chars").val(searchInput);
         }
      }
      $(document).ready(function(){
         setInterval(getSearchInput,1000);
      });
   </script>
</head>
<body>
   <input id="search_words" type="text" />
   <input id="count_chars" type="hidden" value="0" />
   <input id="re_chars" type="hidden" value="" />
   <div id="search_result"></div>
</body>
</html>
<?php } ?>

    Это не идеальный код для "Живого поиска" - но мои заказчики и пользователи остались довольны!

Twitter
Нравится
SocButtons v1.4
 

Комментарии 

 
# Антон 24.12.2012 20:51
Очень хотелось бы демо
Ответить | Ответить с цитатой | Цитировать
 
 
# Антон 26.12.2012 19:59
Проверил код, все работает

Но ваш код исполняется постоянно, как сделать чтобы он выполнялся только по изменению текста в инпут? Спасибо
Ответить | Ответить с цитатой | Цитировать
 
 
# Roket007 26.12.2012 20:59
Ну смотрите, постоянно исполняется код исключительно на проверку изменений в поле input, а запросы к базе выполняются исключительно когда значение в поле изменилось!
Другой вариант - это мониторинг событий, а именно событий нажатия клавиш! Если вам нужен данный функционал с радостью вам помогу!
Ответить | Ответить с цитатой | Цитировать
 
 
# Roket007 26.12.2012 21:00
Примером к данному коду служит поиск в разделе "Задать вопрос"!
Ответить | Ответить с цитатой | Цитировать
 
 
# sl 06.02.2013 15:54
$search_words предопределена не правильно или должно быть включено Register_global , что противоречит современным тенденциям безопастности.
Допилил, использую, спасибо.
Ответить | Ответить с цитатой | Цитировать
 
 
# Игорь 05.03.2013 14:51
Цитирую sl:
$search_words предопределена не правильно или должно быть включено Register_global , что противоречит современным тенденциям безопастности.
Допилил, использую, спасибо.

Ну Вы бы поделились правильным кодом. Спасибо
Ответить | Ответить с цитатой | Цитировать
 
 
# Roket007 05.03.2013 21:05
Цитирую Игорь:
Цитирую sl:
$search_words предопределена не правильно или должно быть включено Register_global , что противоречит современным тенденциям безопастности.
Допилил, использую, спасибо.

Ну Вы бы поделились правильным кодом. Спасибо

В примере уже исправленный код!
Ответить | Ответить с цитатой | Цитировать
 
 
# Roket007 07.02.2013 15:53
Спасибо за замечание - поправим!
Ответить | Ответить с цитатой | Цитировать
 
 
# Ваня 19.06.2013 18:05
у меня не работает
Ответить | Ответить с цитатой | Цитировать
 
 
# Roket007 19.06.2013 19:47
Эти вопросы вам предназначались :) Немного промазал:)
Ответить | Ответить с цитатой | Цитировать
 
 
# Roket007 19.06.2013 19:45
1. Denwer (или люб. другой локальный сервер запущен)?
2. SQL запрос выполнили?
3. Файл навали index.php?
4. Что пишет консоль браузера?
Ответить | Ответить с цитатой | Цитировать
 
 
# Владимир 22.07.2013 19:15
Спасибо большое!
То что надо!
Ответить | Ответить с цитатой | Цитировать
 
 
# Roket007 23.07.2013 07:17
Пожалуйста!
Ответить | Ответить с цитатой | Цитировать
 
 
# Bit 06.11.2013 23:19
Здравствуйте. Скрипт работает, но вот проблема, при выводе результатов он их выводит вместо поля ввода дублирую хтмл код на экран ниже
Ответить | Ответить с цитатой | Цитировать
 
 
# Roket007 07.11.2013 15:51
Вы копировали мой код или интегрировали в свою страницу?
Ответить | Ответить с цитатой | Цитировать
 

Добавить комментарий


Защитный код
Обновить

 

Сторонние

Модуль новостей для Joomla - JU News Ultra
14.11.2011 |  9007
Модуль вывода новостей JU News Ultra - еще один способ...

Новости

Безопасность смартфона — пин-код с текущим временем, Screen Lock – Time Password
IT мир
20.10.2014 |  1156
Любой владелец смартфона всегда с опаской вводит пин-код разблокировки, ведь...
Alien: Isolation — прими участие в фильме «Чужой»
IT мир
20.10.2014 |  1025
Creative Assembly можно поздравить, впрочем, как и геймеров. Игра Alien:...
Серия «кожаных» ноутбуков от Samsung продолжается: Chromebook 2 с пассивным охлаждением
IT мир
20.10.2014 |  940
Samsung продолжило серию «одетых в кожу» ноутбуков. Новая модификация Chromebook...
3D-принтер iBox Nano — компактность, доступность и долговечность
IT мир
20.10.2014 |  1028
Громоздкие и дорогие 3D-принтеры слишком медленно распространяются. Для популяризации 3D-печати...