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 автоматически преобразует точку в подчёркивание.
PHP прозрачно поддерживает блоки данных cookies по HTTP-протоколу в соответствии с требованиями стандарта » 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; /* Неправильное имя переменной */
?>
Поэтому важно отметить, что 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-кодированной строки. |