-
Notifications
You must be signed in to change notification settings - Fork 59
Expand file tree
/
Copy pathhtml.xml
More file actions
355 lines (346 loc) · 12.6 KB
/
html.xml
File metadata and controls
355 lines (346 loc) · 12.6 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
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 9e6c3416c5c285f807a734e4663c399612777d7e Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: yes Maintainer: seros -->
<chapter xml:id="faq.html" xmlns="http://docbook.org/ns/docbook">
<title>PHP y HTML</title>
<titleabbrev>PHP y HTML</titleabbrev>
<para>
PHP y HTML interactúan mucho: PHP puede generar HTML, y HTML
puede pasar información a PHP. Antes de leer esta sección, es
importante que aprenda cómo obtener <link linkend="language.variables.external">
variables desde fuentes externas</link>. La página del manual sobre
este tema incluye muchos ejemplos también.
</para>
<qandaset>
<qandaentry xml:id="faq.html.encoding">
<question>
<para>
¿Qué codificación/decodificación es necesaria al pasar un valor a través de un formulario/URL?
</para>
</question>
<answer>
<para>
Existen varios escenarios en los que la codificación es importante. Asumiendo que
se tiene un valor <varname>$datos</varname> de tipo <type>string</type>, el cual contiene
la cadena que desea pasar sin codificar, existen los escenarios
relevantes:
<itemizedlist>
<listitem>
<para>
Interpretación de HTML. Para especificar una cadena aleatoria,
<emphasis>es necesario</emphasis> incluirla entre comillas dobles, y
aplicar <function>htmlspecialchars</function> sobre el valor completo.
</para>
</listitem>
<listitem>
<para>
URL: Un URL consta de varias partes. Si los datos han de ser
interpretados como un elemento, <emphasis>es necesario</emphasis> codificarlo con
<function>urlencode</function>.
</para>
</listitem>
</itemizedlist>
</para>
<para>
<example>
<title>Un elemento oculto de un formulario HTML</title>
<programlisting role="php">
<![CDATA[
<?php
echo '<input type="hidden" value="' . htmlspecialchars($datos) . '" />'."\n";
?>
]]>
</programlisting>
</example>
<note>
<simpara>
No es correcto aplicar <function>urlencode</function> sobre
<varname>$datos</varname>, ya que es responsabilidad de los
navegadores codificar los datos. Todos los navegadores populares lo realizan
correctamente. Observe que esto ocurrirá independientemente del método (es decir,
GET o POST). Aunque solo se observará esto en el caso de una petición GET,
ya que las peticiones POST normalmente están ocultas.
</simpara>
</note>
<example>
<title>Datos a editar por el usuario</title>
<programlisting role="php">
<![CDATA[
<?php
echo "<textarea name='misdatos'>\n";
echo htmlspecialchars($datos)."\n";
echo "</textarea>";
?>
]]>
</programlisting>
</example>
<note>
<simpara>
Los datos son mostrados en el navegador como se esperaba, ya que el navegador
interpretará los símbolos HTML escapados.
</simpara>
<simpara>
Durante el envío, ya sea mediante GET o POST, los datos serán codificados
por el navegador para su transferencia, y serán decodificados directamente por PHP. Por lo tanto,
no será necesario realizar ninguna codificación/decodificación,
todo es manejado automáticamente.
</simpara>
</note>
<example>
<title>En un URL</title>
<programlisting role="php">
<![CDATA[
<?php
echo '<a href="' . htmlspecialchars("/siguientepagina.php?etapa=23&datos=" .
urlencode($datos)) . '">'."\n";
?>
]]>
</programlisting>
</example>
<note>
<simpara>
De hecho, se está imitando una petición GET de HTML, por lo que no es necesario
aplicar <function>urlencode</function> manualmente a los datos.
</simpara>
</note>
<note>
<simpara>
Es necesario usar <function>htmlspecialchars</function> sobre el URL completo, ya que el
URL se da como un valor de un atributo HTML. En este caso, el navegador primero
reemplazará los caracteres HTML especiales por los caracteres correctos del valor, y luego pasará
el URL. PHP entenderá el URL correctamente, ya que ya se utilizó
<function>urlencode</function> sobre los datos.
</simpara>
<simpara>
Se observará que el caracter <literal>&</literal> en el URL es reemplazado
por <literal>&amp;</literal>. Aunque la mayoría de navegadores entenderán el carácter
si se olvida esto, no siempre es posible que ocurra. Así que, incluso si un URL
no es dinámico, <emphasis>es necesario</emphasis> usar
<function>htmlspecialchars</function> sobre el URL.
</simpara>
</note>
</para>
<!-- TODO: a note about addgpcslashes? -->
</answer>
</qandaentry>
<qandaentry xml:id="faq.html.form-image">
<question>
<para>
Estoy intentando usar una etiqueta <input type="image">, pero
las variables <varname>$foo.x</varname> y <varname>$foo.y</varname> no
están disponibles. <varname>$_GET['foo.x']</varname> tampoco existe.
¿Dónde están?
</para>
</question>
<answer>
<para>
Cuando se envía un formulario, es posible usar una imagen en lugar del
botón de envío estándar con una etiqueta como esta:
<programlisting role="html">
<![CDATA[
<input type="image" src="imagen.gif" name="foo" />
]]>
</programlisting>
Cuando un usuario pulsa sobre la imagen, el formulario al que pertenece
será transmitido al servidor con dos variables adicionales:
<varname>foo.x</varname> y <varname>foo.y</varname>.
</para>
<para>
Dado que <varname>foo.x</varname> y <varname>foo.y</varname> habrían representado
nombres de variable inválidos en PHP, éstas son convertidas automáticamente a
<varname>foo_x</varname> y <varname>foo_y</varname>. Es decir, los puntos
son reemplazados con caracteres de subrayado. Por lo tanto, es posible acceder a estas variables
como cualquier otra descrita en la sección sobre la recuperación de <link
linkend="language.variables.external">variables desde fuentes
externas</link>. Por ejemplo, <varname>$_GET['foo_x']</varname>.
<note>
<para>
Los espacios en nombres de variables de petición son convertidos a caracteres de subrayado.
</para>
</note>
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.html.arrays">
<question>
<para>¿Cómo creo arrays en un <form> de HTML?</para>
</question>
<answer>
<para>
Para hacer que el resultado de <form> sea enviado como un
<link linkend="language.types.array">array</link> a un script de PHP,
se deben nombrar los elementos <input>, <select> o <textarea>
de esta forma:
<programlisting role="html">
<![CDATA[
<input name="MiArray[]" />
<input name="MiArray[]" />
<input name="MiArray[]" />
<input name="MiArray[]" />
]]>
</programlisting>
Observe los corchetes después del nombre de la variable; ellos son los que
la convierten en un array. Es posible agrupar los elementos en diferentes arrays
asignando el mismo nombre a elementos diferentes:
<programlisting role="html">
<![CDATA[
<input name="MiArray[]" />
<input name="MiArray[]" />
<input name="MiOtroArray[]" />
<input name="MiOtroArray[]" />
]]>
</programlisting>
Esto produce dos array, MiArray y MiOtroArray, que son enviados
al script PHP. También es posible asignar claves específicas
a los arrays:
<programlisting role="html">
<![CDATA[
<input name="OtroArray[]" />
<input name="OtroArray[]" />
<input name="OtroArray[email]" />
<input name="OtroArray[telefono]" />
]]>
</programlisting>
El array OtroArray ahora tendrá las claves 0, 1, email y telefono.
</para>
<para>
<note>
<para>
La especificación de claves de arrays es opcional en HTML. Si no se especifican
las claves, el array será rellenado en el orden en que aparecen los elementos en
el formulario. Nuestro primer ejemplo contendrá las claves 0, 1, 2 y 3.
</para>
</note>
</para>
<para>
Véase también
<link linkend="ref.array">Funciones de arrays</link> y
<link linkend="language.variables.external">Variables desde fuentes
externas</link>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.html.select-multiple">
<question>
<para>
¿Cómo obtengo todos los resultados de una etiqueta de selección múltiple en HTML?
</para>
</question>
<answer>
<para>
La etiqueta de selección múltiple en una construcción HTML permite a los usuarios
elegir varios elementos de una lista. Estos elementos son pasados entonces al
gestor de la acción del formulario. El problema es que todos son
pasados con el mismo nombre de control. Es decir,
<programlisting role="html">
<![CDATA[
<select name="var" multiple="yes">
]]>
</programlisting>
Cada opción elegida llegará al gestor de la acción como:
<programlisting>
var=opcion1
var=opcion2
var=opcion3
</programlisting>
Cada opción sobrescribirá el contenido de la variable
<varname>$var</varname> anterior. La solución es usar la
característica "array desde un elemento de formulario" de PHP.
Debería usarse la siguiente forma:
<programlisting role="html">
<![CDATA[
<select name="var[]" multiple="yes">
]]>
</programlisting>
Esto le indica a PHP que debe tratar <varname>$var</varname> como un array y
que cada asignación de un valor a var[] añade un elemento al array.
El primer elemento se convierte en <varname>$var[0]</varname>, el siguiente en
<varname>$var[1]</varname>, etc. La función <function>count</function>
puede usarse para determinar cuántas opciones fueron seleccionadas,
y la función <function>sort</function> puede usarse para ordenar el
array de opciones si fuera necesario.
</para>
<para>
Observe que si se está usando JavaScript, los caracteres <literal>[]</literal>
en el nombre del elemento podrían causar problemas al intentar
referirse al elemento por su nombre. Use el ID numérico del elemento del formulario
en su lugar, o encierre el nombre de la variable entre comillas simples y
úselo como índice del array de elementos, por ejemplo:
<programlisting>
variable = document.forms[0].elements['var[]'];
</programlisting>
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.html.javascript-variable">
<question>
<para>
¿Cómo puedo pasar una variable de Javascript a PHP?
</para>
</question>
<answer>
<para>
Ya que Javascript es una tecnología (usualmente) del lado del cliente, y
PHP es (usualmente) una tecnología del lado del servidor, y dado que HTTP es
un protocolo "sin estados", los dos lenguajes no pueden compartir variables
directamente.
</para>
<para>
Sin embargo, es posible pasar variables entre los dos.
Una forma de hacerlo es generar código Javascript
con PHP, y hacer que el navegador se refresque a sí mismo, volviendo a pasar
variables específicas al script de PHP. El ejemplo de abajo muestra
precisamente cómo hacer esto; permite que el código de PHP capture el alto
y el ancho de la pantalla, algo que normalmente sólo es posible en el
lado del cliente.
</para>
<para>
<example>
<title>Generación de Javascript con PHP</title>
<programlisting role="php">
<![CDATA[
<?php
if (isset($_GET['ancho']) AND isset($_GET['alto'])) {
// imprimir las variables de geometría
echo "El ancho de la pantalla es: ". $_GET['ancho'] ."<br />\n";
echo "El alto de la pantalla es: ". $_GET['alto'] ."<br />\n";
} else {
// pasar las variables de geometría
// (preservar la cadena de consulta original
// -- las variables post deberán ser manejadas de otra forma)
echo "<script language='javascript'>\n";
echo " location.href=\"{$_SERVER['SCRIPT_NAME']}?{$_SERVER['QUERY_STRING']}"
. "&ancho=\" + screen.width + \"&alto=\" + 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
-->