FAQ
Pasar un array por URL
Una URL no permite pasar un valor array, por lo que tendremos que convertirla en un dato simple y en la página destino deshacer el cambio. Utilizamos las funciones serialize() para compactar un array y unserialize para volver a pasar el valor compactado a un dato de tipo array. También tendremos que usar las funciones urlencode() para garantizar que todos los valores pasados son válidos para la URL y stripslashes() para eliminar las contrabarras que se añaden para proteger ciertos caracteres.
A continuación vemos un ejemplo:
<?php
echo '<head>
<title>'.$_SERVER[PHP_SELF].'</title>
</head>
<html>
<body>';
// mostramos el array recibido
if (isset($_GET[mi_var_array]))
{
$a=stripslashes ($_GET[mi_var_array]);
$mi_array=unserialize($a);
foreach ($mi_array AS $clave => $valor)
echo "$clave ----> $valor <br>";
}
// Creamos un array
$mi_pasa_array=array("Spiderman" =>354, "Shrek2" =>462, "CatWoman" => 286);
$compactada=serialize($mi_pasa_array);
$compactada=urlencode($compactada);
echo "<p>";
echo "<a href=$_SERVER[PHP_SELF]?mi_var_array=$compactada>Recargar la Página</a>";
echo '</body>
</html>';
?>
El formulario no recibe completos los valores asignados
Este problema suele ser una falta de comillas en la cláusula value de un input. Por ejemplo:
$articulo="programas en PHP";
...
echo "<input name=articulo value=$articulo>";
Al mostrar el formulario al que corresponde este trozo de código sólo aparecería en el campo correspondiente "programas" e ignoraría "en PHP". ¿Por qué? Porque el input entiende, a falta de comillas, que el valor asignado termina en el primer espacio. Lo correcto sería:
$articulo="programas en PHP";
...
echo "<input name=articulo value='$articulo'>";
La página destino no recibe los valores del formulario
El problema más frecuente es la configuración de register_globlals.
Si en php.ini tenemos
register_globals=off;
Entonces en la página destino deberemos usar el array $_POST. Por ejemplo, si en el formulario hemos definido:
<input name=edad value=25>
en la página destino del formulario tendremos el valor leído en $_POST[edad].
Si en php_ini tenemos
register_globals=on;
entonces en la página destino podremos usar simplemente $edad.
Es aconsejable utilizar el array $_POST por seguridad y deshabilitar register_globals.
La página destino no recibe completos los valores pasados por URL
No todos los caracteres són válidos para pasarlos por URL por el método GET. Por ejemplo no admite espacios en blanco ni letras acentuadas, ni otros caracteres especiales. Necesitamos codificar la cadena para convertirla a un código url válido. Por ejemplo:
$var="Mi nombre";
echo "<a href=pagina.php?var=$var>Enlace</a>";
no hará lo que pretendemos porque bien al tener un espacio en blanco el navegador entenderá que el enlace termina tras "Mi" o bien si ponemos el enlace entre comillas el espacio en blanco no es admisible.
Lo correcto sería:
$var="Mi nombre";
$var=urlencode($var);
echo "<a href=pagina.php?var=$var>Enlace</a>";
En la página destino no es necesario realizar la conversión inversa, el navegador lo interpreta automáticamente.