Pasar las variables SESSION, POST Y GET a variables normales en PHP

Valoración del artículo:
Cómo hacer que unas variables globales como son GET, SESSION y POST se traten como variables normales en PHP.
Publicado: 06/10/05
Atención: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.
Hace un par de semanas se me encomendó migrar un sitio (desarrollado en php) de servidor, el tema iba relativamente en paz hasta que di cuenta de un problema recurrente en este tipo de situaciones, el servidor antiguo tenia las variables globales en On y el nuevo las tenia en Off ... recurrente no ?

La verdad es que no quise complicarme la vida como otras veces, y me di cuenta de algo que me podría ahorrar un par de horas de trabajo, todos los php hacían un include a un archivo php, recurrente también no?
Asi es que me puse a pensar en un pedazo de código que me permitiera tomar estos 3 tipos de variables (SESSION, POST Y GET) y me las dejara como variables normales, si no lo tienen claro el ejercicio es mas o menos el siguiente :

Supongamos que la variable viene desde un formulario via POST, el código decía algo asi ...

<?

if ($variable == "algo")
{
    echo "esta variable hace alguna cosa";
}

?>


Es decir, le faltaba esta instrucción antes del if

<?php

$variable = $_POST["variable"]; // le faltaba esta instrucción antes del if

if ($variable == "algo")
{
    echo "esta variable hace alguna cosa";
}

?>


Tenia 2 opciones, o me ponía a buscar TODAS estas situaciones y las arreglaba una a una, o colocaba un pedazo de código en archivo al que todos los demás le hacían un include que me corrigiera este "error" propio de aquellos que estamos a trabajar con los "servidores en producción", o sea, con las variables globales en On.

Bueno, después de muchos cabecearme encontré la solución, y aquí la muestro a todos uds.

<?

if($_POST)
{
    $keys_post = array_keys($_POST);
    foreach ($keys_post as $key_post)
     {
      $$key_post = $_POST[$key_post];
      error_log("variable $key_post viene desde $ _POST");
     }
}

if($_GET)
{
    $keys_get = array_keys($_GET);
    foreach ($keys_get as $key_get)
     {
        $$key_get = $_GET[$key_get];
        error_log("variable $key_get viene desde $ _GET");
     }
}

if($_SESSION)
{
    $keys_sesion = array_keys($_SESSION);
    foreach ($keys_sesion as $key_sesion)
     {
       $$key_sesion = $_SESSION[$key_sesion];
       error_log("variable $key_sesion viene desde $ _SESSION");
     }
}

?>


Son básicamente 3 if que hacen lo mismo, toman las claves del arreglo en cuestión (SESSION , POST o GET) y generan una "variable variable", creo que hay un articulo en desarrolloweb que habla de este tema, y esto hace toda la magia, el error_log fue una implementación para ver que variables se iban ocupando (si no tienes acceso al servidor puedes sacarlo sin problemas).

Para alguien que guste de las funciones puede también guardarlo como función y llamarla cuando lo necesite. O también iterar el proceso con las 3 variables en cuestión para no tener que hacer 3 if, o pasarle cualquier arreglo para que haga el mismo proceso ... en fin, la idea esta, solo espero haber contribuido en algo al ahorro de tiempo de alguno de ustedes.

Comentarios
Fueron enviados 9 comentarios al artículo
5 comentarios no revisados
4 comentarios revisados:
Por: Andrés Fernández
06/10/05
Es más fácil usar la función extract. Para POST: extract($_POST); Para GET: extract($_GET); y así con el resto. Saludos.
Por: yorfre
23/10/05
creo que hay un error aqui
if ($variable = "algo")
{
echo "esta variable hace alguna cosa";
}

?>

siempre entrara por que a variable le estas asignando el valor de "algo", debes usar == para comparar

RESPUESTA

Gracias por reportarnos ese error, muy típico. Lo hemos corregido.
Por: Javier de la Rosa
24/10/05
Creo que para que fuese totalmente correcto primero habría que revisar el orden en el que PHP trata los distintos arrays, es decir, acceder al contenido del atributo de configuración 'gpc_order' mediante la función ini_get('gpc_order'), y entonces sí gestionar la conversión a variables desde los distintos arrays.
Por: Antonio
20/4/07
Este artículo es realmente malo, tanto por la solucón propuesta como por la forma de proponerla.
Me explico.
La solución propuesta por su autor consiste en saltarse a la torera la medida de seguridad que supuso desactivar register_globals, abriendo la puerta a todos los fallos que su desactivación pretendió evitar. Vamos, que este hombre se empeña en ir contracorriente y hacer las cosas mal. Gracias a su "solución", este caballero abre la puerta a la inyección de variables en el código, con la sobrecarga de valores que ello implica y los riesgos de seguridad asociados.
Por otro lado, el uso de arary_keysç() es totalmente innecesario porque la construcción foreach() ya ofrece la forma de trabajar con índices y valores de un array.
De esto se deducen dos cosas: Primero, que su autor no se ha leído el manual de PHP, con lo cual no entiendo cómo puede esta facultadp par aconsejar a los lectores. Segundo, que lo de "analista programador" le viene muy grande a su autor (ahora cualquiera se atribuye tal categoría laboral).
DesarrolloWeb debería ser más escrupuloso a la hora de aceptar colaboraciones, empezando por someterlas a "referee", porque se están colando barbaridades notables.

Manuales relacionados
Categorias relacionadas
El autor
Lectura recomendada
Compra este libro en Agapea, la librería urgente a domicilio.
Últimas noticias
Alojados en el grupo