W3docs

Суперглобальные переменные 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.

Практика

Практика
Какие из следующих утверждений о методе GET в PHP верны?
Какие из следующих утверждений о методе GET в PHP верны?
Was this page helpful?