Переменные из внешних источников

HTML-формы. Методы GET и POST

PHP-скрипт автоматически получает доступ к данным формы после отправки формы скрипту. Данные формы получают несколькими способами, например:

Пример #1 Простая HTML-форма

<form action="foo.php" method="post">
    Имя:  <input type="text" name="username" /><br />
    Email: <input type="text" name="email" /><br />
    <input type="submit" name="submit" value="Отправь меня!" />
</form>

Доступ к данным HTML-формы получают только двумя способами. Следующие параграфы перечисляют эти способы:

Пример #2 Доступ к данным несложной HTML-формы, которую отправили методом POST

<?php

echo $_POST['username'];
echo
$_REQUEST['username'];

?>

GET-формы обрабатывают аналогично, за исключением того, что вместо суперглобальной переменной POST обрабатывают предопределённую суперглобальную переменную GET. Суперглобальная переменная GET также умеет работать с элементом QUERY_STRING (информация в URL-адресе после знака вопроса «?»). Так, например, адрес http://www.example.com/test.php?id=3 содержит GET-данные, к которым получают доступ через $_GET['id']. О переменных HTTP-запроса рассказывает раздел $_REQUEST.

Замечание:

Точки и пробелы в именах переменных преобразовываются в знаки подчёркивания. Например, <input name="a.b" /> станет $_REQUEST["a_b"].

PHP также понимает массивы в контексте переменных формы (смотрите раздел PHP и HTML). Связанные переменные, например, группируют по имени или получают значения из полей ввода с множественным выбором. Отправим форму сами себе и отобразим данные:

Пример #3 Более сложные переменные формы

<?php

if ($_POST) {
echo
'<pre>';
echo
htmlspecialchars(print_r($_POST, true));
echo
'</pre>';
}

?>
<form action="" method="post">
Имя: <input type="text" name="personal[name]" /><br />
Email: <input type="text" name="personal[email]" /><br />
Пиво: <br />
<select multiple name="beer[]">
<option value="warthog">Warthog</option>
<option value="guinness">Guinness</option>
<option value="stuttgarter">Stuttgarter Schwabenbräu</option>
</select><br />
<input type="submit" value="Отправь меня!" />
</form>

Замечание: PHP без предупреждения проигнорирует конечные символы, если имя внешней переменной начинается с корректного синтаксиса массива. Например, <input name="foo[bar]baz"> станет $_REQUEST['foo']['bar'].

Имена переменных кнопки с картинкой для отправки формы

Чтобы у формы вместо стандартной кнопки отправки появилось изображение, формируют тег наподобие такого:

<input type="image" src="image.gif" name="sub" />

Когда пользователь щёлкнет по изображению, браузер передаст форму на сервер с двумя дополнительными переменными — sub_x и sub_y. Эти переменные содержат координаты места, по которому пользователь нажал на изображении. Программисты с опытом, наверное, заметили, что имена переменных, которые отправил браузер, содержат точку, а не подчёркивание, но PHP автоматически преобразует точку в подчёркивание.

HTTP Cookies

PHP прозрачно поддерживает HTTP cookies в соответствии с требованиями стандарта » RFC 6265. Cookies — механизм хранения данных в удалённом браузере, по которым сервер отслеживает или идентифицирует пользователей, которые вернулись на сайт. Cookies устанавливают функцией setcookie(). Cookies — часть HTTP-заголовка, поэтому функцию SetCookie требуется вызывать перед отправкой вывода браузеру. Это же ограничение касается функции header(). Данные, которые хранят cookie, доступны в массивах данных cookie наподобие суперглобальных переменных $_COOKIE или $_REQUEST. Подробности и примеры даёт описание функции setcookie().

Замечание: Начиная с PHP 7.2.34, 7.3.23 и 7.4.11 по соображениям безопасности имена входящих cookie больше не декодируются из URL-кодированной строки.

Когда одной переменной cookie требуется присвоить больше одного значения, значения присваивают как массив. Например:

<?php

setcookie
("MyCookie[foo]", 'Testing 1', time() + 3600);
setcookie("MyCookie[bar]", 'Testing 2', time() + 3600);

?>

Такой вызов создаст два разных блока данных cookie, хотя в скрипте переменная MyCookie теперь будет одним массивом. Если требуется установить только один блок данных cookie с несколькими значениями, сначала обдумывают вызов для таких значений функции наподобие serialize() или explode().

Обратите внимание, что блок данных cookie заменит в браузере предыдущий блок данных cookie с тем же именем, если только путь или домен не отличаются. Так в приложении с корзиной покупок можно сохранить количество товаров:

Пример #4 Пример использования setcookie()

<?php

if (isset($_COOKIE['count'])) {
$count = $_COOKIE['count'] + 1;
} else {
$count = 1;
}

setcookie('count', $count, time() + 3600);
setcookie("Cart[$count]", $item, time() + 3600);

?>

Точки в именах входящих переменных

PHP, как правило, не изменяет имена переменных, которые передали скрипту. Однако следует отметить, что точка — неправильный символ в имени переменной PHP. Поэтому рассмотрим такую запись:

<?php

$varname
.ext; /* Неправильное имя переменной */

?>
В приведённом примере интерпретатор видит переменную $varname, после которой идёт оператор конкатенации, а затем голая строка (то есть строка, которую не заключили в кавычки, и которая не соответствует ни одному из ключевых или зарезервированных слов) «ext». Очевидно, что это не даст ожидаемого результата.

Поэтому важно отметить, что PHP будет автоматически заменять точки в именах входящих переменных на символы подчёркивания.

Определение типов переменных

Поскольку PHP определяет типы переменных и преобразовывает типы (как правило) по мере необходимости, не всегда очевидно, какому типу принадлежит переменная в каждый момент времени. PHP содержит несколько функций, которые умеют определять тип переменной, например: gettype(), is_array(), is_float(), is_int(), is_object() и is_string(). Подробнее о типах данных, которые поддерживает PHP, рассказывает раздел «Типы».

HTTP — текстовый протокол, и большая, если не вся, часть содержимого, которое попадает в суперглобальные массивы наподобие $_POST и $_GET, останется в виде строк. PHP не будет преобразовывать значения в конкретный тип. В приведённом примере элемент $_GET["var1"] будет содержать строку «null», а элемент $_GET["var2"] — строку «123».

/index.php?var1=null&var2=123

Список изменений

Версия Описание
7.2.34, 7.3.23, 7.4.11 По соображениям безопасности имена входящих cookie больше не декодируются из URL-кодированной строки.