Язык Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ PHP и Ñзык гипертекÑтовой разметки HTML теÑно взаимодейÑтвуют: PHP умеет генерировать HTML, а HTML умеет передавать информацию PHP. Перед чтением вопроÑов в Ñтом разделе важно понимать, как получать переменные из внешних иÑточников. Страницы руководÑтва по Ñтой теме Ñодержат много примеров.
ЕÑть неÑколько Ñтапов, на которых кодировка важна. Предположим, что у Ð²Ð°Ñ ÐµÑть Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $data Ñ Ñ‚Ð¸Ð¿Ð¾Ð¼ string, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ñодержит Ñтроку, которую вы хотите передать без кодированиÑ. Вот Ñти Ñтапы:
Ð˜Ð½Ñ‚ÐµÑ€Ð¿Ñ€ÐµÑ‚Ð°Ñ†Ð¸Ñ HTML. Чтобы задать произвольную Ñтроку, вы должны заключить её в двойные кавычки и иÑпользовать функцию htmlspecialchars() Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ.
URL: URL-Ð°Ð´Ñ€ÐµÑ ÑоÑтоит из неÑкольких чаÑтей. ЕÑли вы хотите, чтобы данные были воÑпринÑты как один Ñлемент, нужно закодировать их функцией urlencode().
Пример #1 Скрытый Ñлемент HTML-формы
<?php
echo '<input type="hidden" value="' . htmlspecialchars($data) . '" />'."\n";
?>
Замечание: Кодировать перменную $data функцией urlencode() неправильно, поÑкольку кодировать данные urlencode() Ñто обÑзанноÑть браузера. ПопулÑрные браузеры делают Ñто правильно. Заметьте, что Ñто произойдёт незавиÑимо от метода (например, GET или POST). Ðто заметно только в Ñлучае GET-запроÑа, поÑкольку POST-запроÑÑ‹ обычно Ñкрыты.
Пример #2 Данные, которые редактирует пользователь
<?php
echo "<textarea name='mydata'>\n";
echo htmlspecialchars($data) . "\n";
echo "</textarea>";
?>
Замечание: Браузер показывает данные как предполагалоÑÑŒ, потому что браузер интерпретирует Ñкранированные HTML-Ñимволы. При отправке через GET- или POST-метод браузер закодирует (urlencoded) данные Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸, а PHP декодирует (urldecoded). ПоÑтому не нужно выполнÑть какое-либо кодирование или декодирование, вÑÑ‘ обрабатываютÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки.
Пример #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>\n";
echo " location.href = \"{$_SERVER['SCRIPT_NAME']}?{$_SERVER['QUERY_STRING']}"
. "&width=\" + screen.width + \"&height=\" + screen.height;\n";
echo "</script>\n";
exit;
}
?>