-
Notifications
You must be signed in to change notification settings - Fork 16
Expand file tree
/
Copy pathhtml.xml
More file actions
344 lines (335 loc) · 15.1 KB
/
html.xml
File metadata and controls
344 lines (335 loc) · 15.1 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
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 9e6c3416c5c285f807a734e4663c399612777d7e Maintainer: mproshchuk Status: ready -->
<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>
Є кілька етапів, для яких кодування є важливим. Припустимо, що ви маєте
<type>string</type> <varname>$data</varname>, яка містить рядок, який ви
хочете передати незакодованим. Це виглядатиме таким чином:
<itemizedlist>
<listitem>
<para>
HTML-інтерпретація. Задаючи випадковий рядок, ви
<emphasis>мусите</emphasis> помістити його у подвійні лапки та обробити
таке значення функцією <function>htmlspecialchars</function>.
</para>
</listitem>
<listitem>
<para>
URL: 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> тому, що за це відповідає браузер. Усі
популярні браузери роблять це правильно, незалежно від методу (себто 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, браузер закодує дані в URL
для передавання до PHP, який їх розкодує. Тож вам не треба самостійно
щось кодувати, все обробиться автоматично.
</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>
Якщо ви модулюєте GET-запит, необхідно власноруч застосувати
<function>urlencode</function> до даних.
</simpara>
</note>
<note>
<simpara>
Вам потрібно обробити всю URL функцією
<function>htmlspecialchars</function>, щоб 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> до URL.
</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> and <varname>foo.y</varname>.
</para>
<para>
Оскільки <varname>foo.x</varname> і <varname>foo.y</varname> містять в
назвах недозволені символи, вони автоматично перейменуються на
<varname>foo_x</varname> і <varname>foo_y</varname>. Тобто крапки
заміняться на підкреслення. Таким чином, ви матимете доступ до цих
змінних, як і до будь-яких інших, описаних в розділі про отримання
<link linkend="language.variables.external">змінних з зовнішніх
джерел</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>
Для отримання в скрипті PHP надісланого результату як
<link linkend="language.types.array">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">Змінні з зовнішніх
джерел</link>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.html.select-multiple">
<question>
<para>
Як мені отримати всі вибрані варіанти з множинного виду HTML-тегу
<select>?
</para>
</question>
<answer>
<para>
Множинний вид тегу <select> в HTML дозволяє користувачам обрати
кілька елементів з списку. Далі ці елементи передаються до обробника
дій форми. Проблема в тому, що вони всі передаються з однаковою назвою.
Тобто:
<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> в
назві елемента може спровокувати проблеми при намаганні звернутися до
елемента за атрибутом "name". Краще використати атрибут "id" або вкласти
назву змінної в одинарні лапки та використовувати її як індекс масиву
елементів. Наприклад:
<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 (зазвичай) —
сервер, а HTTP — це протокол "без стану", дві мови не мають функціоналу
прямого обміну змінними.
</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 language='javascript'>\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
-->