Использование параметра id в адресной строке: примеры на PHP
Обработка идентификатора в URL через PHP
Как извлечь идентификатор из адресной строки и безопасно использовать его в скрипте?
Наиболее распространённый и эффективный способ - использование суперглобального массива $_GET. Предположим, URL имеет вид example.com/page.php?id=42. Значение 42 доступно через $_GET['id']. Однако прямое использование без проверок небезопасно. Рекомендуется всегда фильтровать и валидировать входные данные.
// Получение id из URL
$rawId = $_GET['id'] ?? null;
// Валидация: id должно быть целым положительным числом
if ($rawId !== null && ctype_digit($rawId)) {
$id = (int) $rawId;
echo "ID: $id";
} else {
// Обработка отсутствия или некорректного id
http_response_code(400);
echo "Неверный идентификатор";
}
Url php id (url с идентификатором в php)
При URL example.com/page.php?id=42 Результат: ID: 42 При URL example.com/page.php Результат: Неверный идентификатор
Типичная ошибка: использование $_GET['id'] без проверки на существование (вызовет Notice) и без фильтрации (ведёт к SQL-инъекциям). Решение: всегда использовать оператор ?? (null coalescing) и функции проверки типов, например filter_var() с флагом FILTER_VALIDATE_INT.
Как обработать ЧПУ-адрес вида /page/42 без вопросительного знака?
Для дружественных URL (Clean URLs) используется серверная перезапись (mod_rewrite в Apache, try_files в Nginx). После настройки rewrite параметры передаются как часть пути. PHP получает значение из $_SERVER['PATH_INFO'] или через разбор $_SERVER['REQUEST_URI'].
// URL: /page/42 (предполагается, что .htaccess перенаправляет на index.php)
$requestUri = $_SERVER['REQUEST_URI'];
$parts = explode('/', trim($requestUri, '/'));
// $parts = ['page', '42']
$id = isset($parts[1]) && ctype_digit($parts[1]) ? (int)$parts[1] : null;
if ($id) {
echo "ID из ЧПУ: $id";
} else {
echo "ID не найден";
}
При обращении к /page/42 Результат: ID из ЧПУ: 42
Проблема: если rewrite не настроен, $_SERVER['PATH_INFO'] может отсутствовать. Решение: проверять обе возможности - сначала PATH_INFO, затем разбирать REQUEST_URI. Также возможна путаница с базовым URL, поэтому рекомендуется использовать parse_url().
Как защитить приложение от атак через параметр id?
Использовать подготовленные выражения (prepared statements) при работе с базой данных. Никогда не вставлять $_GET['id'] напрямую в SQL-запрос. Пример с PDO:
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
if ($id === false || $id === null) {
die('Некорректный id');
}
$stmt = $pdo->prepare('SELECT * FROM articles WHERE id = :id');
$stmt->execute(['id' => $id]);
$article = $stmt->fetch();
Типичная ошибка: доверие входящим данным. Даже если id отфильтрован как число, его можно использовать для инъекций в другие части системы (например, в файловые пути). Решение: всегда применять белые списки допустимых значений или строгую проверку.
Как работать с несколькими идентификаторами в одном URL (например, ?cat=5&item=12)?
Использовать массив $_GET для каждого параметра. Валидация каждого значения по отдельности:
$cat = filter_input(INPUT_GET, 'cat', FILTER_VALIDATE_INT);
$item = filter_input(INPUT_GET, 'item', FILTER_VALIDATE_INT);
if ($cat && $item) {
echo "Категория: $cat, Товар: $item";
} else {
echo "Неполные параметры";
}
При URL ?cat=5&item=12 Результат: Категория: 5, Товар: 12
Как организовать передачу числового ID через форму методом POST?
Параметры могут приходить не только через GET. В POST-запросах идентификатор часто передаётся через скрытое поле формы. Обработка аналогична:
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$id = filter_input(INPUT_POST, 'id', FILTER_VALIDATE_INT);
// дальнейшая обработка
}
Ошибка: проверка только _GET, когда данные приходят _POST. Решение: использовать INPUT_REQUEST или проверять метод запроса.
Расширенные примеры работы с идентификаторами в URL
1. Использование .htaccess для преобразования URL
Создаётся файл .htaccess в корне сайта, который перенаправляет все запросы на index.php, передавая путь как параметр.
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?route=$1 [QSA,L]
Теперь URL example.com/article/42 будет обработан как index.php?route=article/42.
Пример PHP-обработчика:
$route = $_GET['route'] ?? '';
$parts = explode('/', $route);
// $parts = ['article', '42']
if ($parts[0] === 'article' && isset($parts[1]) && ctype_digit($parts[1])) {
$id = (int)$parts[1];
echo "Статья ID: $id";
}
Вывод: Статья ID: 42
2. Фильтрация с помощью filter_var_array
Если передаётся несколько параметров, можно отфильтровать их одним вызовом:
$filters = [
'id' => FILTER_VALIDATE_INT,
'page' => [
'filter' => FILTER_VALIDATE_INT,
'options' => ['min_range' => 1, 'max_range' => 100]
]
];
$inputs = filter_input_array(INPUT_GET, $filters);
if ($inputs && $inputs['id'] && $inputs['page']) {
echo "ID: {$inputs['id']}, Страница: {$inputs['page']}";
} else {
echo "Некорректные параметры";
}
При URL ?id=7&page=2 Результат: ID: 7, Страница: 2 При URL ?id=abc&page=200 Результат: Некорректные параметры
3. Использование идентификатора в URL для постраничной навигации (пагинация)
Пример генерации ссылок с параметром page:
$currentPage = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT) ?? 1;
$totalPages = 10;
echo "Назад";
for ($i = 1; $i <= $totalPages; $i++) {
$active = ($i === $currentPage) ? ' class="active"' : '';
echo "$i";
}
echo "Вперёд";
Результатом будет набор ссылок для пагинации.
4. Динамическое формирование URL с помощью http_build_query
Удобно для создания строк запроса из массива параметров:
$params = [
'id' => 123,
'cat' => 'news',
'lang' => 'ru'
];
$url = '/page.php?' . http_build_query($params);
echo $url;
Результат: /page.php?id=123&cat=news&lang=ru
5. Получение идентификатора из PATH_INFO при использовании встроенного сервера PHP
При запуске php -S localhost:8000 index.php путь передаётся в $_SERVER['PATH_INFO']:
$pathInfo = $_SERVER['PATH_INFO'] ?? '';
$id = null;
if (preg_match('#^/article/(\d+)$#', $pathInfo, $matches)) {
$id = (int)$matches[1];
echo "ID статьи: $id";
} else {
echo "Неверный путь";
}
При запросе http://localhost:8000/article/99 Результат: ID статьи: 99