Pasar variables por la URL con PHP

Valoración del artículo:
Veremos cómo transferir variables de una página a otra por medio de la URL, en PHP.
Atención: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.
Bucles y condiciones son muy útiles para procesar los datos dentro de un mismo script. Sin embargo, en un sitio Internet, las páginas vistas y los scripts utilizados son numerosos. Muy a menudo necesitamos que nuestros distintos scripts estén conectados unos con otros y que se sirvan de variables comunes. Por otro lado, el usuario interacciona por medio de formularios cuyos campos han de ser procesados para poder dar una respuesta. Todo este tipo de factores dinámicos han de ser eficazmente regulados por un lenguaje como PHP.

Es posible que ya os hayáis percatado de que las variables de un script tienen una validez exclusiva para el script y que nos resulta imposible conservar su valor cuando ejecutamos otro archivo distinto aunque ambos estén enlazados. Existen varias formas de enviar las variables de una página a otra de manera a que la página destino reconozca el valor asignado por el script de origen:

Pasar variables por URL

Para pasar las variables de una página a otra lo podemos hacer introduciendo dicha variable dentro del enlace hipertexto de la página destino. La sintaxis sería la siguiente:

<a href="destino.php?variable1=valor1&variable2=valor2&...">Mi enlace</a>

Podéis observar que estas variables no poseen el símbolo $ delante. Esto es debido a que en realidad este modo de pasar variables no es específico de PHP sino que es utilizado por otros lenguajes.

Ahora nuestra variable pertenece también al entorno de la página destino.php y está lista para su explotación.

Nota: No siempre se definen automáticamente las variables recibidas por parámetro en las páginas web, depende de una variable de configuración de PHP: register_globals, que tiene que estar activada para que así sea. Ver comentarios del artículo al final de la página para más información.

Para aclarar posibles dudas, veamos esto en forma de ejemplo. Tendremos pues dos páginas, origen.html (no es necesario darle extensión PHP puesto que no hay ningún tipo de código) y destino.php:

<HTML>
<HEAD>
<TITLE>origen.html</TITLE>
</HEAD>
<BODY>
<a href="destino.php?saludo=hola&texto=Esto es una variable texto">Paso variables saludo y texto a la página destino.php</a>
</BODY>
</HTML>

<HTML>
<HEAD>
<TITLE>destino.php</TITLE>
</HEAD>
<BODY>
<?
echo "Variable \$saludo: $saludo <br>\n";
echo "Variable \$texto: $texto <br>\n"
?>
</BODY>
</HTML>

$HTTP_GET_VARS

Recordamos que es posible recopilar en una variable tipo array el conjunto de variables que han sido enviadas al script por este método a partir de la variable de sistema $HTTP_GET_VARS, que es un array asociativo. Utilizándolo quedaría así:

<?
echo "Variable \$saludo: $HTTP_GET_VARS["saludo"] <br>\n";
echo "Variable \$texto: $HTTP_GET_VARS["texto"] <br>\n"
?>

Nota: Aunque podamos recoger variables con este array asociativo o utilizar directamente las variables que se definen en nuestra página, resulta más seguro utilizar $HTTP_GET_VARS por dos razones, la primera que así nos aseguramos que esa varible viene realmente de la URL y la segunda, que así nuestro código será más claro cuando lo volvamos a leer, porque quedará especificado que esa variable estamos recibiéndola por la URL.

$_GET

A partir de la versión 4.1.0 de PHP se ha introducido el array asociativo $_GET, que es idéntico a $HTTP_GET_VARS, aunque un poco más corto de escribir.

Caracteres especiales en URL y su codificación con PHP

Hay algunos caracteres raros que no se pueden pasar, tal cual, por la URL. Por ejemplo, una URL no puede contener espacios en blanco, por lo que si intentas enviar una variable por URL con un valor que tiene un espacio en blanco, te dará problemas. Por ejemplo, el signo "*" no puede figurar tampoco en una URL. Así pues, tenemos que hacer algo para convetir esos caracteres, de modo que no den problemas en la URL.

La solución en PHP es sencilla, simplemente debemos codificar la variable que tiene caracteres conflictivos a formato URL. Para ello utilizamos la función urlenconde(), que viene en la librería de funciones de PHP. Podemos encontrar más información sobre esto en la FAQ: Problemas con variables pasadas en la URL en algunos caracteres.

Comentarios
Fueron enviados 19 comentarios al artículo
19 comentarios revisados:
Por: Miguel Angel Alvarez
15/2/02
Es importante resaltar que no siempre se crean automáticamente las variables que llegan de un formulario o por la URL.

La creación automática o no depende de nuestra configuración del PHP, que se especifica en el archivo PHP.ini. Para este caso concreto se debe configurar la variable: track_vars boolean
Si está activada, la información de entrada de GET, POST y de las cookies se puede encontrar en las matrices asociativas $HTTP_GET_VARS,$HTTP_POST_VARS y $HTTP_COOKIE_VARS respectivamente

