Суперглобальные переменные PHP $_GET
PHP предоставляет несколько суперглобальных переменных для доступа к данным из разных источников. Узнайте, как работает $_GET.
PHP предоставляет несколько суперглобальных переменных, которые упрощают чтение информации из различных источников единым, стандартизированным способом. Одна из них — $_GET: array, который PHP заполняет данными из строки запроса URL текущего запроса. В этой главе рассматривается, что содержит $_GET, как PHP её заполняет, как безопасно читать данные и когда её стоит предпочесть $_POST.
Что такое $_GET?
$_GET — это суперглобальная переменная PHP: ассоциативный array, который автоматически доступен в любой области видимости (внутри функций, классов и файлов) без ключевого слова global. PHP заполняет её парами имя/значение, найденными после символа ? в URL запроса — строкой запроса. Ключи — это имена параметров, а значения — их содержимое (с раскодированием URL).
Поскольку данные находятся в URL, они видимы, допускают создание закладок и могут быть переданы по ссылке. Это делает $_GET идеальной для вещей, на которые пользователь может захотеть сослаться — поисковый запрос, номер страницы, идентификатор товара, — но неподходящей для конфиденциальных или объёмных данных.
Как работает $_GET?
Вы передаёте переменные, добавляя их к URL в виде параметров запроса — пары key=value, разделённые символом &:
http://example.com/script.php?greeting=hello&lang=enКогда скрипт выполняется, PHP разбирает строку запроса и заполняет $_GET. Результирующий array выглядит следующим образом:
// $_GET after the request above
[
'greeting' => 'hello',
'lang' => 'en',
]Значения всегда являются string (или array — см. ниже), даже если выглядят как числа. ?page=2 даёт string "2", а не целое число 2, поэтому перед выполнением арифметических операций приводите к нужному типу или валидируйте данные.
Как безопасно читать $_GET
Всегда проверяйте наличие ключа перед использованием — отсутствующий параметр вызывает предупреждение и возвращает null. Используйте isset() или оператор объединения с null ??:
<?php
// Defensive read with a default value
$greeting = $_GET['greeting'] ?? 'Hi';
echo htmlspecialchars($greeting); // safe to print in HTMLДанные в $_GET поступают непосредственно от клиента, поэтому никогда им не доверяйте. Перед использованием валидируйте и очищайте их:
<?php
// Validate that "id" is a positive integer
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
if ($id === false || $id === null) {
echo 'Invalid or missing id';
} else {
echo "Loading product #$id";
}При выводе пользовательских данных на страницу пропускайте их через htmlspecialchars(), чтобы предотвратить межсайтовый скриптинг (XSS). При использовании в SQL применяйте подготовленные запросы, а не конкатенацию. Полный набор фильтров валидации смотрите в filter_input() и filter_var().
Получение данных формы через GET
HTML-форма с атрибутом method="get" отправляет свои поля в виде параметров запроса, которые затем появляются в $_GET:
<form action="search.php" method="get">
<input type="text" name="q" placeholder="Search...">
<button type="submit">Search</button>
</form>При отправке apple браузер переходит по адресу search.php?q=apple, а в search.php:
<?php
$query = trim($_GET['q'] ?? '');
if ($query !== '') {
echo 'Results for: ' . htmlspecialchars($query);
} else {
echo 'Please enter a search term.';
}Подробнее см. в разделах Обработка форм PHP и Валидация форм PHP.
Array и сгруппированные параметры
Повторяйте имя с [], и PHP объединит значения в вложенный array — удобно для чекбоксов и фильтров с множественным выбором:
http://example.com/filter.php?color[]=red&color[]=blue<?php
// $_GET['color'] is now an array: ['red', 'blue']
foreach ($_GET['color'] ?? [] as $color) {
echo htmlspecialchars($color) . PHP_EOL;
}GET против POST
$_GET | $_POST | |
|---|---|---|
| Где хранятся данные | Строка запроса URL | Тело запроса |
| Видимость в URL | Да | Нет |
| Закладки / передача по ссылке | Да | Нет |
| Ограничение размера | Ограничено длиной URL (~2 КБ) | Практически значительно больше |
| Используется для | Поиска, фильтров, пагинации, навигации | Входа в систему, загрузки файлов, любых операций, изменяющих данные |
Используйте GET для чтения — запросов, которые не изменяют состояние сервера и которые пользователь может захотеть повторить или поделиться. Используйте POST для записи — отправки паролей, создания записей или передачи больших данных. Если нужна единая точка доступа, читающая из любого метода, смотрите $_REQUEST.
Типичные сценарии использования
- Результаты поиска — помещайте запрос в URL, чтобы пользователи могли сохранить его в закладках или поделиться.
- Динамические страницы — передавайте параметр
?id=или?page=, чтобы управлять отображаемым контентом. - Фильтрация и сортировка — кодируйте активные фильтры в URL, чтобы состояние сохранялось при обновлении страницы.
Заключение
$_GET предоставляет простой, унифицированный способ читать данные из строки запроса URL. Она отлично подходит для публичных запросов только для чтения — поиска и пагинации, — но поскольку её значения видимы и поступают от клиента, всегда валидируйте, очищайте и экранируйте их перед использованием. Для данных, которые изменяют состояние сервера или должны оставаться конфиденциальными, используйте $_POST.