mirror of
https://github.com/php/doc-es.git
synced 2026-03-26 00:12:06 +01:00
git-svn-id: https://svn.php.net/repository/phpdoc/es/trunk@337149 c90b9560-bf6c-de11-be94-00142212c4b1
356 lines
13 KiB
XML
356 lines
13 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- $Revision$ -->
|
|
<!-- EN-Revision: 8b647de71ab443cb2784a82902bfc87728d587ae Maintainer: seros 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
|
|
-->
|