Как сделать поиск по сайту на PHP

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

Принцип работы поиска

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

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

Пишем поиск

Разберем на примере поиска товара в интернет-магазине. Для начала нам нужно написать html-форму и указать ссылку на обработчик в атрибут action.

Форма с методом Post:

<form name="search" method="post" action="search.php">
   <input type="search" name="product_name" placeholder="Поиск">
   <button type="submit">Найти</button>
</form>

И так, мы создали форму которая будет отправлять данные, в нашем случае будем отправлять product_name методом Post в обработчик указанный в теге action, создадим и его.

Обработчик формы:

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

$host = 'localhost';
$dbname = 'databasename';
$username = 'username';
$password = 'password';

try {
 $db = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
 echo "Connected to $dbname at $host successfully.";
 } catch (PDOException $pe) {
   die("Could not connect to the database $dbname :" . $pe->getMessage());
  }

Подробно о подключение к базе данных Mysql мы рассматривать в данном уроке не будем, перейдем к поиску, если подключение успешно - делаем запрос:

$productName=$_POST['productName']; 
if(preg_match("/[A-Z | a-z]+/", $productName)){ 
$query = "SELECT * FROM products WHERE `name` LIKE ?";
$params = ["%$productName%"];
$stmt = $db->prepare($query);
$stmt->execute($params);
$products = $stmt->fetchAll(PDO::FETCH_ASSOC);

Если товары найдены, выводим их в цикле:

if (count($products)) {
  echo "<ul>n";
  foreach ($products as $product) {
    echo "<li>" . "<a  href=".$product['url'].">"   .$product['name'] .  "</a></li>n";
  }
  echo "</ul>";
}

Если не найдены, выводим сообщение:

else {
  echo "<p>Данные не найдены</p>";
}

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

<?php
$host = 'localhost';
$dbname = 'databasename';
$username = 'username';
$password = 'password';

try {
  $db = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
  echo "Connected to $dbname at $host successfully.";
} catch (PDOException $pe) {
  die("Could not connect to the database $dbname :" . $pe->getMessage());
}


$productName=$_POST['productName'];
if(preg_match("/[A-Z | a-z]+/", $productName)) {
  $query = "SELECT * FROM products WHERE `name` LIKE ?";
  $params = ["%$productName%"];
  $stmt = $db->prepare($query);
  $stmt->execute($params);
  $products = $stmt->fetchAll(PDO::FETCH_ASSOC);

  if (count($products)) {
    //-Вывод результата в виде массива
    echo "<ul>n";
    foreach ($products as $product) {
      echo "<li>" . "<a  href=".$product['url'].">"   .$product['name'] .  "</a></li>n";
    }
    echo "</ul>";
  } else {
    echo "<p>Данные не найдены</p>";
  }

} else {
  echo "<p>Пожалуйста, введите поисковый запрос</p>";
}

Заключение

И так, сегодня мы научились делать поиск по сайту на PHP и Mysql, как оказалось сделать это не так уж трудно, достаточно понимать алгоритм и действовать последовательно.