-
Notifications
You must be signed in to change notification settings - Fork 106
/
Copy pathhtml.xml
executable file
·353 lines (344 loc) · 12.6 KB
/
html.xml
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
<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 9e6c3416c5c285f807a734e4663c399612777d7e Maintainer: ae Status: ready --><!-- CREDITS: duan.trabalhohotmail.com,vagnerstrapassongmail.com,samirmachado,leonardolara -->
<chapter xml:id="faq.html" xmlns="http://docbook.org/ns/docbook">
<title>PHP e HTML</title>
<titleabbrev>PHP e HTML</titleabbrev>
<para>
PHP e HTML possuem muita interação: PHP pode gerar HTML, e o HTML
pode passar informações para o PHP. Antes de ler esses faqs, é importante
que você aprenda como recuperar <link linkend="language.variables.external">
variáveis de fontes externas</link>. A página do manual
neste tópico inclui muitos exemplos.
</para>
<qandaset>
<qandaentry xml:id="faq.html.encoding">
<question>
<para>
Que codificação/decodificação é preciso quando eu passo um valor através de um formulário/URL?
</para>
</question>
<answer>
<para>
Existem muitos estágios para o qual a codificação é importante. Assumindo que
você tenha uma <type>string</type> <varname>$data</varname>, o qual contém
a string que você quer passar de um jeito não codificado, esses são os
estágios relevantes:
<itemizedlist>
<listitem>
<para>
Interpretação HTML. A fim de especificar uma string aleatória, você
<emphasis>precisa</emphasis> incluí-la entre aspas, e converter todo o valor dos caracteres especiais para a realidade HTML usando
<function>htmlspecialchars</function>.
</para>
</listitem>
<listitem>
<para>
URL: Uma URL consiste de diversas partes. Se você quer que seus dados sejam
interpretados como um item, você <emphasis>precisa</emphasis> codificá-los com
<function>urlencode</function>.
</para>
</listitem>
</itemizedlist>
</para>
<para>
<example>
<title>Um elemento oculto de formulário HTML </title>
<programlisting role="php">
<![CDATA[
<?php
echo "<input type='hidden' value='" . htmlspecialchars($data) . "' />\n";
?>
]]>
</programlisting>
</example>
<note>
<simpara>
É errado <function>urlencode</function>
<varname>$data</varname>, porque é a responsabilidade do navegador em
<function>urlencode</function> os dados. Todos os navegadores populares o fazem isso
corretamente. Note que isso irá acontecer independentemente do método (i.e.,
GET ou POST).Você só vai perceber isso em caso de solicitação GET,
porque as requisições POST são normalmente escondidas.
</simpara>
</note>
<example>
<title>Dados a serem editados pelo usuário</title>
<programlisting role="php">
<![CDATA[
<?php
echo "<textarea name='mydata'>\n";
echo htmlspecialchars($data)."\n";
echo "</textarea>";
?>
]]>
</programlisting>
</example>
<note>
<simpara>
Os dados são mostrados no navegador como pretendido, porque o navegador irá
interpretar os símbolos de escape do HTML.
</simpara>
<simpara>
Em consequência do envio, tando via GET como POST, os dados vão ser urlencoded
pelo navegador para transferência, e urldecoded diretamente pelo PHP. Resumindo,
você não precisa fazer qualquer urlencoded/urldecoded pelo php,
tudo é feito automaticamente.
</simpara>
</note>
<example>
<title>Em uma URL</title>
<programlisting role="php">
<![CDATA[
<?php
echo "<a href='" . htmlspecialchars("/nextpage.php?stage=23&data=" .
urlencode($data)) . "'>\n";
?>
]]>
</programlisting>
</example>
<note>
<simpara>
De fato você está fingindo uma requisição HTML GET, portanto é necessário
<function>urlencode</function> os dados manualmente.
</simpara>
</note>
<note>
<simpara>
Você precisa <function>htmlspecialchars</function> toda a URL, porque a
URL ocorre como um valor de um atributo-HTML. Neste caso, o navegador
irá primeiramente un-<function>htmlspecialchars</function> o valor, e então passar
a URL. O PHP vai entender a URL corretamente, porque você codificou os dados com
<function>urlencode</function>.
</simpara>
<simpara>
Você vai notar que <literal>&</literal> na URL é substituído
por <literal>&amp;</literal>. Embora a maioria dos navegadores vão se recuperar
se vecê esquecer disso, isso nem sempre é possível. Então, mesmo se a URL
não é dinâmica, você <emphasis>precisa</emphasis>
<function>htmlspecialchars</function> a URL.
</simpara>
</note>
</para>
<!-- TODO: a note about addgpcslashes? -->
</answer>
</qandaentry>
<qandaentry xml:id="faq.html.form-image">
<question>
<para>
Estou tentando usar uma tag <input type="image">, mas as variáveis
<varname>$foo.x</varname> e <varname>$foo.y</varname> não estão
disponíveis. <varname>$_GET['foo.x']</varname> não existem
também. Onde elas estão?
</para>
</question>
<answer>
<para>
Ao enviar um formulário, é possível usar uma imagem em vez de
um botão submit padrão, como na tag:
<programlisting role="html">
<![CDATA[
<input type="image" src="image.gif" name="foo" />
]]>
</programlisting>
Quando o usuário clica em qualquer lugar na imagem, o formulário que o acompanha
será transmitido para o servidor com duas variáveis adicionais:
<varname>foo.x</varname> e <varname>foo.y</varname>.
</para>
<para>
Porque <varname>foo.x</varname> e <varname>foo.y</varname> faria
nome de variáveis inválidas no PHP, elas são automaticamente convertidas para
<varname>foo_x</varname> e <varname>foo_y</varname>. Ou seja, os
períodos são substituídos por sublinhados. Então, você teria acesso a essas variáveis
como qualquer outro descrito na seção sobre como recuperar
<link linkend="language.variables.external">variáveis de fontes
externas</link>. Por exemplo, <varname>$_GET['foo_x']</varname>.
<note>
<para>
Os espaços nos nomes das variáveis requisitadas são convertidas para sublinhado.
</para>
</note>
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.html.arrays">
<question>
<para>Como eu crio arrays em um HTML <form>?</para>
</question>
<answer>
<para>
Para obter o resultado do seu <form> enviado como um
<link linkend="language.types.array">array</link> para seu script PHP
você nomeia os elementos <input>, <select> ou <textarea>
como estes:
<programlisting role="html">
<![CDATA[
<input name="MyArray[]" />
<input name="MyArray[]" />
<input name="MyArray[]" />
<input name="MyArray[]" />
]]>
</programlisting>
Observe os colchetes após o nome da variável, é isso que
torna uma variável um array. Você pode agrupar os elementos dentro de diferentes arrays,
atribuindo o mesmo nome a diferentes elementos:
<programlisting role="html">
<![CDATA[
<input name="MyArray[]" />
<input name="MyArray[]" />
<input name="MyOtherArray[]" />
<input name="MyOtherArray[]" />
]]>
</programlisting>
Isso produz dois arrays, MyArray e MyOtherArray, que serão enviados
para o script PHP. Também é possível atribuir chaves específicas
para seus arrays:
<programlisting role="html">
<![CDATA[
<input name="AnotherArray[]" />
<input name="AnotherArray[]" />
<input name="AnotherArray[email]" />
<input name="AnotherArray[phone]" />
]]>
</programlisting>
O array AnotherArray irá conter agora as chaves 0, 1, email e phone.
</para>
<para>
<note>
<para>
Especificar uma chave de array é opcional no HTML. Se você não especificar
as chaves, o array preenche na ordem em que os elementos aparecem
no formulário. Nosso primeiro exemplo irá conter as chaves 0, 1, 2 e 3.
</para>
</note>
</para>
<para>
Veja também:
<link linkend="ref.array">Funções de Array </link> e
<link linkend="language.variables.external">Variáveis de fontes
Externas</link>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.html.select-multiple">
<question>
<para>
Como eu faço para obter os resultados de uma múltipla seleção de uma tag HTML?
</para>
</question>
<answer>
<para>
A seleção de múltiplas tags em uma construção HTML permite os usuários
selecionar múltiplos itens de uma lista. Esses itens são então passados
ao manipilador de ações para o formulário. O problema é que eles
são todos passados com o mesmo nome widget. I.e.
<programlisting role="html">
<![CDATA[
<select name="var" multiple="yes">
]]>
</programlisting>
Cada opção selecionada chegará ao manipulador de ações como:
<programlisting>
var=option1
var=option2
var=option3
</programlisting>
Cada opção irá substituir o conteúdo da variável anterior
<varname>$var</varname>. A solução é usar
a característica "array de elementos do formulário" do PHP. A seguir
devem ser usados:
<programlisting role="html">
<![CDATA[
<select name="var[]" multiple="yes">
]]>
</programlisting>
Isso diz ao PHP para tratar <varname>$var</varname> como um array e
cada atribuição de um valor para [var] acrescenta um item ao array.
O primeiro item se torna <varname>$var[0]</varname>, o próximo
<varname>$var[1]</varname>, etc. A função <function>count</function>
pode ser chamado para determinar quantas opções foram selecionadas,
e a função <function>sort</function> pode ser usada para classificar
o array de opções se necessário.
</para>
<para>
Note que se você está usando JavaScript o <literal>[]</literal>
no nome do elemento pode lhe causar problemas quando você tenta
se referir ao elemento pelo nome. Ao invés use o ID numérico do elemento
do formulário, ou coloque o nome da variável entre aspas simples e
use isso como um índice para os elementos do array, por exemplo:
<programlisting>
variable = document.forms[0].elements['var[]'];
</programlisting>
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.html.javascript-variable">
<question>
<para>
Como eu posso passar uma variável do Javascript para o PHP?
</para>
</question>
<answer>
<para>
Uma vez que o Javascript é (normalmente) uma tecnologia da parte do cliente, e
o PHP é (normalmente) uma tecnologia da parte do servidor, e uma vez que o HTTP é um
protocolo "sem lado", as duas linguagens não podem compartilhar variáveis
diretamente.
</para>
<para>
É , no entanto, possível passar variáveis entre as duas.
Uma maneira de realizar isso é gerar um código Javascript
com PHP, e ter um navegador que se atualize, passando variáveis
específicas de volta para o script PHP. O exemplo abaixo mostra
precisamente como fazer isso -- isso permite ao código PHP capturar a altura
e largura da tela, algo que normalmente só é possível no
lado do cliente.
</para>
<para>
<example>
<title>Gerando Javascript com PHP</title>
<programlisting role="php">
<![CDATA[
<?php
if (isset($_GET['width']) AND isset($_GET['height'])) {
// output the geometry variables
echo "Screen width is: ". $_GET['width'] ."<br />\n";
echo "Screen height is: ". $_GET['height'] ."<br />\n";
} else {
// pass the geometry variables
// (preserve the original query string
// -- post variables will need to handled differently)
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
-->