Обработка языкового фильтра ru при поиске на PHP
Реализация поиска с параметром ru в PHP
Статья посвящена обработке GET-параметра ru в адресах вида index.php?act=search&ru. Рассматриваются различные способы реализации поискового функционала с учётом языковой фильтрации. Все примеры ориентированы на безопасность и гибкость.
Как реализовать безопасный поиск с фильтром по языку через PDO?
Наиболее эффективное решение - использование подготовленных выражений PDO. Оно защищает от SQL-инъекций и обеспечивает чёткое разделение кода и данных.
// index.php
$act = $_GET['act'] ?? '';
$ru = isset($_GET['ru']) ? 1 : 0;
if ($act === 'search') {
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'user', 'pass');
$sql = 'SELECT * FROM articles WHERE language = :lang';
$stmt = $pdo->prepare($sql);
$stmt->execute([':lang' => ($ru ? 'ru' : 'en')]);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
Search php search author (поиск по автору в php)
Параметр ru проверяется на наличие в URL. Если он присутствует, в запрос подставляется значение 'ru', иначе - язык по умолчанию (например, 'en').
Возможные проблемы:
- Отсутствие проверки параметра act может привести к выполнению поиска в неподходящий момент.
- Использование неэкранированных данных в SQL ведёт к инъекциям - решается через prepare.
- Если параметр ru равен не пустой строке, а '0' или 'false', логика isset может дать неожиданный результат - лучше использовать явное приведение.
Как обработать параметр ru через switch для разных действий?
Данный вариант подходит, когда в проекте несколько типов запросов (act=search, act=filter и т.д.).
$act = $_GET['act'] ?? '';
$ru = in_array($_GET['ru'] ?? '', ['1', 'true', 'on']) ? 'ru' : 'en';
switch ($act) {
case 'search':
// поиск с языковым фильтром
$query = "SELECT * FROM items WHERE lang = '$ru'";
break;
case 'list':
$query = "SELECT * FROM items WHERE lang = '$ru' AND status = 1";
break;
default:
$query = '';
}
Index php act search ru (поиск с параметром ru в php)
Здесь ru может принимать несколько истинных значений. Однако прямое встраивание переменной в строку запроса - небезопасно (рекомендуется всё же PDO).
Типичная ошибка:
Если ru отсутствует в URL, то $_GET['ru'] выдаст warning. Необходимо использовать оператор ?? или isset.
Как выполнить поиск без базы данных, используя массив данных?
Для небольших проектов или прототипов можно фильтровать статический массив.
$data = [
['title' => 'Новости', 'lang' => 'ru'],
['title' => 'News', 'lang' => 'en'],
['title' => 'Статья', 'lang' => 'ru']
];
$ruFilter = isset($_GET['ru']) ? 'ru' : 'en';
$filtered = array_filter($data, function($item) use ($ruFilter) {
return $item['lang'] === $ruFilter;
});
print_r($filtered);
Advance search php (расширенный поиск в php)
Этот метод не требует подключения к БД и полезен для демонстрации логики.
Проблемы:
- Данные в коде не масштабируются.
- При большом объёме данных производительность падает.
Как использовать регулярное выражение для валидации параметра ru?
Если нужно строго проверить, что параметр ru состоит только из букв 'ru' или пустой, можно применить preg_match.
$rawRu = $_GET['ru'] ?? '';
if (preg_match('/^ru$/i', $rawRu)) {
$lang = 'ru';
} else {
$lang = 'en';
}
// далее используем $lang в запросе
Search php vars (переменные поиска в php)
Регулярное выражение гарантирует, что будет принято только 'ru' или 'RU', а любые другие значения игнорируются.
Как совместить параметр ru с полнотекстовым поиском?
Для поиска по тексту статей на выбранном языке используется FULLTEXT-индекс и MATCH AGAINST.
$search = trim($_GET['q'] ?? '');
$lang = isset($_GET['ru']) ? 'ru' : 'en';
$sql = "SELECT * FROM articles
WHERE MATCH(title, body) AGAINST(:q IN BOOLEAN MODE)
AND language = :lang";
$stmt = $pdo->prepare($sql);
$stmt->execute([':q' => $search, ':lang' => $lang]);
Такой подход позволяет пользователю искать только среди контента на нужном языке.
Расширенные примеры обработки параметра ru
В данном разделе приведены детальные сценарии с полным кодом и выводом.
Пример 1. Фильтрация с пагинацией
Код обрабатывает параметры page и ru, возвращая результаты с учётом языка.
$page = max(1, (int)($_GET['page'] ?? 1));
$perPage = 10;
$offset = ($page - 1) * $perPage;
$lang = isset($_GET['ru']) ? 'ru' : 'en';
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $pdo->prepare('SELECT * FROM articles WHERE language = :lang LIMIT :limit OFFSET :offset');
$stmt->bindValue(':lang', $lang, PDO::PARAM_STR);
$stmt->bindValue(':limit', $perPage, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();
$items = $stmt->fetchAll(PDO::FETCH_ASSOC);
Результат (вывод первых 2 записей):
Array
(
[0] => Array
(
[id] => 1
[title] => Привет мир
[lang] => ru
)
[1] => Array
(
[id] => 2
[title] => PHP основы
[lang] => ru
)
)
Важно: значения LIMIT и OFFSET передаются как целые числа, чтобы избежать неявного преобразования.
Пример 2. Обработка массива параметров (несколько языков)
Если нужно разрешить и ru, и en одновременно, можно использовать массив.
$allowedLangs = ['ru', 'en'];
$langs = [];
foreach ($allowedLangs as $l) {
if (isset($_GET[$l]) && $_GET[$l] === '1') {
$langs[] = $l;
}
}
if (empty($langs)) $langs[] = 'ru'; // по умолчанию
$placeholders = implode(',', array_fill(0, count($langs), '?'));
$sql = "SELECT * FROM articles WHERE language IN ($placeholders)";
$stmt = $pdo->prepare($sql);
$stmt->execute($langs);
Результат запроса вернёт статьи на русском и английском, если оба параметра установлены.
Пример 3. Использование параметра ru вместе с поисковым словом и сортировкой
Демонстрация комбинированного поиска с безопасной подстановкой.
$q = '%' . $_GET['q'] . '%';
$lang = isset($_GET['ru']) ? 'ru' : 'en';
$sort = ($_GET['sort'] ?? 'date') === 'title' ? 'title' : 'created_at';
$sql = "SELECT * FROM articles
WHERE language = :lang
AND (title LIKE :q OR body LIKE :q2)
ORDER BY $sort DESC";
$stmt = $pdo->prepare($sql);
$stmt->execute([':lang' => $lang, ':q' => $q, ':q2' => $q]);
$rows = $stmt->fetchAll();
Переменная $sort проверена на точное совпадение, поэтому инъекция невозможна.
Пример 4. Обработка через ctype_alnum для параметра ru
Если параметр ru может быть передан как ?ru=ru, можно проверить его формат.
$raw = $_GET['ru'] ?? '';
if (ctype_alnum($raw) && strlen($raw) === 2) {
$lang = strtolower($raw);
} else {
$lang = 'en';
}
// далее запрос с PDO
Данный способ допускает любые двухсимвольные буквенно-цифровые коды, что может быть избыточно. Лучше комбинировать с in_array.