Tiene problemas para verificar la sesión existente

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']))".

preguntado el 02 de diciembre de 13 a las 08:12

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();}". -

“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). -

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))? -

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. -

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. -

3 Respuestas

¿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

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

<?
  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 or haz tu propia pregunta.