Главная Статьи Написать
 
Начнём
Введение
Инсталяция
Конфигурирование
Безопасность
Справочник Языка
Базовый синтаксис
Типы
Переменные
Константы
Выражения
Операции
Структуры управления
Функции
Классы и Объекты
Ссылки. Разъяснение.
Возможности
Обработка Ошибок
Создание изображений и манипуляции с ними
HTTP-аутентификация в PHP
Куки
Обработка загрузки файлов
Использование удалённых файлов
Обслуживание соединений
Постоянные соединения с базами данных
Безопасный режим
Использование PHP из командной строки
Функции. Справочник.
Функции, специфические для Apache
Array-функции
Aspell-функции [не рекомендуются]
BCMath математические функции произвольной точности
Bzip2 Compression-функции
Calendar-функции
CCVS API-функции
Функции поддержки COM для Windows
Class/Object-функции
ClibPDF-функции
Crack-функции
CURL, Client URL Library-функции
Cybercash payment-функции
Crédit Mutuel CyberMUT-функции
Cyrus IMAP -функции администрирования
Функции типов символов
Функции абстрактного слоя БД (dbm-стиль)
Дата и Время
dBase-функции
DBM-функции
dbx-функции
DB++-функции
Direct IO-функции
Функции директорий
DOM XML-функции
.NET-функции
Обработка ошибок и логинг
FrontBase-функции
filePro-функции
Функции файловой системы
Forms Data Format-функции
FriBiDi-функции
FTP-функции
Функции работы с функциями
Gettext
GMP-функции
HTTP-функции
Hyperwave-функции
Hyperwave API-функции
ICAP-функции [не рекомендуются]
iconv-функции
Image-функции
IMAP, POP3 и NNTP-функции
Informix-функции
InterBase-функции
Ingres II-функции
IRC Gateway-функции
Java
LDAP-функции
Mail-функции
mailparse-функции
Mathematical-функции
Многобайтные строки
MCAL-функции
Mcrypt Encryption-функции
Mhash-функции
Mimetype-функции
Microsoft SQL Server-функции
Ming-функции для Flash
Прочие функции
mnoGoSearch-функции
mSQL-функции
MySQL-функции
Mohawk Software -функции обработчика сессии
muscat-функции
Network-функции
Ncurses -функции управления терминалом
Lotus Notes-функции
Unified ODBC-функции
Oracle 8-функции
OpenSSL-функции
Oracle-функции
Ovrimos SQL-функции
Управление выводом
Перегрузка свойств объектов и вызовов методов
PDF-функции
Verisign Payflow Pro-функции
PHP. Опции & Информация
POSIX-функции
PostgreSQL-функции
Управление процессом
Выполнение программы
Printer-функции
Pspell-функции
GNU Readline
GNU Recode-функции
Функции регулярных выражений (Perl-совместимые)
qtdom-функции
Функции регулярных выражений (POSIX расширенная)
Semaphore, Shared Memory и IPC-функции
SESAM database-функции
Обслуживание сессий
Shared Memory-функции
Shockwave Flash-функции
SNMP-функции
Socket-функции
String-функции
Sybase-функции
URL-функции
Функции переменных
vpopmail-функции
W32api-функции
WDDX-функции
XML parser-функции
XMLRPC-функции
XSLT-функции
YAZ-функции
YP/NIS-функции
Zip File-функции (доступ только для чтения)
Zlib Compression-функции
Расширение PHP 4.0
Обзор
Возможность расширения
Строение исходного кода
Система автоматического построения РНР
Создание расширений
Использование расширений
Решение проблем
Исходные Ресурсы. Обсуждение.
Приём аргументов
Создание переменных
Дублирование содержимого переменной: конструктор Copy
Возвращаемые значения
Печать информации
Startup и Shutdown-функции
Вызов пользовательских функций
Поддержка файлов инициализации
Что дальше?
Справочник: некоторые макросы конфигурации
Макросы API
FAQ: Frequently Asked Questions
Общая информация
Списки рассылки
Получение PHP
Вопросы о базах данных
Инсталяция
Проблемы построения
Использование PHP
PHP и HTML
PHP и COM
PHP и другие языки
Переход от PHP 2 к PHP 3
Переход от PHP 3 к PHP 4
Другие вопросы
Приложения
История PHP и смежных проектов
Переход от PHP 3 к PHP 4
Переход от PHP/FI 2 к PHP 3
Отладка PHP
Расширение PHP
Список псевдонимов функций
Список зарезервированных слов
Список типов ресурсов
Список лексем разборщика
Об этом учебнике




Глава 51. PHP и HTML

PHP и HTML тесно связаны: PHP генерирует HTML, а HTML содержит информацию , которая высылается  в PHP.

1. Какое кодирование/декодирование я должен выполнять при передаче значения в HTМL-форме? А через URL?
2. Я пытаюсь использовать тэг <input type="image">, но переменные $foo.x и $foo.y недоступны. Где они?
3. Как мне создать массивы в HTML-тэге <form>?
4. Как мне получит все результаты из HTML-тэга множественного выбора select?

