PHP и HTML тесно взаимодействуют: PHP может генерировать HTML, а HTML может передавать информацию PHP. Перед чтением вопросов в этом разделе важно чтобы вы понимали как получать переменные извне PHP. Страницы руководства по этой теме содержат много примеров.
Здесь несколько этапов, на которых кодировка важна. Предположим, что у вас есть $data типа string, содержащая строку, которую вы хотите передать без кодирования. Вот эти этапы:
Интерпретация HTML. Для того, чтобы задать произвольную строку, вы должны заключить её в двойные кавычки и использовать htmlspecialchars() для кодирования.
URL: URL состоит из нескольких частей. Если вы хотите чтобы ваши данные были восприняты как один элемент, вы должны закодировать их с помощью urlencode().
Пример #1 Скрытый элемент HTML-формы
<?php
echo '<input type="hidden" value="' . htmlspecialchars($data) . '" />'."\n";
?>
Замечание: Использовать urlencode() для $data неправильно, так как кодировать данные в urlencode() это обязанность браузера. Все популярные браузеры делают это правильно. Отметьте, что это происходит вне зависимости от метода (например, GET или POST). Вы заметите это только в случае GET-запроса, так как POST-запросы обычно скрыты.
Пример #2 Данные, редактируемые пользователем
<?php
echo "<textarea name='mydata'>\n";
echo htmlspecialchars($data)."\n";
echo "</textarea>";
?>
Замечание: Данные показываются браузером как предполагается, потому что браузер будет интерпретировать экранированные HTML-символы. При отправке через GET или POST данные будут закодированы (urlencoded) браузером для передачи и декодированы (urldecoded) PHP. Поэтому вам не надо выполнять какое-либо кодирование/декодирование url самостоятельно, всё обрабатываются автоматически.
Пример #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 language='javascript'>\n";
echo " location.href=\"${_SERVER['SCRIPT_NAME']}?${_SERVER['QUERY_STRING']}"
. "&width=\" + screen.width + \"&height=\" + screen.height;\n";
echo "</script>\n";
exit();
}
?>