2009-10-21 10 views
5

Esto debería funcionar, así que estoy realmente perplejo acerca de por qué no está funcionando.¿Pasar variables de PHP a un archivo incluido?

Estoy verificando si un usuario ha iniciado sesión utilizando un método de clase $ session en la parte superior de cada página de administración. Sin embargo, quiero ajustar dinámicamente el archivo de encabezado dependiendo de si un usuario ha iniciado sesión y en qué nivel de función tiene ese usuario.

Así que verifico $session->is_logged_in() y luego seguí adelante y definí una variable llamada $logged = true; para usar más tarde. A continuación, utilizo un método $user->find_by_id($session->id) para crear un nuevo objeto Usuario y almacenar $user->role_level en una nueva var llamada $role_level para facilitar el uso.

Esto está sucediendo cerca de la parte superior de la página. Más abajo en la página, más allá del procesamiento de formularios, etc., está el comando include("../_layouts/header.php"). Luego, en el archivo header.php, utilizo pequeños controles como if(!$logged) { ... } else { ... }. Sin embargo ...

estoy recibiendo los errores siguientes:

Notice: Undefined variable: logged in /home/hips/html/_layouts/header.php on line 119 
Notice: Undefined variable: logged in /home/hips/html/_layouts/header.php on line 131 
Notice: Undefined variable: logged in /home/hips/html/_layouts/header.php on line 138 

¿Cómo puede ser esto? Estoy definiendo los vars en el archivo antes de incluir header.php! ¿No debería funcionar eso?

FYI, todo funcionaba bien hasta que intenté usar $logged en el archivo header.php.

+1

'$ logged' se establece en todos los casos? ¿No hay forma posible en el código de que no se establezca? Si agrega '$ logged =" ";' en la parte superior del script (antes de la definición), ¿qué ocurre? –

+0

Me pasó una vez que incluí un archivo dentro de una función. A menos que pase las variables como parámetros o las defina con global, no estarán disponibles en el archivo incluido. Solo un bocado. – nalply

Respuesta

4

Las variables se propagan a los archivos incluidos, por lo que debe ser, que la variable NO está establecida cuando llama al include: intente comprobar si es así, luego descubra por qué la variable no está establecida en ese punto.

Por ejemplo, si definió $ registrado dentro del bloque "if" o dentro de una función, entonces no se propagará fuera de él: debe definirlo en el alcance más externo (en el mismo nivel al que llama la declaración de inclusión). Y debe definirlo para el caso en que el usuario no haya iniciado sesión, no solo para el caso en que el usuario haya iniciado sesión. Si la variable no se inicializa en falso, la comprobación de si (! $ Inició sesión) generará una advertencia. Say $ logged = falso; al comienzo de tu trabajo

+0

Gracias a ustedes dos. La variable $ logged se establece en la parte superior del archivo como $ logged = false; - es muy confuso – rhodesjason

+0

Debe haber sido algún tipo de problema porque está funcionando ahora. Gracias a todos. – rhodesjason

1

probar algo muy simple, como

// file1.php 
$var = "foobar"; 

// file2.php 
include("file1.php"); // or require("file1.php"); 
die($var); 

¿Funciona? Tal vez es un problema fuera de tu código.

1

Solo una opinión ... en lugar de incluir código para ejecutar en el espacio global y dependiendo de otra variable global que se esté definiendo, incluya su archivo donde sea y haga que el código dentro de header.php se organice en funciones apropiadas. Luego, cuando desee la salida de header.php, llame a la función apropiada con $ logged como argumento. Esto ayudará a que su código sea más cohesivo y más fácil de probar (como en las pruebas unitarias).

+0

No estoy seguro de seguir pero me interesa lo que dices. Estoy almacenando datos de usuario en una sesión, así que solo necesito poder modificar el HTML del encabezado en función del rol/los permisos del usuario. Cuando header.php parecía incapaz de llamar a la variable $ session, traté de declarar $ logged. Parece que hubo un error que me impidió hacer cualquiera de los dos, así que ahora puedo volver a simplemente llamar a $ session-> etc. ¿Qué estabas sugiriendo? – rhodesjason

+0

No está relacionado específicamente con ningún problema que pudieras haber tenido, pero está más relacionado con la práctica común de tener un archivo con código global (lo que significa que el código no está dentro de ninguna función) e incluir ese archivo donde lo desees salida para aparecer en la página. Lo que sugiero en cambio, es que envuelva ese código en una función. En lugar del código en ese archivo que usa variables que se espera que estén definidas en la página que lo contiene, lo reescribes ligeramente para que el código use los argumentos de la función. Luego puede incluir ese archivo en la parte superior de la página (o en cualquier otro lugar) y llamarlo. – grantwparks

+0

... por lo que puede tener 'function getPageHeader ($ bIsLoggedIn) {hacer cosas basadas en $ bIsLoggedIn y devolver el HTML como una cadena; } ' Donde quiera que aparezca la salida puede 'echo getPageHeader ($ logged);'. Esto desacoplará el código de las variables globales, etc., y lo hará reutilizable y la unidad se podrá probar. Es más seguro y menos probable que se rompa. – grantwparks

1

En lugar de if (!logged), intente if (empty($logged)). Eso no generará un aviso en los casos donde la variable no ha sido establecida.

Cuestiones relacionadas