1. Какое кодирование/декодирование я должен выполнять при передаче значения в HTМL-форме? А через URL?

Есть несколько этапов, когда кодировка имеет важное значение. Предположим, у вас имеется переменная string $data, содержащая строку, которую вы хотите передать некодированным способом. Тогда необходимые шаги:

  • HTML-интерпретация. Чтобы специфицировать произвольную строку, вы обязаны заключить её в двойные кавычки, а htmlspecialchars - всё значение.

  • URL: URL состоит из нескольких частей. Если вы хотите, чтобы ваши данные интерпретировались как один элемент, вы обязаны кодировать их с помощью urlencode().

Пример 51-1. Элемент hidden HTML-формы
<?php
    echo "<input type=hidden value=\"" . htmlspecialchars($data) . "\">\n";
?>

Примечание: неверным будет urlencode() $data, поскольку за urlencode() данных отвечает браузер. Все популярные браузеры делают это корректно. Заметьте, что это делается независимо от метода (GET или POST). Вы увидите это только при методе GET, поскольку POST-запросы обычно скрыты/hidden.

Пример 51-2. Данные, редактируемые пользователем
<?php
    echo "<textarea name=mydata>\n";
    echo htmlspecialchars($data)."\n";
    echo "</textarea>";
?>

Примечание: эти данные будут выведены в браузере так, как задумано, поскольку браузер будет интерпретировать заменённые (escaped) html-символы.

При отправке, через GET или POST, данные будут url-кодированы браузером для передачи и непосредственно url-декодированы в PHP. Поэтому в результате вам ничего не нужно urlencodе/urldecodе самостоятельно, всё необходимое выполняется автоматически.

Пример 51-3. В URL
<?php
    echo "<a href=\"" . htmlspecialchars("/nextpage.php?stage=23&data=" .
        urlencode($data)) . "\">\n";
?>

Примечание: фактически вы обходите HTML GET-запрос, поэтому нужно вручную urlencode() данные.

Примечание: вы должны весь URL, поскольку URL появляется как значение HTML-атрибута. В этом случае браузер сначала де- htmlspecialchars() значение, а затем передаёт URL. PHP поймёт URL корректно, так как вы urlencoded() данные.

Вы увидите, что символ & в URL будет заменён на &amp;. Хотя большинство браузеров исправят ситуацию, если вы забудете сделать это, это не всегда возможно. Поэтому, даже если даже ваш URL не является динамическим, вы должны URL.

2. Я пытаюсь использовать тэг <input type="image">, но переменные $foo.x и $foo.y недоступны. Где они?

При отправке формы можно использовать с тэгом изображение вместо стандартной кнопки submit, как здесь:

<input type="image" src="image.gif" name="foo">

Когда пользователь щёлкает по изображению, соответствующая форма будет передана на сервер с двумя дополнительными переменными: foo.x и foo.y.

Поскольку $foo.x и $foo.y являются неверными именами переменных в PHP, они автоматически конвертируются в $foo_x и $foo_y. То есть, точки заменяются на символы подчёркивания.

3. Как мне создать массивы в HTML-тэге <form>?

Чтобы получить результат вашей <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[]">

Это создаст два массива - MyArray и MyOtherArray, которые будут отправлены PHP-скрипту. Можно также присвоить вашим массивам специфические ключи:

<input name="AnotherArray[]">
<input name="AnotherArray[]">
<input name="AnotherArray[email]">
<input name="AnotherArray[phone]">

Массив AnotherArray теперь будет содержать ключи 0, 1, email и phone.

Примечание: специфицирование ключей массива делается в HTML по выбору. Если вы не специфицируете ключи, массив заполняется элементами в порядке их появления на форме. Массив нашего первого примера будет содержать ключи 0, 1, 2  3.

См. также Функции массива и Переменные за пределами PHP.

4. Как мне получит все результаты из HTML-тэга множественного выбора select?

Тэг select multiple в HTML позволяет пользователю делать выбор нескольких позиций в списке. Эти позиции передаются затем обработчику акции формы. Проблема в том, что они все передаются с одним и тем же именем. Например:

<select name="var" multiple>

Каждая выбранная опция дойдёт до обработчика акции как:

var=option1
var=option2
var=option3

Каждая опция будет перезаписывать содержимое предыдущей переменной $var. Решением будет использование "массива элемента form" РНР. Нужно использовать следующее:

<select name="var[]" multiple>

Это говорит PHP, что переменную $var нужно считать массивом, и каждое присвоение значения var[] добавляет элемент в этот массив. Первый элемент будет $var[0], следующий - $var[1] и т.д. Функция count() может использоваться для определения количества выбранных опций, а функция sort() - для сортировки массива опций, если необходимо.

Обратите внимание, что, если вы используете JavaScript, наличие [] в имени элемента может создать проблемы, если вы попытаетесь обратиться к элементу по имени. Вместо имени используйте id элемента формы или заключите имя переменной в одинарные кавычки и используйте его как индекс в массиве элементов, например:

variable = documents.forms[0].elements['var[]'];