Tiene problemas para verificar la sesión existente
Frecuentes
Visto 4,746 veces
2
Así que estoy creando un sistema de inicio de sesión muy rudimentario en mi sitio web y tengo problemas para usar session_status para verificar si hay una sesión activa. Así es como va:
Tengo una página de registro que actúa simultáneamente como un formulario (cuando $_SERVER['REQUEST_METHOD'] != 'POST'
) y un script para agregar el usuario a la base de datos (cuando $_SERVER['REQUEST_METHOD'] == 'POST'
). Si todo va bien y se agrega el usuario, entonces ejecuto el siguiente código:
session_start();
$_SESSION['username'] = $username;
$_SESSION['password'] = $password;
header('Location: registration-successful.php');
exit();
Yo se que mi session_start()
no está al comienzo del código, pero está bien porque el programa no genera nada antes session_start()
se llama. (De hecho, la única manera session_start()
se puede llamar si nunca genera nada, ya que sale justo después).
Mi código registration-successful.php se ve así:
<?php
if(session_status() == PHP_SESSION_ACTIVE){
session_start();
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Noether Here Nor There - Registration Successful</title>
<link rel="stylesheet" href="css/main.css" type="text/css" />
</head>
<body>
<h1>Congratulations <?php echo "{$_SESSION['username']}" ?>, you were successfully registered!</h1>
<p>Continue on to <a href="index.php">the main site</a>.</p>
</body>
</html>
Tal como está, este código no funciona. En su lugar, imprime "Felicitaciones, se registró con éxito". Es decir, no está reconociendo el $_SESSION
. Tan claramente el session_start()
no se está ejecutando. Entonces, la declaración if está fallando.
Pero no entiendo por qué. De hecho, cuando elimino el if(session_status() == PHP_SESSION_ACTIVE)
y simplemente poner session_start()
, funciona.
Pero necesito poder usar el session_status() == PHP_SESSION_ACTIVE
porque en mi página de inicio, lo uso para determinar si mostrar una pantalla de inicio de sesión o la página de inicio del usuario.
Claramente, es factible: después de todo, casi todos los sitios web (Facebook, por ejemplo) pueden mostrar su página de inicio de sesión si no ha iniciado sesión y mostrar su página de inicio si lo está. Entonces deben estar buscando una sesión activa de alguna manera. usaría algo como isset($_SESSION[...])
, pero
a) Me han dicho que no puedes hacer referencia $_SESSION
variables antes de declarar session_start()
, y b) Se supone que la función session_status elimina la necesidad de todas esas cosas piratas.
¿Alguien por favor arrojará algo de luz sobre esto? Creo que estoy empezando a volverme loco.
EDITAR: Aquí está el código de mi página index.php (que está vinculada desde registration-successful.php):
<?php
if(session_status() !== PHP_SESSION_ACTIVE){
$active = FALSE;
} else{
$active = TRUE;
session_start();
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Title</title>
<link rel="stylesheet" href="css/main.css" type="text/css" />
</head>
<body>
<h1>Title</h1>
<?php
if(!$active){
?>
<a href="login.php">Log In</a>
<br />
<a href="register.php">Register</a>
<?php
} else {
echo "Welcome " . $_SESSION['username'] . ".";
}
?>
</body>
</html>
EDIT #2: Gracias chicos, problema resuelto. Entendí mal lo que estaba haciendo session_status y cuándo lo usaría. El código actualizado simplemente coloca session_start() en la parte superior y luego carga las cosas apropiadas según la condición "if(isset($_SESSION['username']))".
3 Respuestas
1
¿Puedes probar esto?
<?php
if (session_status() !== PHP_SESSION_ACTIVE) {session_start();}
?>
O:
<?php
if(session_status() != 2) {session_start();}
// your code
?>
Esta opción funciona bien sin previo aviso.
0 = PHP_SESSION_DISABLED
1 = PHP_SESSION_NONE
2 = PHP_SESSION_ACTIVE
Respondido el 02 de diciembre de 13 a las 08:12
Sí hace que aparezca el nombre de usuario, pero luego, cuando hago clic en el enlace de registration-successful.php a mi página index.php, la sesión desaparece. También publicaré la fuente de index.php. - Chris Middleton
En la página index.php también es necesario cambiar if (session_status() !== PHP_SESSION_ACTIVE) {session_start();}
- krish r
¿No debería usar session_start() para reanudar la sesión desde la página anterior? Es decir, si (session_status() == PHP_SESSION_ACTIVE) {session_start(); }? Lo que no entiendo es que la condición que falla parece indicar que no hay una sesión activa, pero ¿cómo obtengo la variable de nombre de usuario? Si la prueba == PHP_SESSION_ACTIVE falla, ¿no debería significar que no hay información en la variable $_SESSION? ¿O al menos que PHPSESSIONID es nulo? Lo siento si mis preguntas no tienen mucho sentido, es tarde y soy un novato en estas cosas. - Chris Middleton
Tienes que usar session_start()
cuando session_status()!==PHP_SESSION_ACTIVE
- krish r
Gracias por la ayuda. Resultó que su respuesta no era la respuesta a mi problema, pero era la respuesta al problema que pensaba que tenía. En cualquier caso, fue útil para comprender el problema real, por lo que la respuesta es para usted. - Chris Middleton
1
Chris, acabo de enterarme de que " if(session_status() != 2) {session_start();} " NO funciona, sin importar lo que diga la documentación de PHP. Debes iniciar la sesión y luego comprobarlo.
Respondido el 05 de Septiembre de 15 a las 20:09
0
<?
session_start();
if (session_status() !== PHP_SESSION_ACTIVE) {
session_regenerate_id(true);
session_start();
}
?>
Respondido el 16 de Septiembre de 18 a las 08:09
Si bien este código puede responder a la pregunta, proporcionar un contexto adicional sobre cómo y / o por qué resuelve el problema mejoraría el valor de la respuesta a largo plazo. - Nic3500
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas php session or haz tu propia pregunta.
Creo que no debo entender qué está comprobando session_status. Así es como creo que funciona: en la página register.php, se crea la sesión y se inicializan las variables de sesión para el nombre de usuario y la contraseña. Luego, en la página siguiente, session_status() debería devolver PHP_SESSION_ACTIVE ya que acabo de crear uno en la página anterior. En otras palabras, solo debería hacer session_start() si la prueba session_status == PHP_SESSION_ACTIVE tiene éxito, porque de lo contrario, necesitan iniciar sesión. Así que realmente no entiendo por qué no debería ser simplemente "if (session_status() = = PHP_SESSION_ACTIVE) {inicio_sesión();}". - Chris Middleton
“en la página siguiente, session_status() debería devolver PHP_SESSION_ACTIVE ya que acabo de crear uno en la página anterior” – no, así no es como funciona. Obtendrá PHP_SESSION_ACTIVE solo si ya se inició una sesión en el guion actual – de lo contrario obtendrá PHP_SESSION_NONE (o PHP_SESSION_DISABLED respectivamente). - CBroe
Oh. Eso parece un poco aburrido. Entonces, ¿cómo se verifica si alguien está conectado (es decir, tiene una sesión activa (desde una página anterior))? - Chris Middleton
Encontré una discusión más antigua aquí: codificaciónforums.com/showthread.php?t=148593 donde dicen que simplemente verifique si $_SESSION['username'] está configurado. ¿Sigue siendo esa la manera de hacerlo? Supongo que he estado haciendo esto innecesariamente complicado. - Chris Middleton
Sí. Eso parece funcionar. Gracias, CBroe. No sé por qué es tan difícil encontrar una explicación tan clara como la que diste. Todo funciona ahora. - Chris Middleton