Kwert-soft.ru

IT Софт для ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Форма поиска php

Поиск по сайту

Надыбал готовое решение формы поиска по сайту с использованием БД.

Имеется файл search.php и в нем след. код (установлен в самом начале страницы до :

и далее в теге body установлена форма для поиска:

и после нее стоит еще один код для вывода результатов:

HTML5
05.10.2013, 03:29

Поиск по сайту: не могу разобраться, как делать поиск по нескольким полям
поиск по одному полу осуществляется вот так: SELECT * from tablepart WHERE `marka` LIKE ‘%» .

Поиск по сайту
Здравствуйте! Проблема в том, что при введение любого слова в поиск, мне выводит каждый раз (хотя.

Поиск по сайту
Здрасте всем! Сделал сайт, сделал на нем форму поиска. А как сделать так, чтобы эта форма.

Поиск по сайту
Здравствуйте! Помогите пожалуйста сделать поиск по сайту. Таблица news. Три столбика: id.

05.10.2013, 04:032
05.10.2013, 08:13 [ТС]3

нет, как раз таки код универсальный. единственное что в полях:

я вставил свои значения базы данных, т.е.:

05.10.2013, 08:174

И база данных у вас точ в точ?

Добавлено через 1 минуту
Советую, смотреть что прилетает в каждую переменную, сверху вниз. (следом за интерпретатором)

05.10.2013, 11:27 [ТС]5

да все параметры БД теже.

Добавлено через 26 секунд

05.10.2013, 11:296
05.10.2013, 12:52 [ТС]7

есть некие поля page_id, title, desc, title_link, category, uniq_id кот. проверяются.

только как и где их прописать, я не пойму.

p.s.: в программировании я полный ноль (на php особенно)

05.10.2013, 12:598

Ну и как же мы с вами будем код отлаживать и искать ошибку.

Добавлено через 57 секунд

есть переменная, сюда попадает результат от запроса к базе данных. Нужно проверить, что туда попало.

Добавлено через 44 секунды
А вообще, нужно хоть почитать основы PHP иначе ничего толком вы не сделаете!

Добавлено через 1 минуту

06.10.2013, 00:08 [ТС]9

база создана! но в ней я таблицу не строил. т.к. видимо сам скрипт ее построит.

Добавлено через 49 секунд

06.10.2013, 00:5110
06.10.2013, 04:0711

Антон Терентьев, давайте так, вы прочтете книжку по PHP, MySQL, хотя бы азы, а потом мы с вами продолжим тему.

Дело в том, что даже если мы с вами и найдём ошибку, то потом будут опять вопросы. Вы согласны?!

Скажу ещё на вскидку, что скорее всего ошибка не в коде, а в том что вы не создали таблицу в БД, поэтому PHP ничего вам не находит.

06.10.2013, 16:49 [ТС]12

Вы абсолютно правы, я ничего не создавал в БД.

Поможете составить таблицу?

06.10.2013, 17:0013
11.10.2013, 19:01 [ТС]14

для составления таблицы полагаю требуется три поля (как минимум) для поиска в базе. эти самые поля обозвать, как допустим:
page_id — идентификатор страницы с новостью (допустим адрес этой странички, например, news1.html)
title — текст в заголовке новости
desc — текст самой новости
title_link — ссылка на страницу с новостью
а поля category и uniq_id думаю можно вообще удалить.

теперь!
вот есть страница с новостью (пример):

— page_id
— «Открытие сайта» — заголовок (title)
— «Сегодня мы открылись! Поздравьте нас!» — текст новости (desc)
— news1.html — title_link (ссылка на страницу с новостью)

вот теперь как поэтапно по этим данным создать БД именно для этого примера?

Форма поиска php

Как сделать алгоритм поиска по нескольким словам на PHP из БД

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

Имеется таблица «news», которая содержит следующие поля: id, title и content:

Требуется осуществить поиск по полю content в нашей базе данных, которая состоит из следующих столбцов, пример смотрите на картинке выше. Приступим к реализации. Для начала создадим страницу для тестирования работы. Она будет содержать форму с полем ввода ключевых слов и кнопку «найти»:

Листинг html кода:

В атрибутах формы прописываем путь к обработчику, содержащему алгоритм, и метод передачи post.

Для передачи массива отобранных элементов мы используем сессию.

Для этого мы запускаем ее в самом начале страницы.

Для вывода будем использовать функцию print_r().

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

Создадим обработчик search.php. Для начала запускаем сессию и подключаемся к базе данных:

Подробнее о подключении к базе данных через PDO смотрите в этой статье .

Работа алгоритма представлена на схеме:

Разберем выборку по первому слову, в качестве примера будем использовать поисковый запрос «как сделать сайт»:

Сначала в переменую $str получаем строку из формы методом POST. Разбиваем эту строку на слова через пробел с помощью функции expode и подсчитываем количество слов. Осуществляем запрос, в котором проверяем наличие первого слова в столбце content. Создаем пустой массив и записываем в него значения, полученные в результате выборки по запросу. Записываем в $id_count количество полученных элементов.

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

Эта часть алгоритма работает по принципу «отсеивания». Допустим в базе данных имеется десять статей. После выборки по первому слову мы получаем id статей в которых есть слово «как», таких статей оказалось шесть. Далее мы производим поиск второго слова среди этих шести статей, тем самым сузив круг поиска. В результате этой итерации остается четыре статьи, которые включают в себя оба слова «как» и «сделать». На последней итерации среди оставшихся четырех статей мы ищем слово «сайт». После этого прохода получаем id одной единственной статьи, которая включает в себя все ключевые слова.

Количество итераций равно количеству слов в поисковом запросе. Конечное количество полученных id может быть любым, в зависимости от запроса и содержимого таблицы базы данных.

Если в результате выполнения запроса в цикле мы получаем id (переменная temp), равное одному из id предыдущей выборки (id_mass[]), то этот id мы оставляем неизменным. В противном случаем мы присваиваем элементу id_mass[ j ] значение -1, тем самым исключив его из обработки.

После окончания работы циклов мы получаем массив из id, в которых найдены ключевые слова и -1. Чтобы передать пользователю только требуемые id, мы используем цикл, в котором идет проверка, в результате которой отбрасываются все элементы равные -1. Остальные же элементы мы передаем в массив сессии:

Функция header служит для перенаправления клиента на страницу поиска.

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

Смотрите также дополнительные статьи про MVC

Реализация поиска на сайте через PHP

У меня уже несколько раз просили написать статью о том, как реализовать поиск на сайте через PHP. Задача это непростая, я бы даже сказал — очень непростая, поскольку здесь имеется огромное количество нюансов и препятствий. В этой статье я разберу алгоритм поиска на сайте.

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

  1. Создать HTML-форму со строкой поиска, а также кнопкой «Submit«. В текстовое поле пользователи будут вводить поисковый запрос, а далее нажимать на кнопку.
  2. Получить поисковый запрос (как правило, передаваемый методом GET, но иногда применяют и POST), а также, в целях защиты от XSS, пропустить его через функцию htmlspecialchars().
  3. Сделать выборку из соответствующих таблицы (со статьями, новостями, заметками и прочим) тех записей, в которых содержится поисковый запрос. Показываю примерный SQL-запрос для таких случаев: SELECT * FROM articles WHERE `text_article` LIKE %search% Соответственно, вместо search подставляется строка поиска.
  4. Получив записи, в нужном виде выводим их, желательно, по релевантности. Я, например, сделал у себя на сайте так: где больше всего совпадений — та статья и релевантнее, следовательно, ставлю её первой. Скорее всего, Вам этот способ оценки релевантности тоже подойдёт.

Многие из Вас скажут, что ничего сложного здесь нет. И будут отчасти правы, однако, давайте разберём такой пример строки поиска: «ищу этот текст«. Встаёт вопрос: «А что, собственно, ищется?«. То ли ищется точное вхождение текста «ищу этот текст«. Или, быть может, ищется текст, где присутствуют все три слова, но которые могут следовать далеко не друг за другом. Или, возможно, ищется текст, где присутствует хотя бы одно из этих слов.

И вот здесь задача значительно усложняется. Можно сделать сложную систему синтаксиса (как в поисковых системах), например, ищется точное вхождение, если запрос задан в кавычках. А можно давать выбор пользователям, как именно они хотят проводить поиск (с помощью radio-кнопок). Таким образом, сделано у меня на сайте. Поэтому в предыдущий алгоритм добавляется ещё один пункт: составление SQL-запрос. Вот пример SQL-запроса, когда нужно вытащить все материалы, в которых имеется хотя бы одно слово из запроса «ищу этот текст«:

SELECT * FROM articles WHERE (`text_article` LIKE «%ищу%» OR `text_article` LIKE «%этот%» OR `text_article` LIKE «%текст%»)

Соответственно, в скрипте поиска Вы должны генерировать подобные SQL-запросы, посылать к базе данных, получать ответ и выводить его. Это всё ещё больше усложняется, если Вы выводите записи по релевантности, так как трудно сразу сказать, что должно быть релевантнее: 3 точных вхождения запроса, либо 10 вхождений частей запроса. У меня на сайте предпочтение всегда отдаётся точным вхожденияи, но этот момент уже достаточно спорен. Безусловно, это сложно, и если это Вы делаете в первый раз, то несколько часов Вы точно потратите. Надеюсь, что мой алгоритм реализации поиска на сайте через PHP Вам поможет.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 56 ):

    Михаил а вместо text_article Что ставить? Это адрес столбца? И как потом выводить данные правильно, а то я уже много способов перепробовал, не могу сделать так как нужно.

    text_article — это поле, в котором содержится полный текст материала, по которому и ведётся поиск. Выводить надо через SQL-запросы, а, получив result_set, разобрать его на одномерные массивы, элементы которого выводятся уже через echo.

    Михаил а вот если поиск реализуется по таблице users и ищет он только например по колонке name а если человек начинает вводить и фамилию то поиск ступорится и все найти ничего естесственно не может, сейчас у меня завпрос такой : («SELECT * FROM `users` WHERE `name` LIKE ‘%<$user_get>%'»); Пробую сделать вроде бы понятно и логично вот так : («SELECT * FROM `users` WHERE `name` LIKE ‘%<$user_get>%’ AND `familia` LIKE ‘%<$user_get>%'»); Все ровно не хочет искать=((( ЧТо делаю не так Михаил?!

    А зачем фигурные скобки здесь: <$user_get>? Попробуйте так: LIKE ‘%$user_get%’

    Так разницы то нет, разве что в скорости выполнения, а вот не могу понять как обьеденить в поисковом запросе 2 колонки familia и name — вопрос=) Я не могу, что не так сделал?!

    Ваш запрос какой-то не логичный. Как может у человека совпадать имя И фамилия? Поэтому могу предположить, что надо вместо AND поставить OR.

    Хорошо а вот если пользователь будет вводить в строке поиска и имя и фамилию?! Как тогда ?!

    Тогда не будет и там, и там $user_get. А, во-вторых, Вам надо будет решать, как обрабатывать данные, то ли выводить те записи, где совпало и имя, и фамилия (AND), то ли, где хотя бы одно совпадение (OR). Либо (как у меня в поиске) право выбора: совпадение «и там, и там», либо «там или там».

    А как тогда формировать запрос на совпадения и имени и фамилии?! Подскажите пожалуйста! Я впервые пишу поисковое ядро по 2м калонкам=( ПРи том что это все обрабатывается на аяксе без перезагрузке страницы=)

    Вы уже писали его, там где AND, только вместо $user_get должно быть что-то другое, в первом случае, имя, а в другом — фамилия.

    так в этом случае будет 2 строки поиска ведь?! А мне нужно чтоб все данные писались в одну поисковую строку!

    «SELECT * FROM `users` WHERE `name` LIKE ‘%<$user_name>%’ AND `familia` LIKE ‘%<$user_surname>%'» — где здесь 2 строки?

    ДА нет это то я сделал, а вот в самом поле ввода как оно должно распознаватся куда отнести это слово а куда это? К какому столбцу к имени или к фамилии?! у меня идет так xmlhttp.open(«GET», «getuser.php?name=» + str, true); xmlhttp.send(); за str берется 0е значение

    Значит, нужно добавить ещё одно поле, чтобы не только name=, но и &surname=

    Тогда как это реализованно например в том же контакте все в одной строке?!

    В одной строке, но с несколькими GET. /?a=5&b=7&c=10 — целых 3 параметра, и все в одной строке.

    ТАк все плывет бошка=) Спасибо вам! На сегодня думаю хватит работы=)

    Морфологический поиск на русском языке на PHP и MySQL

    Важной функцией на сайте является поиск по разделу или по всему сайту. Это позволяет пользователю быстро найти необходимую информацию. Чаще всего этот вопрос решается с помощью полнотекстового поиска или поиска по базе через выражение LIKE. Полнотекстовый поиск удобен тем, что перекладывает вопрос ранжирования страниц по релевантности на СУБД, позволяет искать фразы.

    Но вместе с тем накладывает некоторые ограничения, в частности, заставляет использовать таблицы типа MyISAM, не осуществляет поиск слов, короче 4-ех символов, создает дополнительные индексы. Поиск через выражение LIKE менее удобен для разработчика, так как работает медленнее, осложняет поиск фраз. Общим недостатком обоих подходов является невозможность морфологического поиска. Например, в каталоге товаров присутствет товар «Букет из желтых роз», при поиске по фразе «красные розы» пользователь не увидит этот товар в результатах. А хотелось бы, чтобы машина хоть немного понимала естественный язык. Решить эту проблему несложно на PHP и в этом нам поможет phpMorphy. phpMorphy позволяет решать следующие задачи:

    • Лемматизация (получение нормальной формы слова)
    • Получение всех форм слова
    • Получение грамматической информации для слова (часть речи, падеж, спряжение и т.д.)
    • Изменение формы слова в соответствии с заданными грамматическими характеристиками
    • Изменение формы слова по заданному образцу

    Поддерживаемые языки: Русский, Английский, Немецкий (AOT). Украинский, Эстонский (на основе ispell). Есть возможность добавить поддержку других языков при помощи myspell словаря. Словари можно взять здесь (http://sourceforge.net/projects/phpmorphy/files/phpmorphy-dictionaries/). Выбирайте в зависимости от версии библиотеки и кодировки.

    Поддерживаются различные кодировки:

    • все однобайтовые (windows-1251, iso-8859-* и т.п.)
    • Unicode кодировки — utf-8, utf-16le/be, utf-32, ucs2, ucs4.

    Следует учесть что использование этой библиотеки создаст некоторую дополнительную нагрузку на сервер при инициализации и работе.

    Для начала скачайте архив библиотеки и распакуйте его, например, в папку «phpmorphy» . По возможности в директории недоступной web серверу. Далее, скачайте словари с определенным языком и кодировкой и распакуйте их в папку «phpmorphy/dicts» данной библиотеки. Для инициализации библиотеки подключите файл common.php из папки «phpmorphy/src» и выставите настройки:

    С возможными опциями настройки библиотеки можно ознакомиться здесь (http://phpmorphy.sourceforge.net/dokuwiki/manual).

    Для поиска мы будем использовать следующий подход: слова в поисковой фразе будем приводить к их начальной форме, индексировать контент для поиска также, приводя отдельные слова к начальной форме, и в зависимости от частоты повторения и местонахождения слова — задавать ему вес, далее — искать по таблице индексов поисковую фразу и ранжировать результаты по весу.

    Для начала проиндексируем контент, по которому будет происходить поиск. В нашем примере поиск происходит по цветам в каталоге товаров. У товара есть идентификатор, наименование, краткое и полное описание. Кодировка — UTF-8, collate — utf8_bin . Создадим таблицу с товарами:

    и таблицу, в которой будут храниться индексы:

    здесь `word` — ключевое слово, `prod_id` — идентификатор товара, `weight` — вес слова. Каждая запись характеризуется уникальной парой слово-товар.

    Далее возьмем из базы все записи о товарах:

    При работе с библиотекой PhpMorphy cледует помнить, что термины в словарях хранятся в верхнем регистре, для удобства переведем контент в верхний регистр. Также возможно появление слов с буквой «ё» , collate utf8_bin гарантирует нам отсутствие ошибок, связанных с уникальностью ключей в таблице `prod2search` , так как буквы «е» и «ё» не будут считаться одним символом, однако будет неправильным если слова «ЗЕЛЕНЫЙ» и «ЗЕЛЁНЫЙ» будут индексироваться отдельно. Поэтому мы заменяем букву «ё» на «е» . В подробном описании могут содержаться html-теги, их мы не будем индексировать и от них следует избавиться.

    Здесь приведем скрипт, индексирующий товары, а далее дадим пояснения.

    Данное регулярное выражение разбивает контент на отдельные слова. Для кириллицы используется модификатор «u» . Следует помнить, что буква «ё» не попадает в диапазон «а-я» . Регулярное выражение корректно обработает такую строку:

    Массив $word_pma[1] содержит список отдельных слов.

    под $morphy мы подразумеваем экземпляр класса phpMorphy , $morphy->lemmatize() приводит слово в строке или массив слов к начальной форме и возвращает массив вида «Исходное слово» => Массив со списком слов в начальной форме . Метод lemmatize() по умолчанию сравнивает слово по словарям, при отрицательном результате пытается образовать начальную форму по внутренним правилам, если и это не удается вместо массива возвращается FALSE . В нашем примере мы использовали только русский словарь, но выбирали также и английские слова. Поэтому при невозможности образовать начальную форму мы индексировали входящее слово:

    повторяется в коде несколько раз потому что, нам необходимо выставить разный вес словам в зависимости от их местонахождения. Словам в заголовке мы задаем вес 3, словам в кратком описании — 2, в полном — 1. При повторе слова увеличиваем его вес.

    В итоге у нас получается массив $word для одного товара, который имеет вид «Слово» => «Вес» . Эти данные заносим в таблицу `prod2search` :

    Скрипт еще возможно улучшить, например, запретить индексирование определенных предлогов; индексировать определенные части речи, например, только существительные и прилагательные; исключать поиск по словам, которые присутствуют более чем в половине записей, к примеру слово «описание» входит в полное описание каждого товара и поиск по этому слову и никак не характеризует конкретный товар.

    Данный скрипт позволяет с нуля проиндексировать весь контент, и служит лишь дополнительной утилитой. В реальном приложении необходимо индексировать текстовый контент только при добавлении или редактировании конкретной записи. Для индексации контента воспользуемся приведенным выше скриптом, но только не будем использовать цикл и будем работать с одной записью. При редактировании, до внесения индексов в таблицу `prod2search` или при удалении товара — удалять неактуальные записи:

    где $prod_id — идентификатор редактируемого или удаляемого товара.

    Можно произвести некоторую оптимизацию. Допустим, кроме наименования, краткого и полного описания товар обладает еще несколькими характеристиками, и при редактировании пользователь меняет только цену. В этом случае индексированный контент не изменился и не требуется его повторная индексация. Этого можно избежать сравнив хеши индексируемого контента до и после редактирования товара. Сольем индексируемые поля в одну строку и получим ее хеш через md5($str) , далее вставим полученное значение в форму и передав данные на сервер сравним хеш до и после редактирования. Если хеши совпадут, значит контент не менялся и не требуется его переиндексация.

    После того как проиндексирован весь контент и таблица `prod2search` заполнена данными можно приступать к реализации поиска.

    Разберем запрос. Мы находим записи в таблице `prod2search` , в которых слова из списка слов в поисковой фразе WHERE `s`.`word` IN (» . implode ( «,», $sql ) . «) . При поиске по нескольким словам, несколько слов относятся к одному и тому же товару, чтобы товары в результате не дублировались мы группируем результат по товару GROUP BY `s`.`prod_id` . В этом же случае мы суммируем вес найденных слов для одного товара SUM(`weight`) AS `weight_sum` . Например, мы ищем «красные розы» — у товара, у которого оба слова встречаются в описании, вес будет больше, чем у товара с одним словом. Результаты выборки мы ранжируем по релевантности, то есть весу ORDER BY `weight_sum` DESC . Для того чтобы при поиске нескольких слов в результате мы получили только те товары, в описании которых встречаются ВСЕ попавшие в запрос слова, мы учитываем сколько слов для одного товара найдено COUNT(`s`.`prod_id`) AS `num` и ставим условие HAVING `num` = «.count ( $sql ).» . В данном случае реализуется логическое «И», соединяющие слова в поисковой фразе, для логического «ИЛИ» условие следует упустить. В итоге мы получаем список идентификаторов товаров, которые подходят под критерий поиска. Для наглядности записи с товарами мы берем вложенным запросом, однако на практике, возможно, лучшим решением будет взять список товаров отдельным запросом по их идентификаторам. Вариант запроса с логическим «ИЛИ» и лимитами будет работать значительно быстрее.

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

    Читать еще:  Проекты на php
    Ссылка на основную публикацию
    Adblock
    detector