A PHP Error was encountered

Severity: Notice

Message: Only variables should be passed by reference

Filename: codeigniter/Common.php

Line Number: 148

A PHP Error was encountered

Severity: Notice

Message: Only variables should be passed by reference

Filename: codeigniter/Common.php

Line Number: 148

A PHP Error was encountered

Severity: Notice

Message: Only variables should be passed by reference

Filename: codeigniter/Common.php

Line Number: 148

A PHP Error was encountered

Severity: Notice

Message: Only variables should be passed by reference

Filename: codeigniter/Common.php

Line Number: 148

A PHP Error was encountered

Severity: Notice

Message: Only variables should be passed by reference

Filename: codeigniter/Common.php

Line Number: 148

A PHP Error was encountered

Severity: Notice

Message: Only variables should be passed by reference

Filename: codeigniter/Common.php

Line Number: 148

A PHP Error was encountered

Severity: Notice

Message: Only variables should be passed by reference

Filename: codeigniter/Common.php

Line Number: 148

A PHP Error was encountered

Severity: Notice

Message: Only variables should be passed by reference

Filename: codeigniter/Common.php

Line Number: 148

A PHP Error was encountered

Severity: Notice

Message: Only variables should be passed by reference

Filename: codeigniter/Common.php

Line Number: 148

A PHP Error was encountered

Severity: Notice

Message: Only variables should be passed by reference

Filename: database/DB.php

Line Number: 133

Создаем поиск для сайта | MasterInWeb.Net

Создаем поиск для сайта

Неотъемлемой частью сайта, является поиск. В этом уроке мы научимся с Вами оздавать поиск для сайта. Мы попытаемся сделать скрипт не очень большим и сложным.

ОБРАБОТКА СТРОКИ ПОИСКА

Первое, что мы делаем с запросом – это обрезаем строку поиска функцией 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);

ЛОГИКА ПОИСКОВОГО ЗАПРОСА

Допустим, мы хотим предоставить пользователю возможность выбирать логику поиска - искать все слова или только одно из нескольких. Если вы хотите сделать как в Яндексе - два амперсанта означают "И" (слово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). ")";

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

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

$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 команды, которые могут вызвать неприятности.

ПОДВОДИМ ИТОГ

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

А ещё мы помогли пользователю скорее сориентироваться, сделав подсветку поисковых фраз и разделив найденный текст по страницам.

Просмотров: 12336      Дата: 14.06.2010 21:54:40
Понравился урок? Добавьте его к себе в закладки.

Последние уроки категории:

Сокращение PHP кода

Вы задумывались когда — нибудь о том, что лишний и бесполезный код убивает ваше время разработки приложения/сайта. Хотя это и кажется мелочью, но когда такой мелочи становится много, то время, потраченное впустую, становится ценным. И так давайте посмотрим, что можно и нужно сокращать...

Видимость переменных в PHP

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

Как читать Rss ленты?

Читалки и агрегаторы RSS используются для доступа, чтения и управления периодически-обновляемыми лентами RSS (или Atom), которые генерируются веб-сайтами. Эти ленты предоставляют доступ к последним материалам с этих сайтов.

Установка и настройка PHP+Apache

В этом уроке хотелось бы поднять очень интересную тему – Установка и настройка веб сервера PHP5 + Apache. В интернете довольно много различных инструкций по данной теме, но только вот в основном это копипаст, а не инструкция для человека, я же постараюсь объяснить все намного проще – на пальцах. Причина для установки локального вебсервера довольно много, например скорость выполнения и отладки скриптов, простота загрузки и модернизации контента и еще много чего.

Как выбрать фреймворк

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

Комментарии:

  • Алексей 11.11.2012 19:05:33
    Было бы не плохо если бы были исходники.
    Ответить
  • Ахмад 07.06.2013 21:47:50
    Очень хорошо было бы в видео формате и с исходниками. Я на сайте создал поисковик, плохо владею PHP. Когда вожу слово в поисковик, не выдает ошибки в коде но в новой окне браузера выдает: Информация по Вашему запросу на сайте не найдена. хотя на сайте есть это слово и в БД.
    Ответить
  • Осталось: 1000 символов.
    Сохранить комментарий Отправка комментария
lessons
downloads
search
hosting

Ищите хороший и не дорогой хостинг?

Хостинг avahost.ua
VPS VDS - виртуальный выделенный сервер
sistems
Обменник.ws