PHP и HTML-разметкаPHP и HTML
Язык программирования PHP и язык гипертекстовой разметки HTML тесно взаимодействуют:
PHP умеет генерировать HTML, а HTML умеет передавать информацию PHP. Перед чтением вопросов в этом разделе
важно понимать, как получать
переменные из внешних источников. Страницы руководства по этой теме
содержат много примеров.
Какое кодирование или декодирование я должен выполнять при передаче значения
через форму или URL-адрес?
Есть несколько этапов, на которых кодировка важна. Предположим, что у вас
есть переменная $data с типом string, которая содержит
строку, которую вы хотите передать без кодирования. Вот эти этапы:
Интерпретация HTML. Чтобы задать произвольную строку,
вы должны заключить её в двойные кавычки и
использовать функцию htmlspecialchars для кодирования.
URL: URL-адрес состоит из нескольких частей. Если вы хотите, чтобы
данные были восприняты как один элемент, нужно
закодировать их функцией urlencode.
Скрытый элемент HTML-формы
'."\n";
?>
]]>
Кодировать перменную $data функцией
urlencode неправильно, поскольку кодировать данные
urlencode это обязанность браузера. Популярные
браузеры делают это правильно.
Заметьте, что это произойдёт независимо от метода (например,
GET или POST). Это заметно только в случае GET-запроса,
поскольку POST-запросы обычно скрыты.
Данные, которые редактирует пользователь
\n";
echo htmlspecialchars($data) . "\n";
echo "";
?>
]]>
Браузер показывает данные как предполагалось, потому что браузер
интерпретирует экранированные HTML-символы.
При отправке через GET- или POST-метод браузер закодирует (urlencoded)
данные для передачи, а PHP декодирует (urldecoded). Поэтому
не нужно выполнять какое-либо кодирование или декодирование,
всё обрабатываются автоматически.
В URL
' . "\n"
;
?>
]]>
На самом деле вы подделываете HTML-запрос GET, поэтому необходимо
вручную закодировать (urlencode) данные.
Вам надо применить функцию htmlspecialchars
к полному URL-адресу, потому что URL-адрес появляется как значение HTML-атрибута.
При этом браузер сначала раскодирует всё значение
(операция, обратная действию функции htmlspecialchars) и затем передаст URL.
PHP поймёт URL-адрес правильно, поскольку вы закодировали данные
функцией urlencode.
Вы заметите, что символ & в URL-адресе заменяется на
мнемонику &. Хотя большинство браузеров это исправит,
если вы забудете об этом, но всё же это не всегда возможно. Поэтому,
даже если ваш URL-адрес не динамический, нужно
закодировать его функцией htmlspecialchars.
Я пытаюсь использовать <input type="image">, но переменные
$foo.x и $foo.y
недоступны. Значение $_GET['foo.x'] тоже не существует.
Где они?
При отправке формы, вместо стандартной кнопки отправки допустимо использовать
изображение с тэгом вроде такого:
]]>
Когда пользователь кликает по изображению, серверу будет послана
сопутствующая форма с двумя дополнительными переменными:
foo.x и foo.y.
Поскольку имена foo.x и foo.y
не разрешены в PHP, они автоматически преобразовываются в
foo_x и foo_y. То есть
точки заменяются на подчёркивания. Таким образом, вы обращаетесь к этим переменным
так же, как и к любым другим, описанным в разделе о получении
переменных извне
PHP. Например, $_GET['foo_x'].
Пробелы в именах переменных запроса преобразовываются в подчёркивания.
Как создать массивы в HTML <form>?
Чтобы браузер передал результат <form> в PHP-скрипт
как массив,
элементы <input>, <select> или <textarea> называют
следующим образом:
]]>
Обратите внимание на квадратные скобки после имени переменной: они делают переменную массивом.
Разработчику доступна группировка элементов в массив за счёт присваивания одинакового имени
разным элементам:
]]>
Это создаст два массива, MyArray и MyOtherArray, которые браузер передаст
PHP-скрипту. Можно также задать конкретные ключи для массивов:
]]>
Массив AnotherArray теперь будет содержать ключи 0, 1, email и phone.
Определять ключи массивов в HTML необязательно. Если вы не установите
ключи, массив заполнится в порядке появления элементов в форме.
Первый пример будет содержать ключи 0, 1, 2 и 3.
Также смотрите
Функции для работы с массивами и
Переменные извне PHP.
Как получить все результаты из HTML-тега select с атрибутом multiple?
HTML-тег select с атрибутом multiple разрешает пользователю выбрать
элементы из списка. Эти элементы затем передаются обработчику
формы. Проблема в том, что они переданы с одним и тем же именем.
Например:
]]>
Каждая выбранная опция поступит обработчику формы как:
var=option1
var=option2
var=option3
Каждая опция будет перезаписывать содержимое предыдущей переменной
$var. Решение — использовать функцию
PHP «массив из элемента формы». Как в следующем примере:
]]>
Это говорит PHP рассматривать переменную $var как массив и
каждое присваивание значения для var[] добавляет элемент в массив.
Первым элементом будет $var[0], следующим —
$var[1] и т. д. Можно использовать функцию count,
чтобы определить, сколько элементов было выбрано,
а функцию sort — для сортировки массива опций, если это необходимо.
Заметьте, если вы используете JavaScript, есть риск того, что запись []
в имени элемента вызовет проблемы, если вы пытаетесь обращаться к
элементу по имени. Вместо этого указывайте числовой идентификатор элемента формы или
возьмите имя переменной в одинарные кавычки и используйте его как
индекс массива элементов, например:
variable = document.forms[0].elements['var[]'];
Как передать переменную из JavaScript в PHP?
Поскольку JavaScript — обычно клиентская технология,
а PHP, как правило, серверная, и поскольку
HTML — протокол «без состояния», эти два языка не умеют обмениваться
переменными напрямую.
Однако можно передавать переменные между ними.
Один из способов добиться этого — сгенерировать JavaScript-код
из PHP и принудительно обновлять браузер, посылая определённые
переменные обратно PHP-скрипту. Пример показывает,
как это сделать — он разрешает PHP-коду захватывать высоту и ширину
экрана, что обычно возможно только на стороне клиента.
Генерирование JavaScript из PHP
\n";
echo "Высота экрана: " . $_GET['height'] . " \n";
} else {
// Передаём переменные с размерами
// (сохраняем оригинальную строку запроса
// — POST-переменные нужно будет передавать другим способом)
echo "\n";
exit;
}
?>
]]>