Por: Guillem Catala
08/7/02
Algunos lectores habrán comprovado que puede funcionar sin usar la variable de sistema $HTTP_GET_VARS para cojer las variable que venían por la url... en efecto, si tienes php configurado para que no haga comentarios sobre todos los errores pasará por alto este caso de manera que no será necesario usar $HTTP_GET_VARS. El problema viene cuando tenemos configurado de forma que marque todos los errores... entonces recibiremos un error parecido a "La varible $var no está definida".

Los que no lo hayan comprovado lo pueden ver configurando php.ini y poner error_reporting= E_ALL; en el apartado de ERROR HANDLING.

Por: Rubén
27/10/02
Un problema que surge actualmente debido al cambio de la configuracion por defecto de PHP en las versiones posteriores a 4.2.0 es la desactivacion en el archivo php.ini de la opcion register_globals.

Para poder usar los ejemplos tal y como son escritos en este articulo, esta opcion ha de estar activada (ON).

La desactivacion de esta opcion ha tenido lugar debido a que ella inducia a la creacion de scripts con fallos de seguridad. Podéis leer al respecto en:
http://www.php.net/manual/en/security.registerglobals.php
Por: José Muñoz Rojas
18/3/03
El uso de la variable pasada por la URL con comillas dentro del array $HTTP_GET_VARS no funciona. Si les quitas las comillas va a funcionar. Ejemplo : $HTTP_GET_VARS[saludo]
Por: manuel
24/4/03
Para que el ejemplo funcione con la variable del sistema $HTTP_GET_VARS hay que quitarle las dobles comillas a el nombre de la variable que va entre corchetes
Por: David Martinez
16/9/03
aunque no se si este comentario sea para este articulo en especifico, anexo les envio una funcion que diseñe en javascript para lograr el mismo efecto del objeto Request de ASP pero entre paginas HTM o HTML es decir estaticas, para pasar variables entre dos paginas por la URL,

function obtvarurl(name_var){
name_var=new String(name_var)
var urlactual
var longurl, longvar, valorvar= new String()
var ctractual, longvaractual, varactual= new String()
urlactual= window.location
urlactual= new String(urlactual)
longurl=urlactual.length
longvar=name_var.length
for (i = 1; i < (longurl+1); i++)
{
    ctractual=urlactual.substring(i,i+1)
    if (ctractual=="?" || ctractual=="&")
       {
    varactual=urlactual.substring(i+1,i+longvar+1)
    if (varactual.toLocaleUpperCase() == name_var.toLocaleUpperCase())
       {
       longvaractual=urlactual.indexOf("&",i+longvar+2)
       if (longvaractual<0)
          {longvaractual=longurl}

       valorvar=urlactual.substring(i+longvar+2,longvaractual)

       }
    }
}
return valorvar
}


Saludos
david
Por: Juan
05/1/05
Interesante el curso.
En el caso de este artículo el paso de variables por URL, no funcionó como está indicado en él. Pero si hago lo siguiente si funciona:

echo 'variable\$saludo: '.$HTTP_GET_VARS["saludo"].'<br>\n';
echo 'variable\$texto: '.$HTTP_GET_VARS["texto"].<br>\n';
Por: Ariel Jerez
30/1/05
Para que los ejemplos funcionen tambien pueden probar con la siguiente funcion: extract($_GET);
Lo cual convertira a variables automaticamente todos los parametros que pasen url.
Por: Alberto
24/3/05
Hola a todos!!!

Yo tenía el problema de pasar las variables de una página a otra, lo solucioné configurando REGISTER_GLOBALS=ON
Además, si utilizan formularios, el método debe ser GET, y el botón no debe llevar nombre (name), espero les seirva de algo.... Suerte
Por: David xgamanet
13/4/05
a mi me funcionó tal y como dice Juan, concatenando, una solución simple pero efectiva... uso wamp5 1.4.3 saludos a todos.
Por: Ruth
24/5/05
¿y si lo que quiero es pasar un Objeto?? ¿Puede hacerse de alguna forma?

RESPUESTA:

Entonces utiliza variables de sesión, que almacenan el objeto en el servidor y se asocia con el identificador de la sesión abierta por el visitante.

Las variables de sesión estarán disponibles durante toda la visita del usuario al sitio sin que las tengas que pasar de página a página.

