|
|
Глава 56. PHP и HTML
PHP и HTML взаимодействуют тесно : PHP может генерировать HTML и HTML
может передавать информацию PHP. Перед чтением вопросов в этом разделе
важно чтобы вы понимали как
получать переменные извне PHP. Страницы руководства по этой теме
содержат много примеров. Обращайте особое внимание на то, что
register_globals значит для вас.
- 1.
Какое кодирование/декодирование я должен выполнять при передаче значения
через форму/URL?
- 2.
Я пытаюсь использовать <input type="image">, но переменные
$foo.x и $foo.y
недоступны. $_GET['foo.x'] тоже не существует.
Где они?
- 3. Как создать массивы в HTML <form>?
- 4.
Как получить все результаты из HTML тэга select с опцией multiple?
- 5.
Как я могу передать переменную из JavaScript в PHP?
1.
Какое кодирование/декодирование я должен выполнять при передаче значения
через форму/URL?
Здесь несколько этапов, на которых кодировка важна. Предположим, что у вас
есть $data типа string, содержащая
строку, которую вы хотите передать некодируемым путем, важные следующие этапы:
Интерпретация HTML. Для того, чтобы задать произвольную строку,
вы должны заключить её в двойные кавычки и
вызвать htmlspecialchars() на всё значение.
URL: URL состоит из нескольких частей. Если вы хотите чтобы ваши
данные были восприняты как один элемент, вы должны
закодировать их с помощью urlencode().
Пример 56-1. Скрытый элемент HTML формы |
<?php
echo "<input type='hidden' value='" . htmlspecialchars($data) . "' />\n";
?>
|
|
Замечание:
Использовать urlencode() для
$data будет неправильным, так как
urlencode() кодирование данных на
ответственности браузеров. Все популярные браузеры делают это правильно.
Отметьте, что это происходит вне зависимости от метода (например,
GET или POST). Однако, вы заметите это только в случае GET запроса,
так как POST запросы обычно скрыты.
Пример 56-2. Данные, редактируемые пользователем |
<?php
echo "<textarea name='mydata'>\n";
echo htmlspecialchars($data)."\n";
echo "</textarea>";
?>
|
|
Замечание:
Данные показываются браузером как предполагается, потому что браузер будет
интерпретировать экранированные HTML символы.
При отправке через GET или POST данные будут закодированы (urlencoded)
браузером для передачи и раскодированы (urldecoded) PHP. Поэтому вам
не надо выполнять какое-либо url-кодирование/url-раскодирование самим,
все выполняется автомагически.
Пример 56-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 правильно, так как вы закодировали данные с
urlencoded().
Вы заметите, что & в URL заменяется на
&. Хотя большинство браузеров выправится,
если вы забудете об этом, но всё же это не всегда возможно. Поэтому,
даже если ваш URL не динамический, вам надо
закодировать его с помощью htmlspecialchars().
2.
Я пытаюсь использовать <input type="image">, но переменные
$foo.x и $foo.y
недоступны. $_GET['foo.x'] тоже не существует.
Где они?
При отправке формы, вместо стандартной кнопки посылки возможно использовать
изображение с тэгом как:
<input type="image" src="image.gif" name="foo" /> |
Когда пользователь щёлкает где-либо на картинке, серверу будет послана
сопутствующая форма с двумя дополнительными переменными:
foo.x и foo.y.
Так как имена foo.x и foo.y
нелегальны в PHP, они автомагически превращаются в
foo_x и foo_y. То есть,
точки заменяются на подчёркивание. Вы обращаетесь к этим переменным
так же как к любым другим, описанным в разделе о получении
переменных извне
PHP. Например, $_GET['foo_x'].
Замечание:
Пробелы в именах переменных запроса преобразуются в подчёркивания.
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 с опцией multiple?
HTML тэг select с multiple позволяет пользователю выбрать несколько
элементов из списка. Эти элементы затем передаются обработчику
формы. Проблема в том, что они все переданы с одним и тем же именем.
Например:
<select name="var" multiple="yes"> |
Каждая выбранная опция поступит обработчику формы как:
var=option1
var=option2
var=option3 |
Каждая опция будет затирать содержимое предыдущей переменной
$var. Решение - воспользоваться возможностью
PHP "массив из элемента формы". Должно быть задано следующее:
<select name="var[]" multiple="yes"> |
Это укажет PHP обращаться с $var как с массивом и
каждое присваивание значения для var[] добавит элемент в массив.
Первый элемент становится $var[0], следующий
$var[1] и т.д. Функция count()
может быть использована для определения сколько элементов было выбрано
и функция sort() может быть использована для
сортировки массива опций, если необходимо.
Заметьте, что если вы используете JavaScript, то []
в имени элемента может вызвать проблемы, если вы пытаетесь обращаться к
элементу по имени. Вместо, используйте числовой ID элемента формы или
заключите имя переменной в одиночные скобки и используйте как
индекс массива элементов, например:
variable = documents.forms[0].elements['var[]']; |
5.
Как я могу передать переменную из JavaScript в PHP?
Так как JavaScript является (обычно) технологией на стороне клиента,
а PHP является (обычно) технологией серверной стороны и так как
HTML - протокол "без состояния", эти два языка не могут разделять
переменные напрямую.
Однако, возможно передавать переменные между ними.
Один из способов достичь этого - сгенерировать JavaScript код
из PHP и заставить браузер обновиться, посылая определённые
переменные назад PHP скрипту. Нижеприведённый пример показывает
как это сделать -- он позволяет 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 {
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();
}
?>
|
todd at activeriver dot com
25-Jun-2007 02:44
Ajax seems to be a cleaner way to send javascript vars to a php script.
more information can be found here:
www.phpbuilder.com/columns/kassemi20050606.php3
Andreas R.
01-May-2007 05:14
Actually Example 56.1 doesn't conform to what is stated in the text above it, namely:
* HTML interpretation. In order to specify a random string, you must include it in double quotes, and htmlspecialchars() the whole value.
In the example code single quotes are used instead of double quotes:
<?php
echo "<input type='hidden' value='" . htmlspecialchars($data) . "' />\n";
?>
which should be instead:
<?php
echo "<input type='hidden' value=\"" . htmlspecialchars($data) . "\" />\n";
?>
If single quotes are used, they should be escaped too using ENT_QUOTES quote style for htmlspecialchars.
francesco
07-Nov-2006 06:41
Another way to pass variables from JavaScript to PHP.
<script type="text/javascript" language="JavaScript">
<!--
function getScreenResolution()
{
return document.form.ScreenResolution.value = screen.width + "x" + screen.height;
}
//-->
</script>
<form name="form" action="screen.php?show=ok" method="post" >
<input name="ScreenResolution" type="text" size="20" maxlength="9" />
<input name="show" type="submit" value="Submit" onclick="getScreenResolution()" />
</form>
<?php
echo $_POST['ScreenResolution'];
?>
tchibolecafe at freemail dot hu
12-Aug-2006 04:34
Notes on question "1. What encoding/decoding do I need when I pass a value through a
form/URL?"
Doing an htmlspecialchars() when echoing a string as an HTML attribute value is not enough to make the string safe if you have accented (non-ASCII) characters in it. See http://www.w3.org/TR/REC-html40/appendix/notes.html#non-ascii-chars
The referred document recommends the following method to be used:
<?php
function fs_attr($path){
$retval='';
for($i=0;$i<strlen($path);$i++){
$c=$path{$i};
if(ord($c)<128){
$retval.=$c;
}else{
$retval.=urlencode(utf8_encode($c));
}
}
return htmlspecialchars($retval);
}
$img_path='
|
|