Использование оператора LIKE в mysqli: получение всех результатов
Быстрый ответ
Для выполнения запроса с оператором LIKE
и извлечения всех записей в mysqli
можно применить следующий код. Процент в запросе играет роль шаблона для сопоставления значений в столбце column
:
$query = "SELECT * FROM table WHERE column LIKE '%'";
$result = $mysqli->query($query);
while($row = $result->fetch_assoc()) {
echo $row['column'];
}
Применение подготовленных выражений для улучшения безопасности запросов
Для преодоления уязвимостей, связанных с SQL-инъекциями, подготовленные выражения – идеальное решение. В данных запросах используются плейсхолдеры (?
):
$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'];
}
Если символ %
в поисковом запросе не обозначает маску, его следует экранировать:
$searchTerm = preg_replace('/(?<!\\\)%/', '\\%', $searchTerm);
Получение нескольких записей за один запрос
Вместо извлечения записей отдельно, можно получить все сразу с использованием fetch_all(MYSQLI_ASSOC)
. Это удобно при работе с большим объемом данных:
if ($result = $stmt->get_result()) {
$rows = $result->fetch_all(MYSQLI_ASSOC);
foreach ($rows as $row) {
echo $row['column'];
}
}
В PHP 8.2 появилась возможность работать с базой данных элегантно и лаконично при помощи метода execute_query
:
$rows = $mysqli->execute_query("SELECT * FROM table WHERE column LIKE ?", ["%searchTerm%"])->fetch_all(MYSQLI_ASSOC);
Эффективный поиск по соединённым столбцам с помощью CONCAT
в MySQL
Тогда когда нужно произвести поиск по соединению нескольких столбцов, применение функции MySQL CONCAT()
в запросах с LIKE
становится отличным решением:
$stmt = $mysqli->prepare("SELECT * FROM employees WHERE CONCAT(first_name, ' ', last_name) LIKE ?");
$stmt->bind_param("s", $searchWithWildcard);
Визуализация шаблонов запросов
Представим, что у нас есть библиотечный каталог (📚):
SELECT * FROM books WHERE title LIKE '%Harry%';
Это можно воспринять как просьбу к библиотекарю:
"Пожалуйста, покажите все книги с 'Harry' В ЛЮБОЙ ЧАСТИ названия."
Тогда готовьтесь увидеть массу книг о "Гарри":
🔍📚: ["Гарри Поттер", "Истории о Гарри", "Когда Гарри встретил Салли"]
И пусть LIKE '%Harry%'
поможет вам обнаружить "Гарри" в любом месте названия!
Экранирование спецсимволов с использованием negative lookbehind в регулярных выражениях
Если в поисковом запросе встречаются символы %
или _
и они не должны интерпретироваться как шаблоны, их стоит экранировать. Для этого мы используем negative lookbehind в regex:
$searchTerm = preg_replace('/(?!\\)\%/', '\\%', $searchTerm); // "% говорит: "Я здесь буквально!"
$searchTerm = preg_replace('/(?!\\)\_/', '\\_', $searchTerm); // _ прокламирует: "Я – не заполнитель, я – буква!"
Привязка результатов к переменным
Метод bind_result
дает возможность связывать результаты запроса напрямую с переменными:
$stmt->bind_result($column); // Партнёры по соединению результатов!
while ($stmt->fetch()) {
echo $column;
}
Полезные материалы
- MySQL :: Руководство в MySQL 8.0 :: Функции и операторы сравнения строк – Документация MySQL всегда под рукой!
- PHP: Подготовленные выражения – Руководство – Познакомьтесь с механизмами защиты ваших запросов с использованием подготовленных выражений в PHP MySQLi.
- Выборка данных из MySQL в PHP – Овладейте техниками избора и получения данных с помощью MySQLi.
- Учебник по MySQLi – Углубитесь в MySQLi при помощи практических примеров и упражнений.
- Оптимизация запросов SQL LIKE с использованием индексов – Тонкая настройка производительности для эффективного использования LIKE.