Поиск по автору в PHP: варианты и практические примеры
Организация поиска по автору в PHP
Как реализовать быстрый и точный поиск по автору с учётом словоформ и производительности?
Оптимальное решение - использование полнотекстового индекса (FULLTEXT) в MySQL в сочетании с подготовленными запросами PDO. Это обеспечивает скорость работы даже на больших объёмах данных и учитывает морфологию (при использовании соответствующего анализатора).
Шаги:
- Создать таблицу контента с полем author_id или author_name. Если авторы хранятся в отдельной таблице, создать индекс FULLTEXT на поле name или объединить first_name и last_name.
- Выполнить SQL запрос:
SELECT * FROM posts p JOIN authors a ON p.author_id = a.id WHERE MATCH(a.full_name) AGAINST(:query IN BOOLEAN MODE);Search php search author (поиск по автору в php)
- Использовать PDO для параметризации:
$stmt = $pdo->prepare($sql); $stmt->execute(['query' => $searchTerm]);Index php act search ru (поиск с параметром ru в php)
- Обработать результаты.
Важно:
предварительно создать FULLTEXT индекс:ALTER TABLE authors ADD FULLTEXT INDEX ft_name (full_name);Advance search php (расширенный поиск в php)
Проблема: игнорирование стоп-слов или минимальная длина слова. Настройка параметров ft_min_word_len.
Ошибка: забыли экранировать ввод при использовании MATCH без параметризации. Решение: всегда использовать подготовленные запросы.
Как выполнить простой поиск по автору с помощью LIKE?
Самый простой способ – оператор LIKE, который ищет подстроку в названии автора.
SELECT * FROM authors WHERE name LIKE :query;Search php vars (переменные поиска в php)
Запрос:
$stmt->execute(['query' => '%' . $search . '%']);Search php search id 2 (поиск по id 2 в php)
Проблема: низкая производительность при больших таблицах, особенно с ведущим символом %.
Ошибка: не экранированные специальные символы LIKE (% и _). Решение: использовать addcslashes($search, '%_') или позволить PDO самостоятельно экранировать, но тогда риск.
Как искать по имени и фамилии отдельно?
Если автор хранится в двух полях (first_name, last_name), можно искать по каждому:
SELECT * FROM authors WHERE first_name LIKE :q1 OR last_name LIKE :q2;Search php key (поиск по ключу в php)
Или для поиска полного имени: разбить строку на слова и добавить условия.
$words = explode(' ', $search);
$conditions = [];
foreach ($words as $i => $word) {
$conditions[] = "first_name LIKE :w$i OR last_name LIKE :w$i";
}
$sql = 'SELECT * FROM authors WHERE ' . implode(' AND ', $conditions);Search php p 1 (поиск по странице 1 в php)
Проблема: сложность с порядком слов.
Ошибка: не обработан случай пустого поиска.
Как использовать регулярные выражения для гибкого поиска?
MySQL поддерживает REGEXP для сложных шаблонов. Например, поиск автора, начинающегося на заданную букву:
SELECT * FROM authors WHERE name REGEXP :pattern;Search php new (поиск новых записей в php)
Регулярное выражение строится динамически:
$pattern = '^' . preg_quote($search, '/');
Проблема: очень низкая производительность (сканирование всех строк). REGEXP не использует индексы.
Ошибка: незащищённый ввод в REGEXP может привести к синтаксической ошибке или к инъекции (хотя REGEXP не выполняет код, но может вызвать ошибки).
Расширенные примеры поиска по автору
Пример 1: Полнотекстовый поиск с ранжированием.
$sql = 'SELECT p.title, a.full_name, MATCH(a.full_name) AGAINST(:query IN BOOLEAN MODE) AS relevance '
. 'FROM posts p '
. 'JOIN authors a ON p.author_id = a.id '
. 'WHERE MATCH(a.full_name) AGAINST(:query2 IN BOOLEAN MODE) '
. 'ORDER BY relevance DESC';
$stmt = $pdo->prepare($sql);
$search = 'Иванов';
$stmt->execute(['query' => $search, 'query2' => $search]);
$results = $stmt->fetchAll();
Результат: массив записей с полями title, full_name, relevance. Например:
Array
(
[0] => Array
(
[title] => Введение в PHP
[full_name] => Иванов Иван
[relevance] => 2.5
)
...
)
Пример 2: Поиск с использованием нескольких ключевых слов (AND).
$words = explode(' ', $search);
$sql = 'SELECT * FROM authors WHERE ';
$params = [];
foreach ($words as $i => $word) {
$sql .= 'full_name LIKE :w' . $i . ' AND ';
$params['w' . $i] = '%' . $word . '%';
}
$sql = rtrim($sql, ' AND ');
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
Результат: все авторы, чьё имя содержит все введённые слова (порядок не важен).
Пример 3: Поиск автора с защитой от SQL-инъекций через PDO.
class AuthorSearch {
private $pdo;
public function __construct(PDO $pdo) { $this->pdo = $pdo; }
public function search($term) {
$sql = 'SELECT * FROM authors WHERE full_name LIKE :term';
$stmt = $this->pdo->prepare($sql);
$stmt->execute(['term' => '%' . $term . '%']);
return $stmt->fetchAll();
}
}
$searcher = new AuthorSearch($pdo);
$results = $searcher->search('Петр');
Возвращает массив авторов, содержащих 'Петр'.
Пример 4: Использование объединения таблиц (content и authors) с поиском по автору.
SELECT c.title, c.content, a.name
FROM content c
JOIN authors a ON c.author_id = a.id
WHERE a.name LIKE :author;
Список статей выбранного автора.
Пример 5: Обработка ошибок: проверка наличия FULLTEXT индекса.
try {
$stmt = $pdo->prepare('SELECT * FROM authors WHERE MATCH(full_name) AGAINST(:q)');
// ...
} catch (PDOException $e) {
if ($e->getCode() == '1191') {
echo 'Требуется FULLTEXT индекс';
}
}
Вывод сообщения об ошибке.