PHP y HTML interactúan bastante: PHP puede generar HTML, y HTML puede pasar información a PHP. Antes de leer estas preguntas, es importante que aprenda cómo recuperar variables desde el exterior de PHP. La página del manual sobre este tema incluye bastantes ejemplos también. Preste atención especialmente a lo que register_globals representa para usted.
¿Qué codificación/decodificación necesito al pasar un valor a través de un formulario/URL?
Existen varias etapas en las que la codificación es importante. Asumiendo que tiene un valor tipo string $datos, que contiene la cadena que desea pasar sin codificar, estas son las etapas relevantes:
Interpretación de HTML. Para especificar una cadena cualquiera, es necesario incluirla en comillas dobles, y aplicar htmlspecialchars() sobre el valor completo.
URL: Una URL consiste de varias partes. Si desea que sus datos sean interpretados como un ítem, es necesario codificarla con urlencode().
Example#1 Un elemento escondido de un formulario HTML
<?php
echo "<input type='hidden' value='" . htmlspecialchars($datos) . "' />\n";
?>
Note: No es correcto aplicar urlencode() sobre $datos, ya que es responsabilidad de los navegadores codificar los datos. Todos los navegadores populares lo hacen correctamente. Note que esto ocurrirá independientemente del método (es decir, GET o POST). Sin embargo, solo notará esto en el caso de una petición GET, ya que las peticiones POST usualmente son escondidas.
Example#2 Datos a ser editados por el usuario
<?php
echo "<textarea name='misdatos'>\n";
echo htmlspecialchars($datos)."\n";
echo "</textarea>";
?>
Note: Los datos son mostrados en el navegador como es de esperarse, ya que el navegador interpretará los símbolos HTML escapados. Luego de ser enviados, ya sea por GET o POST, los datos serás codificados por el navegador para su transferencia, y serán decodificados directamente por PHP. Así que en lo que a usted concierne, no necesitará realizar ninguna codificación/decodificación, todo es manejado automáticamente.
Example#3 En una URL
<?php
echo "<a href='" . htmlspecialchars("/siguientepagina.php?etapa=23&datos=" .
urlencode($datos)) . "'>\n";
?>
Note: En realidad está imitando una peticián HTML GET, por lo tanto no es necesario aplicar urlencode() manualmente a los datos.
Note: Es necesario usar htmlspecialchars() sobre la URL completa, ya que la URL ocurre como el valor de un atributo HTML. En este caso, el navegador primero reemplazará las entidades HTML especiales por los caracteres correctos en el valor, y luego pasa la URL. PHP entenderá la URL correctamente, ya que ya usado urlencode() sobre los datos. Notará que el caracter & en la URL es reemplazado por &. Aunque la mayoría de navegadores entenderán el caracter si olvida esto, no siempre es posible que ocurra. Así que incluso si su URL no es dinámica, es necesario usar htmlspecialchars() sobre la URL.
Intento usar una etiqueta <input type="image">, pero las variables $foo.x y $foo.y no están disponibles. $_GET['foo.x'] no existe tampoco. ¿Dónde están?
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:
<input type="image" src="imagen.gif" name="foo" />
Dado que foo.x y foo.y habrían representado nombres de variable inválidos en PHP, éstos son convertidos automáticamente a foo_x y foo_y. Es decir, los puntos son reemplazados con caracteres de subrayado. Así que, es posible acceder a estas variables como cualquier otra descrita en la sección sobre recuperación de variables desde el exterior de PHP. Por ejemplo, $_GET['foo_x'].
Note: Los espacios en nombres de variables de petición son convertidos a caracteres de subrayado.
¿Cómo creo matrices en un <form> HTML?
Para hacer que el resultado de <form> sea enviado como un valor array a su script PHP, se deben nombrar los elementos <input>, <select> o <textarea> de esta forma:
<input name="MiMatriz[]" /> <input name="MiMatriz[]" /> <input name="MiMatriz[]" /> <input name="MiMatriz[]" />
<input name="MiMatriz[]" /> <input name="MiMatriz[]" /> <input name="MiOtraMatriz[]" /> <input name="MiOtraMatriz[]" />
<input name="OtraMatriz[]" /> <input name="OtraMatriz[]" /> <input name="OtraMatriz[email]" /> <input name="OtraMatriz[telefono]" />
Note: Especificar claves de matrices es opcional en HTML. Si no especifica las claves, la matriz es llenada en el orden en que aparecen los elementos en el formulario. Nuestro primer ejemplo contendrá las claves 0, 1, 2 y 3.
Vea también Funciones de Matrices y Variables desde el exterior de PHP.
¿Cómo obtengo todos los resultados de una etiqueta de selección múltiple en HTML?
La etiquete de selección múltiple en una construcción HTML le permite a los usuarios elegir varios ítems desde una lista. Estos ítems son pasados entonces al gestor de acción del formulario. El problema es que todos son pasados con el mismo nombre de control. Es decir,
<select name="var" multiple="yes">
var=opcion1 var=opcion2 var=opcion3
<select name="var[]" multiple="yes">
Note que si está usando JavaScript los caracteres [] en el nombre del elemento pueden causar problemas cuando intente referirse al elemento por su nombre. Use su ID numérico de elemento de formulario en su lugar, o encierre el nombre de variables en comillas sencillas y úselo como índice de la matriz de elementos, por ejemplo:
variable = documents.forms[0].elements['var[]'];
¿Cómo puedo pasar una variable de Javascript a PHP?
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.
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, pasando variables específicas de vuelta al script PHP. El ejemplo a continuación muestra precisamente cómo hacer esto -- permite que código PHP capture la altura y el ancho de la pantalla, algo que normalmente sólo es posible en el lado del cliente.
<?php
if (isset($_GET['ancho']) AND isset($_GET['altura'])) {
// imprimir las variables de geometria
echo "El ancho de la pantalla es: ". $_GET['ancho'] ."<br />\n";
echo "La altura de la pantalla es: ". $_GET['altura'] ."<br />\n";
} else {
// pasar las variables de geometria
// (preservar la cadena query original
// -- las variables post deberan ser pasadas de otra forma)
echo "<script language='javascript'>\n";
echo " location.href=\"${_SERVER['SCRIPT_NAME']}?${_SERVER['QUERY_STRING']}"
. "&ancho=\" + screen.width + \"&altura=\" + screen.height;\n";
echo "</script>\n";
exit();
}
?>