-
Notifications
You must be signed in to change notification settings - Fork 80
Expand file tree
/
Copy pathhtml.xml
More file actions
359 lines (343 loc) · 16.4 KB
/
html.xml
File metadata and controls
359 lines (343 loc) · 16.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 9e6c3416c5c285f807a734e4663c399612777d7e Maintainer: shein Status: ready -->
<!-- Reviewed: no -->
<chapter xml:id="faq.html" xmlns="http://docbook.org/ns/docbook">
<title>PHP и HTML-разметка</title>
<titleabbrev>PHP и HTML</titleabbrev>
<para>
Язык программирования PHP и язык гипертекстовой разметки HTML тесно взаимодействуют:
PHP умеет генерировать HTML, а HTML умеет передавать информацию PHP. Перед чтением вопросов в этом разделе
важно понимать, как получать <link linkend="language.variables.external">
переменные из внешних источников</link>. Страницы руководства по этой теме
содержат много примеров.
</para>
<qandaset>
<qandaentry xml:id="faq.html.encoding">
<question>
<para>
Какое кодирование или декодирование я должен выполнять при передаче значения
через форму или URL-адрес?
</para>
</question>
<answer>
<para>
Есть несколько этапов, на которых кодировка важна. Предположим, что у вас
есть переменная <varname>$data</varname> с типом <type>string</type>, которая содержит
строку, которую вы хотите передать без кодирования. Вот эти этапы:
<itemizedlist>
<listitem>
<para>
Интерпретация HTML. Чтобы задать произвольную строку,
вы <emphasis>должны</emphasis> заключить её в двойные кавычки и
использовать функцию <function>htmlspecialchars</function> для кодирования.
</para>
</listitem>
<listitem>
<para>
URL: URL-адрес состоит из нескольких частей. Если вы хотите, чтобы
данные были восприняты как один элемент, <emphasis>нужно</emphasis>
закодировать их функцией <function>urlencode</function>.
</para>
</listitem>
</itemizedlist>
</para>
<para>
<example>
<title>Скрытый элемент HTML-формы</title>
<programlisting role="php">
<![CDATA[
<?php
echo '<input type="hidden" value="' . htmlspecialchars($data) . '" />'."\n";
?>
]]>
</programlisting>
</example>
<note>
<simpara>
Кодировать перменную <varname>$data</varname> функцией
<function>urlencode</function> неправильно, поскольку кодировать данные
<function>urlencode</function> это обязанность браузера. Популярные
браузеры делают это правильно.
Заметьте, что это произойдёт независимо от метода (например,
GET или POST). Это заметно только в случае GET-запроса,
поскольку POST-запросы обычно скрыты.
</simpara>
</note>
<example>
<title>Данные, которые редактирует пользователь</title>
<programlisting role="php">
<![CDATA[
<?php
echo "<textarea name='mydata'>\n";
echo htmlspecialchars($data) . "\n";
echo "</textarea>";
?>
]]>
</programlisting>
</example>
<note>
<simpara>
Браузер показывает данные как предполагалось, потому что браузер
интерпретирует экранированные HTML-символы.
</simpara>
<simpara>
При отправке через GET- или POST-метод браузер закодирует (urlencoded)
данные для передачи, а PHP декодирует (urldecoded). Поэтому
не нужно выполнять какое-либо кодирование или декодирование,
всё обрабатываются автоматически.
</simpara>
</note>
<example>
<title>В URL</title>
<programlisting role="php">
<![CDATA[
<?php
echo '<a href="' . htmlspecialchars("/nextpage.php?stage=23&data=" .
urlencode($data)) . '">' . "\n"
;
?>
]]>
</programlisting>
</example>
<note>
<simpara>
На самом деле вы подделываете HTML-запрос GET, поэтому необходимо
вручную закодировать (<function>urlencode</function>) данные.
</simpara>
</note>
<note>
<simpara>
Вам надо применить функцию <function>htmlspecialchars</function>
к полному URL-адресу, потому что URL-адрес появляется как значение HTML-атрибута.
При этом браузер сначала раскодирует всё значение
(операция, обратная действию функции <function>htmlspecialchars</function>) и затем передаст URL.
PHP поймёт URL-адрес правильно, поскольку вы закодировали данные
функцией <function>urlencode</function>.
</simpara>
<simpara>
Вы заметите, что символ <literal>&</literal> в URL-адресе заменяется на
мнемонику <literal>&amp;</literal>. Хотя большинство браузеров это исправит,
если вы забудете об этом, но всё же это не всегда возможно. Поэтому,
даже если ваш URL-адрес не динамический, <emphasis>нужно</emphasis>
закодировать его функцией <function>htmlspecialchars</function>.
</simpara>
</note>
</para>
<!-- TODO: a note about addgpcslashes? -->
</answer>
</qandaentry>
<qandaentry xml:id="faq.html.form-image">
<question>
<para>
Я пытаюсь использовать <input type="image">, но переменные
<varname>$foo.x</varname> и <varname>$foo.y</varname>
недоступны. Значение <varname>$_GET['foo.x']</varname> тоже не существует.
Где они?
</para>
</question>
<answer>
<para>
При отправке формы, вместо стандартной кнопки отправки допустимо использовать
изображение с тэгом вроде такого:
<programlisting role="html">
<![CDATA[
<input type="image" src="image.gif" name="foo" />
]]>
</programlisting>
Когда пользователь кликает по изображению, серверу будет послана
сопутствующая форма с двумя дополнительными переменными:
<varname>foo.x</varname> и <varname>foo.y</varname>.
</para>
<para>
Поскольку имена <varname>foo.x</varname> и <varname>foo.y</varname>
не разрешены в PHP, они автоматически преобразовываются в
<varname>foo_x</varname> и <varname>foo_y</varname>. То есть
точки заменяются на подчёркивания. Таким образом, вы обращаетесь к этим переменным
так же, как и к любым другим, описанным в разделе о получении
<link linkend="language.variables.external">переменных извне
PHP</link>. Например, <varname>$_GET['foo_x']</varname>.
<note>
<para>
Пробелы в именах переменных запроса преобразовываются в подчёркивания.
</para>
</note>
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.html.arrays">
<question>
<para>Как создать массивы в HTML <form>?</para>
</question>
<answer>
<para>
Чтобы браузер передал результат <form> в PHP-скрипт
как <link linkend="language.types.array">массив</link>,
элементы <input>, <select> или <textarea> называют
следующим образом:
<programlisting role="html">
<![CDATA[
<input name="MyArray[]" />
<input name="MyArray[]" />
<input name="MyArray[]" />
<input name="MyArray[]" />
]]>
</programlisting>
Обратите внимание на квадратные скобки после имени переменной: они делают переменную массивом.
Разработчику доступна группировка элементов в массив за счёт присваивания одинакового имени
разным элементам:
<programlisting role="html">
<![CDATA[
<input name="MyArray[]" />
<input name="MyArray[]" />
<input name="MyOtherArray[]" />
<input name="MyOtherArray[]" />
]]>
</programlisting>
Это создаст два массива, MyArray и MyOtherArray, которые браузер передаст
PHP-скрипту. Можно также задать конкретные ключи для массивов:
<programlisting role="html">
<![CDATA[
<input name="AnotherArray[]" />
<input name="AnotherArray[]" />
<input name="AnotherArray[email]" />
<input name="AnotherArray[phone]" />
]]>
</programlisting>
Массив AnotherArray теперь будет содержать ключи 0, 1, email и phone.
</para>
<para>
<note>
<para>
Определять ключи массивов в HTML необязательно. Если вы не установите
ключи, массив заполнится в порядке появления элементов в форме.
Первый пример будет содержать ключи 0, 1, 2 и 3.
</para>
</note>
</para>
<para>
Также смотрите
<link linkend="ref.array">Функции для работы с массивами</link> и
<link linkend="language.variables.external">Переменные извне PHP</link>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.html.select-multiple">
<question>
<para>
Как получить все результаты из HTML-тега select с атрибутом multiple?
</para>
</question>
<answer>
<para>
HTML-тег select с атрибутом multiple разрешает пользователю выбрать
элементы из списка. Эти элементы затем передаются обработчику
формы. Проблема в том, что они переданы с одним и тем же именем.
Например:
<programlisting role="html">
<![CDATA[
<select name="var" multiple="yes">
]]>
</programlisting>
Каждая выбранная опция поступит обработчику формы как:
<programlisting>
var=option1
var=option2
var=option3
</programlisting>
Каждая опция будет перезаписывать содержимое предыдущей переменной
<varname>$var</varname>. Решение — использовать функцию
PHP «массив из элемента формы». Как в следующем примере:
<programlisting role="html">
<![CDATA[
<select name="var[]" multiple="yes">
]]>
</programlisting>
Это говорит PHP рассматривать переменную <varname>$var</varname> как массив и
каждое присваивание значения для var[] добавляет элемент в массив.
Первым элементом будет <varname>$var[0]</varname>, следующим —
<varname>$var[1]</varname> и т. д. Можно использовать функцию <function>count</function>,
чтобы определить, сколько элементов было выбрано,
а функцию <function>sort</function> — для сортировки массива опций, если это необходимо.
</para>
<para>
Заметьте, если вы используете JavaScript, есть риск того, что запись <literal>[]</literal>
в имени элемента вызовет проблемы, если вы пытаетесь обращаться к
элементу по имени. Вместо этого указывайте числовой идентификатор элемента формы или
возьмите имя переменной в одинарные кавычки и используйте его как
индекс массива элементов, например:
<programlisting>
variable = document.forms[0].elements['var[]'];
</programlisting>
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.html.javascript-variable">
<question>
<para>
Как передать переменную из JavaScript в PHP?
</para>
</question>
<answer>
<para>
Поскольку JavaScript — обычно клиентская технология,
а PHP, как правило, серверная, и поскольку
HTML — протокол «без состояния», эти два языка не умеют обмениваться
переменными напрямую.
</para>
<para>
Однако можно передавать переменные между ними.
Один из способов добиться этого — сгенерировать JavaScript-код
из PHP и принудительно обновлять браузер, посылая определённые
переменные обратно PHP-скрипту. Пример показывает,
как это сделать — он разрешает PHP-коду захватывать высоту и ширину
экрана, что обычно возможно только на стороне клиента.
</para>
<para>
<example>
<title>Генерирование JavaScript из PHP</title>
<programlisting role="php">
<![CDATA[
<?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;
}
?>
]]>
</programlisting>
</example>
</para>
</answer>
</qandaentry>
</qandaset>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->