Por: Ronin
03/6/05
Si tienes que mantener variables durante varias páginas son más cómodas las variables de sesion, aparte de no necesitar añadir nada en las url para llamar a las páginas.
Por ejemplo para pasar http://libroscentra.com?variable=valor
Puede que ese valor no lo sepas y tengas que usar cosas del tipo http://libroscentra.com?variable=<?php echo $variable; ?> Bastante más engorroso que usar una varible de sesion
Por: Jorge
08/2/06
Hola tengo un problema al pasar la variable por la url ya que solo me pasa la primera palabra justo hasta llegar al primer espacion en blanco y me gustaria saber si hay alguna forma de que te cogiera tambien los espacios en blanco
Por: rafaconpu
13/3/06
Pasar variables por URL en algunos casos está bien, pero ¿Qué ocurre si la página que te abre contiene frames? Ya no podrás obtener las variables puesto que sale un error diciendo que no está definida la variable.
Por: aldoemilio
14/3/06
Hoy empece con el PHP y me parece muy poderoso. Encontré un pequeño detalle en esta página que hace que el codigo, tal y como esta, no funcione: dentro de los brackets que definen que variable debemos usar se deben "escapar" las comillas y la barra inversa del newline. El codigo debe ser:
echo "Hola $_GET["nombre"]\n";
y no
echo "Hola $_GET["nombre"] ";
como aparece.
Por: Axel
15/8/06
Este capítulo y el siguiente fueron mi segundo gran dolor de cabeza después de la instalación y configuración de PHP. Quisiera aportar algunas recomendaciones para no rendirse y morir en el intento.

Mi arquitectura WAMP (Windows, Apache, MySQL, PHP) es la siguiente:

WINDOWS XP
APACHE 2.2.2
MySQL 5.0
PHP 5.1.4

Si tu arquitectura es ésta y te funciona, te recomiendo lo siguiente:

1. No necesitas activar Register_Globals en php.ini (mantener en off).

2. Si deseas enviar una variable por URL y estás trabajando tu WEB en localhost debes indicar, en el archivo de origen, la ruta de envío de la siguiente manera:
<a href="http://localhost/Webeando/webeando.php?nombre=Axel&apellidos=Pavez Vidal">Enviar a Webeando</a>

Nota: en mi caso tengo el archivo de destino (Webeando.php) en la carpeta 'Webeando' que está dentro de 'htdocs' en Apache. Como ves, indico toda la ruta.

3. En el archivo de destino debes recoger la variable usando $_GET con la siguiente sintaxis según sea el caso:

A. Si deseas recibir únicamente la variable para procesarla según tus nececidades, hazlo como sigue:

echo $_GET["nombre"]."<br>";
echo $_GET["apellidos"]."<br>";

B. Si lo que deseas es que tu variable aparezca embebida dentro de un texto la sintaxis es esta:

echo "Mi nombre es: $_GET[nombre]<br>";
echo "Mis apellidos son: $_GET[apellidos]<br>";

Nota 1: La diferencia está en la posición de las comillas dobles: Prestar mucha atención en ésto.

Nota 2: GET siempre, siempre, siempre debe ir con mayúscula para que sea reconocida la variable

Nota 3: La sintaxis antigua $HTTP_GET_VARS no funciona en esta versión de PHP (al menos no a mí). Recomiendo usar $_GET.
Por: Miguel Angel Alvarez
13/1/07
Para todos los que tienen problemas al pasar caracteres raros por la URL, como los espacios en blanco, recomiendo la lectura de la FAQ: paso de variables URL con caracteres raros como espacios.
Por: TioLucas
21/4/07
Esto va para aquellos que desean saber cómo se pasa una variable a una URL. A mi me funcionó así:

<?
echo "<a href=nueva_pagina.php?variable_nueva=".$variable_actual.">Link</a>";
?>

Y para aquellos que desean pasar un array como parámetro, me funcionó esto:

<?

// '$array' es el nombre del array que deseamos pasar
// '$parametro_url' es un string que armaremos para pasar los valores del array como parámetros
// para cada elemento '$array[x]' agregamos una cadena 'array_url[x]=valor&'
// a la variable '$parametro_url'

$parametro_url="";
foreach($array as $valor){
$parametro_url=$parametro_url."array_url[".array_search($valor, $array)."]=".$valor."&";
}


// Si '$parametro_url' no es vacío
// le agregamos el '?' al comienzo y le quitamos el último '&'

if($parametro_url!=""){
$parametro_url="?".substr($parametro_url,0,-1);
}


// Ahora pasamos el contenido del string '$parametro_url' como
// los valores del array '$array_url' a la página que abriremos

echo "<a href=nueva_pagina.php".$parametro_url.">Link</a>";
?>

OJO! Sólo funciona para arrays pequeños (en mi caso menores a 348 elementos), no funciona pasar el array como variable directamente.
Creo que es una solución poco eficiente pero eficaz para pequeños arreglos.
OJO_2! Es mi tercer día con PHP...por favor si los más experimentados pueden, revisen esto que mandé y corríjanlo si corresponde.

Creo que lo mio con PHP es amor a primera vista, espero no defraudarme.
Por: Eduardoartemis
22/6/07
La cantidad máxima de variables pasadas via url no debe ser mayor a 100 :( ya me paso por eso se los digo :( que hacer ante ese caso:(

Manuales relacionados
Categorias relacionadas
El autor
Rubén Alvarez
Redactor de DesarrolloWeb.com
http://www.desarrolloweb.com
Lectura recomendada
Últimas noticias
Alojados en el grupo