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-адресе заменяется на мнемонику &amp;. Хотя большинство браузеров это исправит, если вы забудете об этом, но всё же это не всегда возможно. Поэтому, даже если ваш 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; } ?> ]]>