Tengo un archivo PHP que a veces se llama desde una página que ha iniciado una sesión y, a veces, desde una página que no tiene sesión iniciada. Por lo tanto, cuando tengo session_start()
este script, a veces recibo el mensaje de error para "sesión ya iniciada". Para eso he puesto estas líneas:
if(!isset($_COOKIE["PHPSESSID"]))
{
session_start();
}
pero esta vez recibí este mensaje de advertencia:
Aviso: variable indefinida: _SESSION
¿Hay una mejor manera de verificar si la sesión ya ha comenzado?
Si lo uso, ¿ @session_start
hará que las cosas funcionen correctamente y simplemente cerrará las advertencias?
php
session
session-variables
Logan
fuente
fuente
Respuestas:
Forma recomendada para versiones de PHP> = 5.4.0, PHP 7
Referencia: http://www.php.net/manual/en/function.session-status.php
Para versiones de PHP <5.4.0
fuente
session_start();session_write_close();
: entonces la condición if falla pero no tenemos sesión abierta ...session_start()
en la parte superior de un script está CERRADA cuando el script sale, O cuandosession_write_closed()
se llama antes de que el script salga. Es decir, una sesión CIERRA cuando sus datos se escriben en la cookie de sesión y la sesión se desbloquea para que otra secuencia de comandos acceda a ella y también llame a 'session_start'. CERRAR NO significa que la sesión esté DESTRUIDA, por lo tanto. Puede cerrar una sesión saliendo de la secuencia de comandos actual o llamandosession_write_close()
, y puede volver a abrirla llamandosession_start()
. Mi comprensión, al menos.Para versiones de PHP anteriores a PHP 5.4.0:
Sin embargo, en mi humilde opinión, realmente debería pensar en refactorizar el código de administración de la sesión si no sabe si una sesión se inicia o no ...
Dicho esto, mi opinión es subjetiva, y hay situaciones (ejemplos de los cuales se describen en los comentarios a continuación) en las que puede no ser posible saber si se inicia la sesión.
fuente
PHP 5.4 introdujo session_status () , que es más confiable que confiar en él
session_id()
.Considere el siguiente fragmento:
Entonces, para verificar si se inicia una sesión, la forma recomendada en PHP 5.4 es ahora:
fuente
puedes hacer esto, y es realmente fácil.
Espero eso ayude :)
fuente
$_SESSION=array();
, por lo que esta respuesta parece estar bien.session_destroy()
se ha llamado,$_SESSION
aún podría establecerse. Además, en las pruebas unitarias puede establecer$_SESSION
directamente. Pero voté por esto, ya que para la mayoría de las situaciones prácticas, esta respuesta debería ser lo suficientemente buena (hasta que PHP 5.3 nunca más se vea ...)fuente
Antes de PHP 5.4, no hay una forma confiable de conocer más que establecer una bandera global.
Considerar:
O:
Entonces, antes de PHP 5.4, debe establecer un valor booleano global.
fuente
Para todas las versiones de php
fuente
if ((defined('PHP_SESSION_ACTIVE') && session_status() !== PHP_SESSION_ACTIVE) || !session_id())
Mira esto :
Fuente http://php.net
fuente
Use session_id () , devuelve una cadena vacía si no se establece. Es más confiable que verificar el
$_COOKIE
.fuente
Espero eso ayude !
fuente
Esto debería funcionar para todas las versiones de PHP. Determina la versión de PHP, luego verifica si la sesión se inicia según la versión de PHP. Luego, si la sesión no se inicia, la inicia.
fuente
Lo único que debes hacer es:
fuente
No estoy seguro de la eficacia de dicha solución, pero esto es del proyecto en funcionamiento. Esto también se usa si necesita definir el idioma predeterminado
fuente
@
antes de que una llamada a función suprima cualquier error que pueda ser reportado durante la llamada a función.Agregar un
@
antessession_start
le dice a PHP que evite imprimir mensajes de error.Por ejemplo:
El uso
session_start()
después de que ya haya impreso algo en el navegador da como resultado un error, por lo que PHP mostrará algo como "no se pueden enviar encabezados: comenzó en (línea 12)",@session_start()
aún fallará en este caso, pero el mensaje de error no se imprime en pantalla.Antes de incluir los archivos o redirigir a una nueva página, use el
exit()
función; de lo contrario, se producirá un error.Este código se puede usar en todos los casos:
fuente
En PHP 5.3 esto funciona para mí:
entonces tiene. Si no pone la declaración de no comenzar si la sesión comenzará de alguna manera, no sé por qué.
fuente
Respuesta BASADA en @Meliza Ramos Response (ver primera respuesta) y http://php.net/manual/en/function.phpversion.php ,
COMPORTAMIENTO:
solo use openSession ()
fuente
En realidad, ahora es demasiado tarde para explicarlo aquí de todos modos, ya que se ha resuelto. Este fue un archivo .inc de uno de mis proyectos donde configuró un menú para un restaurante seleccionando un plato y eliminando / agregando o cambiando el orden. El servidor en el que estaba trabajando no tenía la versión real, así que lo hice más flexible. Depende de los autores que deseen usarlo y probarlo.
fuente
¿Te sirve este fragmento de código?
fuente
Debe reorganizar su código para que llame
session_start()
exactamente una vez por ejecución de página.fuente
fuente
PHP_VERSION_ID está disponible a partir de PHP 5.2.7, así que verifíquelo primero y, si es necesario, créelo .
session_status
está disponible a partir de PHP 5.4, así que tenemos que verificar esto también:fuente
Según mi práctica, antes de acceder al
$_SESSION[]
debe llamarsession_start
cada vez para usar el script. Consulte el siguiente enlace para ver el manual.http://php.net/manual/en/function.session-start.php
Para mí al menos
session_start
es confuso como un nombre. Asession_load
puede ser más claro.fuente
Terminé con una doble verificación de estado. php 5.4+
fuente
Puede usar la siguiente solución para verificar si una sesión PHP ya ha comenzado:
fuente
Esto es lo que uso para determinar si una sesión ha comenzado. Mediante el uso de vacío e isset de la siguiente manera:
fuente
Reemplazar
session_start();
con:fuente