Как сделать поиск по бд в php

Обновлено: 30.06.2024

Сегодня мы сделаем поиск, который поможет посетителям вашего сайта найти нужную информацию.

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

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

Мы создадим 2 файла: search.php — он будет содержать HTML форму и javascript, и do_search.php — в этом файле будет алгоритм поиска.

Это обычная html форма, которая будет отправлять запрос файлу do_search.php методом POST. Код файла do_search.php:

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

Таким образом мы создали простую поисковую форму для показа результатов без перезагрузки страницы.

PHP поддерживает работу с базой данных MySQL.
Специальные встроенные функции для работы с MySQL позволяют просто и эффективно работать с этой СУБД: выполнять любые запросы, читать и записывать данные, обрабатывать ошибки.
Сценарий, который подключается к БД, выполняет запрос и показывает результат, будет состоять всего из нескольких строк. Для работы с MySQL не надо ничего дополнительно устанавливать и настраивать; всё необходимое уже доступно вместе со стандартной поставкой PHP.

Что такое mysqli?

mysqli (MySQL Improved) — это расширение PHP, которое добавляет в язык полную поддержку баз данных MySQL. Это расширение поддерживает множество возможностей современных версий MySQL.

Как выглядит работа с базой данных

Типичный процесс работы с СУБД в PHP-сценарии состоит из нескольких шагов:

  1. Установить подключение к серверу СУБД, передав необходимые параметры: адрес, логин, пароль.
  2. Убедиться, что подключение прошло успешно: сервер СУБД доступен, логин и пароль верные и так далее.
  3. Сформировать правильный SQL запрос (например, на чтение данных из таблицы).
  4. Убедиться, что запрос был выполнен успешно.
  5. Получить результат от СУБД в виде массива из записей.
  6. Использовать полученные записи в своём сценарии (например, показать их в виде таблицы).

Функция mysqli connect: соединение с MySQL

Перед началом работы с данными внутри MySQL, нужно открыть соединение с сервером СУБД.
В PHP это делается с помощью стандартной функции mysqli_connect() . Функция возвращает результат — ресурс соединения. Данный ресурс используется для всех следующих операций с MySQL.

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

  • Адрес сервера СУБД;
  • Логин;
  • Пароль.

Если вы следовали стандартной процедуре установки MySQL или используете OpenServer, то адресом сервера будет localhost , логином — root . При использовании OpenServer пароль для подключения — это пустая строка ‘’, а при самостоятельной установке MySQL пароль вы задавали в одном из шагов мастера установки.

Базовый синтаксис функции mysqli_connect() :

Проверка соединения

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

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

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

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

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

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

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

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

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

  1. Чтение информации (SELECT).
  2. Модификация (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() будет возвращать следующую запись из всего результирующего набора записей в виде ассоциативного массива.

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

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

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

Часто бывает необходимо узнать, сколько всего записей вернёт выполненный SQL запрос.
Это может помочь при организации постраничной навигации, или просто в качестве информации.
Узнать число записей поможет функция mysqli_num_rows() , которой следует передать ссылку на результат запроса.

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


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

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

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

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

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

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

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

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

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


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

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

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


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

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

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

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

Здравствуйте. В базе данных есть таблица slovo , ее структура:

Есть переменная: $text, которая содержит в себе некий текст.

В таблице slovo есть запись: name = Яблоко , name = дерево

Вопрос: каким образом определить, есть ли в переменной слова, которые находятся в таблице slovo , и если есть, то эти слова выделить в слово , где id_slovo - значение id для этого слова из базы.

P.S. Учитывая то, что может быть и словосочетания.

Буду очень благодарен за любую полезную информацию.


@MikhailVaysman, желательно конечно. Было бы здорово. Но не обязательно. Главное чтоб на регистр(заглавные, строчные) не обращало внимания, то сеть, слова яблоко и Яблоко - принимались как одно и тоже.

Можно точно также, костылями. Берешь 2 слова последовательных, 3 слова последовательных, 4. в общем пока не надоест. Работать конечно будет, но очень плохо. Медленно и фраза "яблоко на дереве" не будет найдена если в базе есть "яблоки на дереве". Средствами mysql полнотекстовый поиск не знаю как решается, наверное никак. Если проект не старый, и подобный функционал полнотекстового поиска действительно нужен, то табличку со словами нужно перенести в postgres. Там нативные механизмы полнотекстового поиска, которые просто шикарно найдут "яблоко на дереве".

Да и в целом - postgres точно такой же как и mysql для начинающих, но там есть много крутых вещей которых нет в mysql. Это я не начинаю холивар если что :) И там и там много чего делал.

@DenisMatafonov, скажите пжл, а куда деваются запятые и точки из $text при explode в массив? Вернее в массив они не попадают?

@TimurVI всякие знаки препинания можно отрезать в том месте где пробелы убираем, примерно так $word = trim($word, [' ', ',', '.', ';']);


PHP MySQL PDO

Думаю что такое вот решение подойдет

параметры, которые нужно заменить на на свои:


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

тогда можно просто создать подключение в __construct и использовать массив для передачи ` %:name% ",array('name'=>$each));` что есть best practice

это ни в коем случае не является best practice! Рекомендую еще раз почитать о принципах работы PDO. Не нужно готовить запрос повторно. Достаточно подготовить запрос лишь один раз и затем лишь передавать параметры. Вы же готовите запрос каждый раз в цикле.

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

если вы хотите использовать морфологию (например библиотеку phpMorphy), то я бы рекомендовал:

1) если количество записей в таблице slovo не большое, делать полную выборку

$handle = $link->prepare('SELECT id, name FROM slovo ORDER BY CHAR_LENGTH(name) DESC'); $handle->execute();

2) если количество записей в таблице slovo большое, то для уменьшения времени замены добавить в таблицу slovo столбик, в который помещать корень слова (можно автоматически через библиотеку) и по нему делать фильтрацию INSTR(?, new_column).

3) После при переборе слов перед

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

Читайте также: