Использование оператора LIKE в mysqli: получение всех результатов

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

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

php
Скопировать код
$query = "SELECT * FROM table WHERE column LIKE '%'";
$result = $mysqli->query($query);

while($row = $result->fetch_assoc()) {
    echo $row['column'];
}
Кинга Идем в IT: пошаговый план для смены профессии

Применение подготовленных выражений для улучшения безопасности запросов

Для преодоления уязвимостей, связанных с SQL-инъекциями, подготовленные выражения – идеальное решение. В данных запросах используются плейсхолдеры (?):

php
Скопировать код
$stmt = $mysqli->prepare("SELECT * FROM table WHERE column LIKE ?");
$searchWithWildcard = "%mySearchTerm%";
$stmt->bind_param("s", $searchWithWildcard);
$stmt->execute();

$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    echo $row['column'];
}

Если символ % в поисковом запросе не обозначает маску, его следует экранировать:

php
Скопировать код
$searchTerm = preg_replace('/(?<!\\\)%/', '\\%', $searchTerm);

Получение нескольких записей за один запрос

Вместо извлечения записей отдельно, можно получить все сразу с использованием fetch_all(MYSQLI_ASSOC). Это удобно при работе с большим объемом данных:

php
Скопировать код
if ($result = $stmt->get_result()) {
    $rows = $result->fetch_all(MYSQLI_ASSOC);
    foreach ($rows as $row) {
        echo $row['column'];
    }
}

В PHP 8.2 появилась возможность работать с базой данных элегантно и лаконично при помощи метода execute_query:

php
Скопировать код
$rows = $mysqli->execute_query("SELECT * FROM table WHERE column LIKE ?", ["%searchTerm%"])->fetch_all(MYSQLI_ASSOC);

Эффективный поиск по соединённым столбцам с помощью CONCAT в MySQL

Тогда когда нужно произвести поиск по соединению нескольких столбцов, применение функции MySQL CONCAT() в запросах с LIKE становится отличным решением:

php
Скопировать код
$stmt = $mysqli->prepare("SELECT * FROM employees WHERE CONCAT(first_name, ' ', last_name) LIKE ?");
$stmt->bind_param("s", $searchWithWildcard);

Визуализация шаблонов запросов

Представим, что у нас есть библиотечный каталог (📚):

SQL
Скопировать код
SELECT * FROM books WHERE title LIKE '%Harry%';

Это можно воспринять как просьбу к библиотекарю:

Markdown
Скопировать код
"Пожалуйста, покажите все книги с 'Harry' В ЛЮБОЙ ЧАСТИ названия."

Тогда готовьтесь увидеть массу книг о "Гарри":

Markdown
Скопировать код
🔍📚: ["Гарри Поттер", "Истории о Гарри", "Когда Гарри встретил Салли"]

И пусть LIKE '%Harry%' поможет вам обнаружить "Гарри" в любом месте названия!

Экранирование спецсимволов с использованием negative lookbehind в регулярных выражениях

Если в поисковом запросе встречаются символы % или _ и они не должны интерпретироваться как шаблоны, их стоит экранировать. Для этого мы используем negative lookbehind в regex:

php
Скопировать код
$searchTerm = preg_replace('/(?!\\)\%/', '\\%', $searchTerm); // "% говорит: "Я здесь буквально!"
$searchTerm = preg_replace('/(?!\\)\_/', '\\_', $searchTerm); // _ прокламирует: "Я – не заполнитель, я – буква!"

Привязка результатов к переменным

Метод bind_result дает возможность связывать результаты запроса напрямую с переменными:

php
Скопировать код
$stmt->bind_result($column); // Партнёры по соединению результатов!
while ($stmt->fetch()) {
    echo $column;
}

Полезные материалы

  1. MySQL :: Руководство в MySQL 8.0 :: Функции и операторы сравнения строкДокументация MySQL всегда под рукой!
  2. PHP: Подготовленные выражения – Руководство – Познакомьтесь с механизмами защиты ваших запросов с использованием подготовленных выражений в PHP MySQLi.
  3. Выборка данных из MySQL в PHP – Овладейте техниками избора и получения данных с помощью MySQLi.
  4. Учебник по MySQLi – Углубитесь в MySQLi при помощи практических примеров и упражнений.
  5. Оптимизация запросов SQL LIKE с использованием индексовТонкая настройка производительности для эффективного использования LIKE.