Cuidado con la función extract de php

Cuidado al utilizar la función extract de php.

Estos días he tenido algunos problemas que me ha costado bastante resolver y todo se debe a tratar de programar lo más rápido posible utilizando funciones que supuestamente te "facilitan" el trabajo, pero el problema está cuando utilizas una función de la cual no tienes claro su funcionamiento interno y de la que sólo conoces "lo que hace" pero no el "cómo lo hace".

Decidí comenzar mi blog publicando esta experiencia porque después de todo el tiempo que he perdido estos días es posible que pueda ayudar a alguien que le esté pasando algo parecido y por casualidad se tope con este artículo. Y si no tienes el mismo problema al menos ya sabes que tienes que ir con cuidado con esta función.

La función en cuestión se llama extract y su utilidad es muy sencilla, simplemente convierte cada elemento de un array asociativo en una variable tomando como nombre de la variable el nombre de la clave de ese elemento.

Ejemplo:

$oferta = array(   "idOferta" => "2344",    "titulo" => "Oferta de viaje a Tanger",   "descripcion" => "Oferta de viaje que incluye Ferry ida y vuelta y alojamiento"
);
extract($oferta);
/**
*
* Obtenemos las siguientes variables: $idOferta, $titulo, $descripcion
*
**/

En mi caso el array procedía de una consulta de una tabla con 15 campos, con lo que el resultado es de un array con 15 elementos, que tras pasar por la función extract se convertía en 15 variables en una sola línea.

Hasta aquí todo bien, el problema consiste en que esta función en algún momento de su ejecución "toca" las variables de sesion ($_SESSION[]) y si no estas usando variables de sesión no importa.

El problema es que la aplicación dónde estaba usando la función extract funcionaba perferctamente, pero en el back, donde los usuarios cargan los datos de la web estaban sucediendo cosas muy extrañas, me explico.

Cuando un usuario inicia sesión en nuestro backoffice tiene una serie de permisos y privilegios, pero también se le establecen unos filtros para que solo pueda ver las ofertas que pertenecen al grupo que se les haya asignado su mantenimiento. Cada grupo corresponde con un número y al iniciar sesión queda almacenado en una variable de sesión que se llama $_SESSION['grupo'].

El problema surgía, y de aquí la dificultad para su localización (al menos para mi), cuando un usuario que tiene iniciada sesión en el back accedía al front (la parte de cliente) sin cerrar la sesion, concretamente a la página donde se utilizaba la función extract.

La tabla de donde procedía el array al que se le aplicaba la función extract tiene un elemento que se llama "grupo", que no tiene nada que ver con el grupo de la sesión de usuario, pero los valores si que son similares (numeros enteros de 1 o 2 cifras).

Despues de ejecutarse extract se obtenia como resultado la variable $grupo, pero la variable $_SESSION['grupo'] (que pertenecía a la sesión del back) cambiaba su valor y tomaba como nuevo valor el mismo que $grupo, por esto deduzco que para pasar del array a las variables la función extract crea variables de sesión como valores intermedios.

Después de ejecutar la función extract el usuario volvía a su back y todos los filtros habían cambiado, ya no estaba viendo los productos asignados a su grupo, sino que salían otros. Y no podía volver a acceder a sus productos si no cerraba e iniciaba sesión de nuevo.

El usuario me decía que de vez en cuando se le cambiaban los productos y tenía que iniciar sesión de nuevo, pero no lo asociaba a que sucedía tras pasar por la página de cliente, por lo que estuve dos días enteros revisándome el código del backoffice y tratando de simular el fallo y todo era correcto, hasta que pude localizar que el origen del error no estaba aquí, sino en otra parte de la página totalmente diferente.

En resumen, si tienes que usar la función extract en php ten cuidado de que no exista ninguna variable de sesión que utilize el mismo nombre que alguna de las claves del array que quieres extraer.... en ninguna parte de tu web.

2 comentarios en “Cuidado con la función extract de php

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *