Язык программирования PHP и язык гипертекстовой разметки HTML тесно взаимодействуют: PHP умеет генерировать HTML, а HTML умеет передавать информацию PHP. Перед чтением вопросов в этом разделе важно понимать, как получать переменные из внешних источников. Страницы руководства по этой теме содержат много примеров.
Есть несколько этапов, на которых кодировка важна. Предположим, что у вас есть переменная $data с типом string, которая содержит строку, которую вы хотите передать без кодирования. Вот эти этапы:
Интерпретация HTML. Чтобы задать произвольную строку, вы должны заключить её в двойные кавычки и использовать функцию htmlspecialchars() для кодирования.
URL: URL-адрес состоит из нескольких частей. Если вы хотите, чтобы данные были восприняты как один элемент, нужно закодировать их функцией urlencode().
Пример #1 Скрытый элемент HTML-формы
<?php
echo '<input type="hidden" value="' . htmlspecialchars($data) . '" />'."\n";
?>
Замечание: Кодировать перменную $data функцией urlencode() неправильно, поскольку кодировать данные urlencode() это обязанность браузера. Популярные браузеры делают это правильно. Заметьте, что это произойдёт независимо от метода (например, GET или POST). Это заметно только в случае GET-запроса, поскольку POST-запросы обычно скрыты.
Пример #2 Данные, которые редактирует пользователь
<?php
echo "<textarea name='mydata'>\n";
echo htmlspecialchars($data) . "\n";
echo "</textarea>";
?>
Замечание: Браузер показывает данные как предполагалось, потому что браузер интерпретирует экранированные HTML-символы. При отправке через GET- или POST-метод браузер закодирует (urlencoded) данные для передачи, а PHP декодирует (urldecoded). Поэтому не нужно выполнять какое-либо кодирование или декодирование, всё обрабатываются автоматически.
Пример #3 В URL
<?php
echo '<a href="' . htmlspecialchars("/nextpage.php?stage=23&data=" .
urlencode($data)) . '">' . "\n"
;
?>
Замечание: На самом деле вы подделываете HTML-запрос GET, поэтому необходимо вручную закодировать (urlencode()) данные.
Замечание: Вам надо применить функцию htmlspecialchars() к полному URL-адресу, потому что URL-адрес появляется как значение HTML-атрибута. При этом браузер сначала раскодирует всё значение (операция, обратная действию функции htmlspecialchars()) и затем передаст URL. PHP поймёт URL-адрес правильно, поскольку вы закодировали данные функцией urlencode(). Вы заметите, что символ
&
в URL-адресе заменяется на мнемонику&
. Хотя большинство браузеров это исправит, если вы забудете об этом, но всё же это не всегда возможно. Поэтому, даже если ваш URL-адрес не динамический, нужно закодировать его функцией htmlspecialchars().
При отправке формы, вместо стандартной кнопки отправки допустимо использовать изображение с тэгом вроде такого:
<input type="image" src="image.gif" name="foo" />
Поскольку имена foo.x и foo.y не разрешены в PHP, они автоматически преобразовываются в foo_x и foo_y. То есть точки заменяются на подчёркивания. Таким образом, вы обращаетесь к этим переменным так же, как и к любым другим, описанным в разделе о получении переменных извне PHP. Например, $_GET['foo_x'].
Замечание:
Пробелы в именах переменных запроса преобразовываются в подчёркивания.
Чтобы браузер передал результат <form> в PHP-скрипт как массив, элементы <input>, <select> или <textarea> называют следующим образом:
<input name="MyArray[]" /> <input name="MyArray[]" /> <input name="MyArray[]" /> <input name="MyArray[]" />
<input name="MyArray[]" /> <input name="MyArray[]" /> <input name="MyOtherArray[]" /> <input name="MyOtherArray[]" />
<input name="AnotherArray[]" /> <input name="AnotherArray[]" /> <input name="AnotherArray[email]" /> <input name="AnotherArray[phone]" />
Замечание:
Определять ключи массивов в HTML необязательно. Если вы не установите ключи, массив заполнится в порядке появления элементов в форме. Первый пример будет содержать ключи 0, 1, 2 и 3.
Также смотрите Функции для работы с массивами и Переменные извне PHP.
HTML-тег select с атрибутом multiple разрешает пользователю выбрать элементы из списка. Эти элементы затем передаются обработчику формы. Проблема в том, что они переданы с одним и тем же именем. Например:
<select name="var" multiple="yes">
var=option1 var=option2 var=option3
<select name="var[]" multiple="yes">
Заметьте, если вы используете JavaScript, есть риск того, что запись []
в имени элемента вызовет проблемы, если вы пытаетесь обращаться к
элементу по имени. Вместо этого указывайте числовой идентификатор элемента формы или
возьмите имя переменной в одинарные кавычки и используйте его как
индекс массива элементов, например:
variable = document.forms[0].elements['var[]'];
Поскольку JavaScript — обычно клиентская технология, а PHP, как правило, серверная, и поскольку HTML — протокол «без состояния», эти два языка не умеют обмениваться переменными напрямую.
Однако можно передавать переменные между ними. Один из способов добиться этого — сгенерировать JavaScript-код из PHP и принудительно обновлять браузер, посылая определённые переменные обратно PHP-скрипту. Пример показывает, как это сделать — он разрешает PHP-коду захватывать высоту и ширину экрана, что обычно возможно только на стороне клиента.
Пример #4 Генерирование JavaScript из PHP
<?php
if (isset($_GET['width']) AND isset($_GET['height'])) {
// Выводим переменные с размерами
echo "Ширина экрана: " . $_GET['width'] . "<br />\n";
echo "Высота экрана: " . $_GET['height'] . "<br />\n";
} else {
// Передаём переменные с размерами
// (сохраняем оригинальную строку запроса
// — POST-переменные нужно будет передавать другим способом)
echo "<script>\n";
echo " location.href = \"{$_SERVER['SCRIPT_NAME']}?{$_SERVER['QUERY_STRING']}"
. "&width=\" + screen.width + \"&height=\" + screen.height;\n";
echo "</script>\n";
exit;
}
?>