ФорумФорум  КалендарьКалендарь  ЧаВоЧаВо  ПоискПоиск  ПользователиПользователи  ГруппыГруппы  РегистрацияРегистрация  Вход  
Поиск
 
 

Результаты :
 
Rechercher Расширенный поиск
Последние темы
» Подтверждение о прочтении
автор worker8281 Сб Дек 27, 2014 1:05 pm

» Проблема с сессией
автор Murphy Ср Дек 03, 2014 5:20 pm

» Нужнга настройка SugarCRM
автор iliandr777 Пн Ноя 10, 2014 2:28 pm

» Отображение записей (адресатов) в списках адресатов
автор FatherMother Пн Авг 25, 2014 12:21 pm

» Нужен совет. Модуль с множеством одинаковых субпанелей.
автор Павел Пн Июл 28, 2014 12:55 pm

» Нужна помощь с опенкартом
автор manux86 Вс Фев 02, 2014 10:45 am

» вопрос работы насчет СУГАР на сервере
автор Meiir2 Пт Янв 31, 2014 8:46 am

» Интеграция с Google календарем от компании "Куб Три"
автор Dmitry.bereza Ср Авг 14, 2013 10:29 am

» настройка воронки продаж
автор EkaterinaGolovina Чт Июн 13, 2013 12:14 pm

Август 2018
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
2728293031  
КалендарьКалендарь
Баннеры
Яндекс цитирования статистика
Поддержка проекта
41001634550309

Поделиться | 
 

 Удобный и безопасный поиск на сайте

Перейти вниз 
АвторСообщение
Admin
Admin


Сообщения : 74
Очки : 71
Дата регистрации : 2010-08-23

СообщениеТема: Удобный и безопасный поиск на сайте   Пт Сен 10, 2010 3:21 am

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

Обработка строки поиска
Первое, что мы делаем с запросом – это обрезаем строку поиска функцией substr:
Код:

$search = substr($search, 0, 64);

64 символа вполне хватит пользователю для поиска по сайту.

Теперь наступает очеред вырезать все опасные и не нужные нам символы из строки:

Код:
$search = preg_replace("/[^(w)|(x7f-xff)|(s)]/", " ", $search);

По идее, разрешать пользователям искать по сайту небольшими запросами из 1-2 символом нельзя – при большой посещаемости это может стать причиной большой нагрузки на сервер, поэтому ограничим поиск поисковыми фразами только больше 2 символов.

Итак, разрешим искать только по словам, которые длиннее двух букв (если ограничение больше, надо заменить "{1,2}" на "{1, кол-во символов}"):
Код:

