PHP и HTML тесно взаимодействуют: PHP может генерировать HTML, а HTML может передавать информацию PHP. Перед чтением вопросов в этом разделе важно чтобы вы понимали как получать переменные извне PHP. Страницы руководства по этой теме содержат много примеров. Обращайте особое внимание на то, что register_globals значит для вас.
Здесь несколько этапов, на которых кодировка важна. Предположим, что у вас есть $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, то [] в имени элемента может вызвать проблемы, если вы пытаетесь обращаться к элементу по имени. Вместо, используйте числовой ID элемента формы или заключите имя переменной в одиночные кавычки и используйте как индекс массива элементов, например:
variable = documents.forms[0].elements['var[]'];
Так как JavaScript является (обычно) клиентской технологией, а PHP является (обычно) серверной технологией, и так как HTML - протокол "без состояния", эти два языка не могут разделять переменные напрямую.
Однако, возможно передавать переменные между ними. Один из способов достичь этого - сгенерировать JavaScript код из PHP и заставить браузер обновиться, посылая определённые переменные назад PHP скрипту. Нижеприведённый пример показывает как это сделать -- он позволяет PHP коду получить высоту и ширину экрана, что, обычно, возможно только на стороне клиента.
Пример #4 Генерирование Javascript из PHP
<?php
if (isset($_GET['width']) AND isset($_GET['height'])) {
// выводим переменные с размерами
echo "Screen width is: ". $_GET['width'] ."<br />\n";
echo "Screen height is: ". $_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();
}
?>