Warning: array_merge(): Argument #2 is not an array in /hsphere/local/home/magistr/codeismy.name/wp-content/plugins/wp-pagenavi/scb/Options.php on line 46

Пишем свой поиск по базе

Дата: Март 29, 2009

(11) комментариев

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

Для начала нам потребуется естественно ворма ввода :)

Напишем простенькую форму

1
2
3
4
    <form action="search.php" method="get">
    Название магазина<br><input type="text" name="s" size="60" value=""><br>
    <input type="submit" name="submit" value="Искать">
    <input type="reset" name="reset" va

которая будет хранится в файле search.php

Далее нам надо написать пхп код для вывода. Зададимся количеством выданых результатов равным 10. Первым делом нам необходимо определиться с полями таблицы. Для примера я взял такие поля id, name, phone, address, category, email. По этим параметрам и будем производить поиск. Имя таблицы с каталогом db_catalog

Первым делом надо подключиться к базе для этого создадим функцию Search и добавим нужные поля

1
2
3
4
5
6
7
8
9
10
11
    function search ()
    {  global $rows,$link,$table;

    /* Соединение, выбор БД */

    $rows=10;

    $table='db_catalog';

    $link = mysql_connect("localhost", "логин к базе", "пароль") or die("Не соединилось!!!");
    mysql_select_db("magazin") or die("Не на

Получаем исходный текст для поиска в переменную

1
$text_to_search=$_POST['s'];

Далее нам надо посчитать количество записей , в которых мы нашли ключевые слова.Делаем мы это с применением запроса LIKE

1
    $id=mysql_query("SELECT id FROM $table WHERE name LIKE '%$text_to_search%' OR category LIKE '%$text_to_search%' OR phone LIKE '%$text_to_search%'")

таким образом мы сосчитаем колличество записей в базе

обернём всё это в if

1
2
3
4
    if ($id=mysql_query("SELECT id FROM $table WHERE name LIKE '%$text_to_search%' OR category LIKE '%$text_to_search%' OR phone LIKE '%$text_to_search%'"))
    {
    }
    else echo "Ничего не

Теперь добавим дополнительную обработку запросов, если всётаки записи были найдены и получим следующий код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    if ($id=mysql_query("SELECT id FROM $table WHERE name LIKE '%$text_to_search%' OR category LIKE '%$text_to_search%' OR phone LIKE '%$text_to_search%'"))
    {

    $count=intval(mysql_num_rows($id));

    //подсчитываем количество страниц
    if ($count%10 != 0) $count = intval($count/$rows)+1; else $count = intval($count/$rows);
    if(isset($_GET['page'])) $page = $_GET['page']; else $page=1;

    // задаём позицию которая будет посылаться через гет запрос с параметром page
    $page1 = $page*$rows-$rows;
    $page2 = $page1 + $rows;

    // посылаем запрос по поиску ключевых слов в базе
    $res = mysql_query("SELECT * FROM $table  WHERE name LIKE '%$text_to_search%' OR category LIKE '%$text_to_search%' OR phone LIKE '%$text_to_search%'" LIMIT ".$page1.", ".$page2);
    while ($row=@mysql_fetch_array($res) and $i<$rows)
    {
    $i++;
    $a=($page-1)*$rows+$i;

   

Теперь нам надо сделать чтоб скрипт шагал по страничкам

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    $i=0;
    $content .= '<br><center><form method="get"><input type="hidden" name="catalog" value="id"><input type="hidden" name="s" value="'.$_GET['s'].'" />';
    if(isset($_GET['page'])) $this_page=$_GET['page']; else $this_page=1;
    $i=$this_page-3;
    while ($i<=$this_page+1)
    {
    $i++;
    if($i>0)if($i<=$count)
    if($i!=$this_page) $content .= "<input type="submit" name="page" value="".$i."" />";
    else $content .= "&nbsp;&nbsp;".$i."&nbsp;&nbsp;";
    }

    $content .= "</center>";
    $content .= '</form></center>';
    echo $content;

Ну вот собственно и всё. Ключивой момент, на который советую обратить внимание это функция LIKE

код вызываем

1
   if(isset($_GET['s'])) search();

полный код скрипта

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
    <form action="search.php" method="get">
    Название магазина<br><input type="text" name="s" size="60" value=""><br>
    <input type="submit" name="submit" value="Искать">
    <input type="reset" name="reset" value="Очистить"></form>
<?php
    $table='db_catalog';

    function search ()
    {  global $rows,$link,$table;

    /* Соединение, выбор БД */

    $rows=10;

    $link = mysql_connect("localhost", "логин к базе", "пароль") or die("Не соединилось!!!");
    mysql_select_db("magazin") or die("Не найдена БД");

    mysql_query("SET NAMES 'cp1251';");
    $text_to_search=$_POST['s'];

    if ($id=mysql_query("SELECT id FROM $table WHERE name LIKE '%$text_to_search%' OR category LIKE '%$text_to_search%' OR phone LIKE '%$text_to_search%'"))
    {

    $count=0;
    while ($row=@mysql_fetch_assoc($id)) $count++;

    //подсчитываем количество страниц
    if ($count%10 != 0) $count = intval($count/$rows)+1; else $count = intval($count/$rows);
    if(isset($_GET['page'])) $page = $_GET['page']; else $page=1;

    // задаём позицию которая будет посылаться через гет запрос с параметром page
    $page1 = $page*$rows-$rows;
    $page2 = $page1 + $rows;

    // посылаем запрос по поиску ключевых слов в базе
    $res = mysql_query("SELECT * FROM $table  WHERE name LIKE '%$text_to_search%' OR category LIKE '%$text_to_search%' OR phone LIKE '%$text_to_search%'" LIMIT ".$page1.", ".$page2);
    while ($row=@mysql_fetch_array($res) and $i<$rows)
    {
    $i++;
    $a=($page-1)*$rows+$i;

    // выводим список магазинов
    echo $a.'. &nbsp;&nbsp; '.$row['name'].'<br />';
    }

    }

    else echo "Ничего не найдено";

    $i=0;
    $content .= '<br><center><form method="get"><input type="hidden" name="catalog" value="id"><input type="hidden" name="s" value="'.$_GET['s'].'" />';
    if(isset($_GET['page'])) $this_page=$_GET['page']; else $this_page=1;
    $i=$this_page-3;
    while ($i<=$this_page+1)
    {
    $i++;
    if($i>0)if($i<=$count)
    if($i!=$this_page) $co
a




    11 комментариев на "Пишем свой поиск по базе"

    Messir сказал:
    15.09.2009

    Если я правильно понял, полный код скрипта запихиваем в файл search.php, так?
    При запуске скрипта выводится форма поиска, а ниже выводится просто код. Что я неправильно делаю, подскажите…

    admin сказал:
    15.09.2009

    ну теоретически всё верно, только всё ж зависит от структуры вашей бд. и таблицы по которой ведётся поиск
    должны присутствовать поля
    id, name, phone, address, category, email пи чём поле id должно быть с праймари индексом

    Messir сказал:
    16.09.2009

    таблица присутствует, поля есть, данные есть. Как я понимаю, проблема в открывающих и закрывающих тегах <php

    З.Ы. Пароль для входа на почту так и не пришел(((

    admin сказал:
    17.09.2009

    а блин.. в статье реально есть нубская ошибка)))
    щас поправлю.. но 90% юзеров бы её даже не заметили а при вставке кода сами бы добавили)

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

    Dima сказал:
    29.10.2009

    Серей, а для поиска по базе в 100 тысяч строк это решение подойдет?

    Я так полагаю уже индекс понадобиться. Расскажите, пожалуйста, как его реализовать.

    Sergey сказал:
    29.10.2009

    подойдёт конечно,
    индекс надо будет поставить в зависимости от типа полей.. в каждом случае это может быть разный индекс для полей типа TEXT и LONGTEXT это индекс типа FULLTEXT (полнотекстный индекс) для полей типа VARCHAR это обычный индекс.
    кстати этот пример был взят из реально задачи ну только естественно изменённой:) поиск производится среди 50 миллиона записей (и постоянно растёт их число) так что 100 тысяч это не так то и много :)
    поиск осуществляется менее чем за 1 секунду .. а сама база весит 8 гиг

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

    Dima сказал:
    30.10.2009

    Понял. А то сперва думал, что придется индексацию вручную писать.

    А какой тип данных лучше использовать для текстового поля?

    Вот реальная строка:

    Работы ремонтно-монтажные; Монтаж, демонтаж и кап. ремонт сборных ж/б конструкций; Работы ремонтно-монтажные; Монтаж, демонтаж и кап. ремонт сборных ж/б конструкций

    Спасибо за статью и советы, если что постучу.

    Sergey сказал:
    30.10.2009

    в зависимости от размера.. если объём текста не большой то VARCHAR если большой то TEXT

    Dima сказал:
    17.11.2009

    У меня почему-то при поиске выдает содержимое всей таблицы фирм, независимо от поисковых запросов. В чем может быть проблема?

    Dima сказал:
    18.11.2009

    Разобрался. $text_to_search=$_POST['s']; нужно заменить на $text_to_search=$_GET['s'];

    Сергей, такой вопрос — как быть с русской морфологией? Насколько я понимаю fulltext индекс ее не поддерживает ?

    Остается что-то вроде http://valera.ws/2007.09.05~morpho_search_in_mysql/

    Sergey сказал:
    18.11.2009

    поищи по сайту.. я уже писал на эту тему статью … алгоритм стименга

    Продолжение дискуссии на форуме: link


    Вы можете продолжить обсуждение этой статьи на форуме


    Имя : 
    Почта : 
    Сайт : 
    Комментарий : 

    Проверка комментариев включена. Прежде чем Ваши комментарии будут опубликованы пройдет какое-то время.

    Создание сайта - Echo-group Раскрутка сайтов