Использование параметра id в адресной строке: примеры на PHP

Раздел: Веб-разработка на PHP -> URL с параметрами

Обработка идентификатора в 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

URL с идентификатором в PHP - comments

En
Url php id (php)