$good = trim(preg_replace("/s([^s]{1,2})s/", " ", ereg_replace("[ ]+", " "," $search
    ")));

Затем после замены ненужных символов неплохо было бы убрать двойные пробелы из нашего запроса (они были сделаны специально для корректного поиска коротких слов):

Код:
$good = ereg_eplace("[ ]+", " ", $good);


Логика поискового запроса
Допустим, мы хотим предоставить пользователю возможность выбирать логику поиска - искать все слова или только одно из нескольких. Если вы хотите сделать как в Яндексе [2] [1] - два амперсанта означают "И" (слово1&&слово2&&слово3) или как-то еще, то я не советчик. Шаманство со строками на небольшом сайте imho не оправдывает затраченного
времени. Поэтому форму для поиска рисуем так:

искать любое из слов или искать все слова

А в поисковом скрипте лишний раз проверяем, что пользователь ввел:

Код:
if ($logic!="and" && $logic!="or") $logic = "or";
Как будет использоваться логика —
ниже.


Релевантность поиска
Наверное, в том же Яндексе все видели ссылочку "сортировать по релевантности". Это оно и есть. Сортировка результатов по количеству совпадений слов.

Отчасти, кстати, такая сортировка снимает проблему обработки логики поиска. Но с БД
mysql делать такую сортировку очень сложно. Надо сперва выбрать, где есть все слова,
потом записи, где разные слова (исключив предыдущие). Если у вас постраничный вывод -
то вообще дело труба!

Статистика поиска
Неплохо будет сразу информировать пользователя, сколько он нашел строк таблицы. Для
этого делается дополнительный запрос в базу:

Код:
$query = "select id from table where field like '%". str_replace(" ", "%' or field
    like '%", $good). "%'";

Для статистики по отдельным словам можно сделать следующее:
Код:

$word = explode(" ", $search); while (list($k, $v) = each($word)) { if (strlen($v)>2)
    $stat[]="$v:". mysql_num_rows(mysql_query("select id from table where field like
    '%$v%'")); else $stat[]="$v: <font color=#cc0000>короткое</font>"; }; $word_stats =
    "Статистика слов: ". implode("", $stat). "<br />"; unset($stat);

Постраничный вывод результатов
Ну, когда у нас есть макет для поиска и количество строк результата поиска, сделать
постраничный поиск - пара пустяков. Проверяем переменную $page (не меньше 0, не больше
Код:

$results_amount/$rows_in_page).

В запрос, который подсчитывает количество строк (смотри выше), пишем нужные нам поля и поля для сортировки. А потом дописываем
Код:

if ($page==0) $request .= "limit $rows_in_page"; else $request .= "limit ".
    $page*$rows_in_page. ",". $rows_in_page; (синтаксис: limit <кол-во строк> либо limit
    <кол-во строк отступа>, <кол-во строк>)

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

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

Код:
if ($page>0) print ("<a href=search.php?search=". rawurlencode($good). "&page=".
    ($page-1). ">предыдущая страница</a>");


if ($page<$results_amount/$rows_in_page) print ("<a href=search.php?search=".
    rawurlencode($good). "&page=". ($page+1). ">следующая страница</a>");


Подсветка поисковых фраз
Для того, что бы подсветить поисковые запросы жирным шрифтом (а может быть определённым цветом, кому как больше нравиться), необходимо сделать всего лишь следующее:

Код:
$highlight = "(". str_replace(" ", "|", $good). ")";


Пробелы (а они у нас между словами стоят поодиночке, и нигде двойной пробел не встречается, к тому же с концов строки мы их тоже вырезали) достаточно заменить на вертикальную черту – разделитель вариантов в регулярных выражениях. "Плохие" слова мы не подсвечиваем, потому что в базе их не ищем Smile.

В коде, который выводит текст пишем:

Код:
$row["text"] = ereg_replace($highlight, "<font color=#cc0000>1</font>",
    $row["text"]);


Если же у вас в тексте встречаются html теги, то следует поступить вот так:

Код:
$text = eregi_replace(">([^<]*)$words", ">1<font color=#cc0000>2</font>3<", $text);

И в завершении я бы посоветовал сделать отдельную функцию, которая бы вырезала не только из поиска, но и вообще из всех полей ввода слова: INSERT, SELECT, DELETE и другие SQL команды, которые могут вызвать неприятности.

Подводим итог
Применяя все эти приёмы в совокупности (а именно так я и советую), можно добиться вполне неплохого поиска на собственном сайте, а вместе с этим сделать его безопасным для сайта и не дать пользователю, который хотел бы навредить сайту:

а) узнать программную структуру сайта;
б) вызвать перегрузку сервера бессмысленными запросами к базе данным;
в) пользовать не увидит ошибки, если в запрос попал запрещённый символ…


А ещё мы помогли пользователю скорее сориентироваться, сделав подсветку поисковых фраз и разделив найденный текст по страницам.
Вернуться к началу Перейти вниз
Посмотреть профиль http://easy-sugarcrm.forum2x2.ru
 
Удобный и безопасный поиск на сайте
Вернуться к началу 
Страница 1 из 1
 Похожие темы
-
» В этом сайте есть кто держит Типлеров
» Одежда-маркет. ОТЗЫВЫ
» Бескружные бойные голуби
» GialShop (Гиал Шоп) - Приглашаем к сотрудничеству организаторов совместных покупок. ЦЕНЫ НА САЙТЕ РОЗНИЧНЫЕ!

Права доступа к этому форуму:Вы не можете отвечать на сообщения
 :: PHP - статьи, советы-
Перейти: