Sdscompany.ru

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

Php поиск в mysql

Разрабатываем функционал поиска по сайту на PHP и MySQL

Одна из самых популярных и необходимых функций на любом сайте – это поиск, реализованный с помощью специальной формы. Этот функционал позволяет посетителям быстро находить на сайте интересующий их контент.

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

Разрабатывать формы поиска при помощи PHP , а также познакомитесь с SQL ( Structured Query Language ) – специальным языком для сбора, записи и модификации информации, содержащейся в базах данных. Перед тем как начать, рекомендуем вам скачать файлы проекта .

Что вам понадобится

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

Создаем базу данных

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

Самым популярным инструментом для управления MySQL является PHP My Admin , Этого инструмента будет достаточно для нашего сегодняшнего руководства.

Создание таблицы

Наша таблица должна быть создана в следующем формате:

Таблица базы данных состоит из столбцов и строк, как в Excel . Первый столбец позволяет идентифицировать данные по имени. Далее идет колонка Data types ( тип данных ), которая указывает нам на тип данных, содержащихся в колонке. В поле Length ( Длина ) указывается максимальный объем памяти ( хранилища ) для столбца таблицы. Мы используем переменные, которые дают больше гибкости. Другими словами, если длина ФИО меньше 50 символов, то будет занята лишь часть отведенного места.

И среди данных персонала не может быть пустых значений ( null, empty ). Первая строка выделена желтым цветом, потому что столбец ID – наш основной ключ. Основной ключ в базе данных гарантирует, что каждая запись будет уникальной. К этой колонке также применен автоинкремент, а это значит, что каждой записи в нашей базе данных будет присваиваться уникальный номер автоматически.

Вносим представителей персонала в таблицу

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

Разработка формы

Чтобы создать форму поиска по сайту через Google , откройте любой подходящий текстовый редактор. Я рекомендую воспользоваться бесплатным PSPad . Вы можете использовать любой текстовый редактор, где предусмотрена подсветка синтаксиса. Это в значительной степени облегчит процесс написания и отладки PHP-кода . Создавая страницу для формы поиска, не забудьте сохранить ее в формате .php , иначе PHP-код не будет обрабатываться должным образом. Как только сохраните документ, скопируйте в него следующую разметку:

Если вы знакомы с языком HTML , то тут вам все должно быть понятно как минимум до открывающего тега form . Внутри этого тега находится важнейший элемент всего кода – атрибут action . В качестве действия нашей формы мы указали название нашего файла, а затем применили к нему строку запроса “ go ”.

Проверка на соответствие критерию

Когда пользователь вводит имя или фамилию, а затем нажимает кнопку подтверждения, форма передает данные самой себе и добавляет в конце строку запроса “ go ”. На данном этапе мы проверяем наличие строки запроса go . Если результат положительный, выводим результаты поиска.

До вывода запрашиваемых результатов нам нужно перепроверить: (1) была ли подтверждена форма, (2) содержит ли строка запроса значение go, (3) был ли поисковой запрос введен в нижнем или верхнем регистре? Если ни одна из проверок не дает положительного результата ( true ), то от нас не требуется выполнять какие-либо действия.

Для начала добавим небольшой блок кода PHP поиск по сайту после закрывающего тега :

Сначала мы открываем блок PHP-кода тегом ””.

Любой PHP-код внутри этой пары тегов будет исполняться сервером. Затем мы проверяем, была ли подтверждена форма:

Мы воспользуемся встроенной функцией isset , которая возвращает значение типа bool , и поместим в нее массив $_POST . Логическое выражение в программировании позволяет получить нам либо true , либо false .

Следовательно, если функция возвращает значение true , то форма была подтверждена, и нам нужно продолжить выполнение кода дальше. Если же функция возвращает значение false , то мы выведем сообщение об ошибке. Сохраните весь набранный код в файле search_submit.php .

Далее нам нужно проверить, имеется ли в строке запроса значение go :

Мы вкладываем еще одно условное логическое выражение внутрь основного, но только в этот раз мы используем массив $_GET вместе со значением “ go ”. Сохраните изменения в файле search_go.php .

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

Мы вкладываем еще одно условное логическое выражение внутрь наших двух. На этот раз мы используем регулярное выражение для проверки ввода. Мы используем встроенную функцию preg_match с двумя параметрами: регулярное выражение, и поле формы, к которому должна применяться проверка.

В нашем случае, это будет поле « Имя » ( name ). Чтобы извлечь параметры поиска, указанные посетителем, мы создаем переменную $name, и привязываем к ней значение POST с названием поля из формы, которое будет использоваться в SQL-запросе . Сейчас мы реализовали: (1) отправку данных формы, (2) строка запроса включает значение go и (3) посетитель ввел либо заглавную, либо строчную первую букву. И все эти проверки происходят еще до внесения изменений в базу данных. Сохраните все изменения.

Результаты Connect, Select, Query и Return из таблицы базы данных

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

Мы создаем переменную $db , и привязываем ее к встроенной функции MySQL mysql_connect , которая принимает три параметра: сервер с базой данных ( localhost , если вы работаете локально ), логин и пароль.

После этого мы запускаем встроенную PHP-функцию die , которая останавливает дальнейшее выполнение кода, если нет соединения с базой данных. И выводим информацию об ошибке, запуская встроенную функцию MySQL mysql_error , которая вернет причину ошибки. Сохраните файл search_connectdb.php .

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

Создаем переменную под названием mydb и привязываем ее ко встроенной MySQL-функции mysql_select_db , а затем указываем название базы данных, которую создали ранее. Далее мы опрашиваем таблицу базы данных при помощи SQL-запроса с переменной name, в которой содержатся параметры поиска, введенные посетителем:

При опросе таблицы базы данных мы создаем переменную $sql , и привязываем ее к строке, содержащей SQL-запрос . Мы используем оператор SELECT для извлечения значений из столбцов id , а также имени и фамилии из таблицы contacts . Затем мы используем инструкцию WHERE вместе со значениями имени и фамилии, чтобы сузить поиск.

Вместе с оператором LIKE мы используем знак процента (%) – спецсимвол, который возвращает 0 и более знаков, а также переменную name из строки поиска. В результате LIKE ( в сочетании со спецсимволом ) находит любое соответствующее имя в таблице базы данных. Можно описать весь процесс следующим образом: « Мы выбираем имя и фамилию из таблицы contacts , которые соответствуют введенным посетителем ». Сохраните файл search_query.php .

Далее нам нужно поместить результаты SQL-запроса в переменную, и запустить ее при помощи функции mysql_query , как показано ниже:

Мы создаем переменную $result , и присваиваем ей значение функции mysql_query () , внося ее в $query. Теперь наш запрос хранится в переменной result . Чтобы вывести результат в PHP , мы создаем цикл, а затем выводим данные в неупорядоченном списке:

Сначала мы создаем цикл while , внутри него создаем переменную под названием row , и инициализируем ее возвращаемым значением функции mysql_fetch_array , которая принимает переменную result , в которой находится наш SQL-запрос . Внутри цикла while мы присваиваем каждому значению столбца значение переменной с идентичным названием. Затем мы выводим значения внутрь неупорядоченного списка.

Здесь важно обратить внимание на два момента: (1) внутри цикла while не нужно присваивать значения переменным массива row , так как значения можно брать напрямую из массива row ; (2) тег anchor , который мы используем в названии нашего файла вместе с id и основным ключом. Причина этого заключается в том, что во многих поисковых элементах изначально ничего не отображается.

Так как мы показываем только имя и фамилию, приписывая ID в конце нашего тега anchor , то мы можем использовать ID для дополнительного запроса, который позволит вывести дополнительную информацию о персонале. Сохраните файл и протестируйте форму PHP поиска по сайту ( search_display.php ).

Убираем табуляцию

Результаты выводятся в виде неупорядоченного списка, но суть в том, что нам не нужна табуляция. Чтобы избавиться от нее, добавьте следующее CSS-правило в самое начало вашего файла в head :

Читать еще:  Поле со списком php

Поиск по буквам

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

Добавьте следующую строку кода после закрывающего тега form :

Здесь мы изменили четыре фрагмента кода скрипта поиска по сайту:

  • Мы используем функцию isset() , и вносим в нее массив $_GET , а затем проверяем значение by ;
  • Создаем переменную $letter и инициализируем ее значение массивом $_GET ;
  • Добавляем переменную letter в SQL-запрос ;
  • Указываем переменную letter внутри выражения, в котором получаем подсчитанное количество строк.

Сохраните файл search_byletter.php и проверьте результат.

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

Чтобы отобразить информацию об остальном персонале, которая передается через уникальное id внутри нашей ссылки, нужно добавить следующий код прямо после закрывающей фигурной скобки в скрипте letter , как показано ниже:

Здесь мы изменили четыре фрагмента кода:

  • Мы используем функцию isset() , и с ее помощью проверяем значение ID в массиве $_GET ;
  • Создаем переменную $contactid и инициализируем ее массивом $_GET ;
  • В таблице выделяем все, что отмечено звездочкой * . Звездочка – это сокращенное обозначение в SQL , которое означает « дайте мне все столбцы и строки из таблицы» . Чтобы определить, какую информацию выводить, мы упоминаем переменную contactid в конце SQL-выражения ;
  • Выводим дополнительную информацию о каждом представителе персонала.

Сохраните файл search_byid.php и проверьте результат.

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

SQL-инъекция

Причина, по которой мы добавили в наше поле поиска регулярное выражение, заключается в том, чтобы никто не смог вмешаться в наш SQL-запрос . Раньше эта проблема была распространена, и хакеры умудрялись проводить собственные SQL-запросы , манипулируя при этом вашим приложением. Например, если бы мы допустили возможность использовать апостроф в нашем поле, то хакер мог бы просто удалить базу данных, используя запрос:

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

В завершение

В сегодняшней статье мы рассмотрели, как сделать поиск по сайту, а также:

  • Создавать базы данных и соответствующие таблицы;
  • Использовать инструменты для управления базами данных, создавать столбцы и вводить данные;
  • Разрабатывать формы поиска на основе PHP , которая умеет осуществлять проверку вводимых данных, наличия переменных в запросе, а также соединяться с базой данных и выводить результаты из таблицы;
  • Как защитить приложение и базу данных от SQL-инъекций .

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

Данная публикация представляет собой перевод статьи « How to Create a Search Feature with PHP and MySQL » , подготовленной дружной командой проекта Интернет-технологии.ру

поиск в базе данных на php

Поиск по базе данных PHP
Написана страница клиентов, нужен поиск по номеру машины, как его организовать не знаю. Помогите.

Php + postgresql поиск по базе данных
Народ ну подскажите плиз, ни как не могу понять как допилить. Что нужно: 1. Есть большая база.

КАК сделать поиск пополю с базе данных на PHP.
помогите кто-нибудь сделать поиск по полю в базе данных. есть готовая. только поиск пополю не.

Доступ к базе данных на базе хранимых процедур MySQL из php
Добрый день возник вопрос по доступ к базе данных на базе хранимых процедур MySQL из php Из файла.

форма которая методом post будет отправлять из нашего текстового поля ФИО через переменную $fio скрипт(script.php), который уже и будет искать в базе.

————————
не забываем про Отзыв +1, если помог =)

action=»script.php». скрипт . пхп. это имя основного файла пхп в моей программе.
у меня главный файл называется f.php. значит вместо script.php надо будит написать f.php.

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

да, заменить на f.php, но в это файле надо будет заменить переменную $fio, где содержиться ФИО на $_POST[‘fio’], либо в начале скрипта просто приравнять $fio = $_POST[‘fio’]

да можно, но желательно видеть что за код в этом файле находиться.

всё так запутанно. (((. вы не могли бы мне туда всё вписать, если бы я вам скинула свою базу данных?

Добавлено через 7 минут
вот тот т п л файл

ну н езнаю..просто мне всё непонятно..а помочь некому((

Добавлено через 20 минут
пишет такую ошибку Parse error: syntax error, unexpected T_VARIABLE в строке
$query5 = («SELECT id, fio_r, fio_z,DATE(data), adres FROM spisok WHERE (FIO_r=’$fio_r’)»);
подскажите что тут неправильно написанно.

в итоге я написала вот так $query5 = mysql_query(«SELECT id, fio_r, fio_z,DATE(data), adres FROM spisok WHERE fio_r='».$fio_r.»‘;»,$dbl);
//$q5 = mysql_query($query);
$result = mysql_fetch_array($q);
echo «$f[‘fio_z’] $f[‘date’] $f[‘adres’]»;
но ругается на эту строчку :echo «$f[‘fio_z’] $f[‘date’] $f[‘adres’]»;. что-то тут не так.
а кстате на главной форме не отброжается никакого поля. только кнопка отправить. ((

Добавлено через 5 минут
и кстате ругается на эту первую строчку $fio_r = $_POST[‘fio_r’]
значит может и взапросе надо писать не
WHERE fio_r='».$fio_r.»‘;»,$dbl); а $_POST[‘fio_r’]
и тут неправильно:
//echo «$f[‘fio_z’] $f[‘date’] $f[‘adres’]»; блин ваще нифига непонятно..всё нихочет работать((((((((((((

в итоге я написала вот так:
<
$fio_r = $_POST[«fio_r»];
$query5 = mysql_query(«SELECT id, fio_r, fio_z,DATE(data), adres FROM spisok WHERE fio_r='».$fio_r.»‘;»,$dbl);
$result = mysql_fetch_array($q5); -> на эту строчечку ругается, бд выводится но вверху пишется ошибочка ( Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource)
я не знаю ещё что писать в echo. мне нужно что б выводился вот этот запрос..так как при нажатии на найденую фамилию должны выводится другие данные со второй формы..и это происходит в этом запросе:
$query = getSQLrow(«SELECT id, fio_r, fio_z,DATE(data), adres FROM spisok $query5 ORDER BY fio_r ASC»);
$smarty->assign(«spisokdeti»,$query);
> вот я и думаю как же мне echo записать правильно?((

Добавлено через 2 минуты
в хтмл коде у меня тоже уже фио_р

так что пусть может так и остаётся?

Добавлено через 2 минуты
в самом запросе WHERE fio_r='».$fio_r.»‘;»,$dbl); . может там надо где уже переменную $_POST[«fio_r»]; писать. или нет. не знаю кароче. при нажатии на кнопку отправить ничего не срабатывает!

Связь с базами данных MySQL

СУБД MySQL — одна из множества баз данных, поддерживаемых в PHP. Система MySQL распространяется бесплатно и обладает достаточной мощностью для решения реальных задач.

Краткое введение в MySQL

SQL — это аббревиатура от слов Structured Query Language, что означает структурированный язык запросов. Этот язык является стандартным средством для доступа к различным базам данных.

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

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

В MySQL определены три базовых типа данных: числовой, дата и время и строчный. Каждая из этих категорий подразделяется на множество типов. Основные из них:

Создание новой базы данных MySQL осуществляется при помощи SQL-команды CREATE DATABASE.

Создание новой таблицы осуществляется при помощи SQL-команды CREATE TABLE. Например, таблица books для книжного магазина будет содержать пять полей: ISBN, автор, название, цена и количество экземпляров: Чтобы избежать сообщения об ошибке, если таблица уже есть необходимо изменить первую строчку, добавив фразу «IF NOT EXISTS»:

Для создания автообновляемого поля с текущей датой типа TIMESTAMP или DATETIME используйте следующую конструкцию:

Добавление данных в эту таблицу осуществляется при помощи SQL-команды INSERT. Например:

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

Символ * означает, что необходимы все поля. Например:

Для получения доступа только к некоторому полю следует указать его имя в инструкции SELECT. Например:

Чтобы получить доступ к подмножеству строк в таблице, следует указать критерий выбора, который устанавливает конструкция WHERE. Например, чтобы выбрать имеющиеся в наличии недорогие книги о PHP, надо составить запрос: % Соответствует любому количеству символов, даже нулевых
_ Соответствует ровно одному символу

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

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

Сортировать можно и по нескольким столбцам. Вместо названий столбцов можно использовать их порядковые номера:

Для изменения ранее записанных в таблицу значений нужно воспользоваться командой UPDATE. Например, цену всех книг повысили на 10%:

Читать еще:  Content text html charset utf

Конструкция WHERE ограничит работу UPDATE определенным строками. Например:

Для удаления строк из базы данных используется оператор DELETE. Ненужные строки указываются при помощи конструкции WHERE. Например, какие-то книги проданы:

Если нужно удалить все записи

Для полного удаления таблицы используется:

Связь PHP с базой данных MySQL

Поработав с phpMyAdmin над созданием базы данных, можно приступить к подключению этой базы данных к внешнему Web-интерфейсу.

Чтобы получить доступ к базе данных из Web, используя PHP, надо сделать следующие основные шаги:

  • Подключение к серверу MySQL.
  • Выбор базы данных.
  • Выполнение запроса к базе данных:
    • добавление;
    • удаление;
    • изменение;
    • поиск;
    • сортировка.
  • Получение результата запроса.
  • Отсоединение от базы данных.

Для подключения к серверу базы данных в PHP есть функция mysql_connect( ). Ее аргументы: имя компьютера, имя пользователя и пароль. Эти аргументы можно опустить. По умолчанию имя компьютера = localhost, тогда имя пользователя и пароль не требуется. Если PHP используется в сочетании с сервером Apache, то можно воспользоваться функцией mysql_pconnect(). В этом случае соединение с сервером не исчезает после завершения работы программы или вызова функции mysql_close(). Функции mysql_connect() и mysql_pconnect() возвращают идентификатор подключения, если все прошло успешно. Например:

После того, как соединение с сервером MySQL установлено, нужно выбрать базу данных. Для этого используется функция mysql_select_db(). Ее аргумент: имя базы данных. Функция возвращает true, если указанная база данных существует и доступ к ней возможен. Например:

Для добавления, удаления, изменения и выбора данных нужно сконструировать и выполнить запрос SQL. Для этого в языке PHP существует функция mysql_query(). Ее аргумент: строка с запросом. Функция возвращает идентификатор запроса.

Пример 1

При каждом выполнении примера 1 в таблицу будет добавляться новая запись, содержащая одни и те же данные. Разумеется имеет смысл добавлять в базу данные, введенные пользователем.

В примере 2.1 приведена HTML-форма для добавления новых книг в базу данных.

Пример 2.1

Результаты заполнения этой формы передаются в insert_book.php.

Пример 2.2

В примере 2.2 введенные строковые данные обработаны функцией addslashes(). Эта функция добавляет обратные слеши перед одинарными кавычками (‘), двойными кавычками («), обратным слешем () и null-байтом. Дело в том, что по требованиям систаксиса запросов баз данных такие символы дожны заключаться в кавычки.

Для определения количества записей в результате запроса используется функция mysql_num_rows().

Все записи результата запроса можно просмотреть в цикле. Перед этим с помощью функции mysql_fetch_[] для каждой записи получают ассоциативный массив.

В примере 3.1 приведена HTML-форма для поиска определенных книг в базе данных.

Пример 3.1

Результаты заполнения этой формы передаются в search_book.php.

Пример 3.2

Альтернативный вариант

Итак, как работает архитектура Web-баз данных:

  1. Web-браузер пользователя выдает HTTP-запрос определенной Web-страницы. Например, пользователь, используя HTML-форму, ищет все книги о PHP. Страница обработки формы называется search_book.php.
  2. Web-сервер принимает запрос на search_book.php, извлекает этот файл и передает на обработку механизму PHP.
  3. PHP выполняет соединение с MySQL-сервером и отправляет запрос.
  4. Сервер принимает запрос к базе данных, обрабатывает его и отправляет результат (список книг) обратно механизму PHP.
  5. Механизм PHP завершает выполнение сценария, форматирует результат запроса в HTML. После этого результат в виде HTML возвращается Web-серверу.
  6. Web-сервер пересылает HTML в браузер, и пользователь имеет возможность просмотреть запрошенный список книг.

Использование механизма транзакций

Использование механизма транзакция на примере как передать деньги от одного человека другому

SELECT … FOR UPDATE

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

Чтобы избежать вышеупомянутой ситуации необходимо выполнить не просто SELECT запрос, а его расширенную версию, о которой многие и не подозревают: SELECT … FOR UPDATE.

Таким образом, при выполнении данного запроса, все затронутые записи в базе данных будут заблокированы до завершения сеанса работы с БД или до момента обновления данных записей. Другой скрипт не сможет выбрать заблокированные записи до тех пор, пока не наступит одно из упомянутых условий.

Однако не всё так просто. Вам нужно выполнить ещё несколько условий. Во-первых, ваша таблица должна быть создана на основе архитектуры InnoDB. В противном случае блокировка просто не будет срабатывать. Во-вторых, перед выполнением выборки необходимо отключить авто-коммит запроса. Т.е. другими словами автоматическое выполнение запроса. После того как вы укажите UPDATE запрос, необходимо будет ещё раз обратиться к базе и закоммитить изменения с помощью команды COMMIT:

Представьте что у нас есть 2 записи в таблице. Мы запускаем два параллельных скрипта с данным содержанием. В результате, первый процесс, который сможет достучаться до базы сделает выборку записи и сразу же заменит значение в поле locked на 1. В результате второй скрипт проигнорирует первую запись. В данном случае, даже если скрипты достучались бы до БД одновременно, второй скрипт всё равно не смог бы выбрать первую запись, т.к. при выборке первым процессом она будет заблокирована.

Морфологический поиск на русском языке на 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 . В нашем примере мы использовали только русский словарь, но выбирали также и английские слова. Поэтому при невозможности образовать начальную форму мы индексировали входящее слово:

Читать еще:  Определить количество элементов в массиве php

повторяется в коде несколько раз потому что, нам необходимо выставить разный вес словам в зависимости от их местонахождения. Словам в заголовке мы задаем вес 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 поиск в mysql

Первое, что нужно сделать после соединения с СУБД — это выполнить проверку, что оно было успешным.

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

Соединение с MySQL устанавливается один раз в сценарии, а затем используется при всех запросах к БД.

Результатом выполнения функции mysqli_connect() будет значение специального типа — ресурс.

Если подключение к MySQL не удалось, то функция mysqli_connect() вместо ресурса вернет логическое значение типа «ложь» — false .

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

Соединение с MySQL и проверка на ошибки:

Функция mysqli_connect_error() просто возвращает текстовое описание последней ошибки MySQL.

Установка кодировки¶

Первым делом после установки соединения крайне желательно явно задать кодировку, которая будет использоваться при обмене данными с MySQL. Если этого не сделать, то вместо записей со значениями, написанными кириллицой, можно получить последовательность из знаков вопроса: . . Вызови эту функцию сразу после успешной установки соединения: mysqli_set_charset($con, «utf8»);

Выполнение запросов¶

Установив соединение и определив кодировку мы готовы выполнить свои первые SQL-запросы. Ты уже умеешь составлять корректные SQL команды и выполнять их через консольный или визуальный интерфейс MySQL-клиента.

Те же самые запросы можно отправлять без изменений и из php-сценария. Помогут в этом несколько встроенных функций языка.

Два вида запросов¶

Следует разделять все SQL-запросы на две группы:

  • Чтение информации ( SELECT ).
  • Модификация ( UPDATE , INSERT , DELETE ).

При выполнении запросов из среды PHP, запросы из второй группы возвращают только результат их исполнения: успех или ошибку.

Запросы первой группы при успешном выполнении возвращают специальный ресурс результата. Его, в свою очередь, можно преобразовать в ассоциативный массив (если нужна одна запись) или в двумерный массив (если требуется список записей).

Добавление записи¶

Вернёмся к нашему проекту — дневнику наблюдений за погодой. Начнём практическую работу с заполнения таблиц данными. Для начала добавим хотя бы один город в таблицу cities .

Выражение INSERT INTO используется для добавления новых записей в таблицу базы данных.

Составим корректный SQL-запрос на вставку записи с именем города, а затем выполним его путём передачи этого запроса в функцию mysqli_query() , чтобы добавить новые данные в таблицу.

Обратите внимание, что первым параметром для функциии mysqli_query() передаётся ресурс подключения, полученный от функции mysqli_connect() , вторым параметром следует строка с SQL-запросом.

При запросах на изменение данных (не SELECT ) результатом выполнения будет логическое значение — true или false .

false будет означать, что запрос выполнить не удалось. Для получения строки с описанием ошибки существует функция mysqli_error($link) .

Функция insert id: как получить идентификатор добавленной записи¶

Следующим шагом будет добавление погодной записи для нового города.

Погодные записи хранит таблица weather_log , но, чтобы сослаться на город, необходимо знать идентификатор записи из таблицы cities .

Здесь пригодится функция mysqli_insert_id() .

Она принимает единственный аргумент — ресурс соединения, а возвращает идентификатор последней добавленной записи.

Теперь у нас есть всё необходимое, чтобы добавить погодную запись.

Вот как будет выглядеть комплексный пример с подключением к MySQL и добавлением двух новых записей:

Чтение записей¶

Другая частая операция при работе с базами данных в PHP — это получение записей из таблиц (запросы типа SELECT ).

Составим SQL-запрос, который будет использовать SELECT выражение. Затем выполним этот запрос с помощью функции mysqli_query() , чтобы получить данные из таблицы.

В этом примере показано, как вывести все существующие города из таблицы cities :

В примере выше результат выполнения функции mysqli_query() сохранён в переменной $result .

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

Чтобы получить действительные данные, то есть записи из таблицы, следует использовать другую функцию — mysqli_fetch_array() — и передать ей единственным параметром эту самую ссылку.

Теперь каждый вызов функции mysqli_fetch_array() будет возвращать следующую запись из всего результирующего набора записей в виде ассоциативного массива.

Цикл while здесь используется для «прохода» по всем записям из полученного набора записей. Значение поля каждой записи можно узнать просто обратившись по ключу этого ассоциативного массива.

Как получить сразу все записи в виде двумерного массива¶

Иногда бывает удобно после запроса на чтение не вызывать в цикле mysqli_fetch_array для извлечения очередной записи по порядку, а получить их сразу все одним вызовом. PHP так тоже умеет. Функция mysqli_fetch_all($res, MYSQLI_ASSOC) вернёт двумерный массив со всеми записями из результата последнего запроса.

Перепишем пример с показом существующих городов с её использованием:

Как узнать количество записей¶

Часто бывает необходимо узнать, сколько всего записей вернёт выполненный SQL запрос.

Это может помочь при организации постраничной навигации, или просто в качестве информации.

Узнать число записей поможет функция mysqli_num_rows() , которой следует передать ссылку на результат запроса.

Ссылка на основную публикацию
Adblock
detector