session_start() al retornar a index no muestra sesión activa

publicado por: Anonymous

Cuando ingreso las credenciales del usuario en la pagina índex.php al dar iniciar sección la información es validada en el archivo validación.php en el cual se crea la sesión y retorna con la función echo "<script> window.location.replace('index.php') </script>";a la pagina inicial, misma que en ves de mostrar los campos para ingreso de usuario debería mostrar los datos de la sesión activa pero no lo hace, es como si al retornar del archivo validación.php la sesión fuera cerrada.

Nota: Se que la validación en la base de datos con las credenciales ingresadas son correctas y de echo al ejecutar echo "secion activa ". $_SESSION['usuario']; muestra que el usuario que ah iniciado dicha sesión, pero al momento de retornar al índex al parecer la sesión no se mantiene activa.

index.php

_x000D_

_x000D_

<!DOCTYPE html>_x000D_
<html lang="en">_x000D_
<head>_x000D_
_x000D_
    <meta charset="utf-8">_x000D_
    <meta http-equiv="X-UA-Compatible" content="IE=edge">_x000D_
    <meta name="viewport" content="width=device-width, initial-scale=1">_x000D_
    <title>Insercion de registros</title>_x000D_
_x000D_
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>_x000D_
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">_x000D_
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">_x000D_
    <!--[if lt IE 9]>_x000D_
    <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.2/html5shiv.js"></script>_x000D_
    <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>_x000D_
    <![endif]-->_x000D_
_x000D_
</head>_x000D_
<body>_x000D_
<?php_x000D_
require 'validation.php';_x000D_
?>_x000D_
<nav class="navbar navbar-default">_x000D_
    <div class="container">_x000D_
        <ul class="nav navbar-nav">_x000D_
            <li class="active"><a href="index.php">Inicio <span class="sr-only">(current)</span></a></li>_x000D_
            <li class=""><a href="index.php">Clientes <span class="sr-only">(current)</span></a></li>_x000D_
        </ul>_x000D_
        <form action="validation.php" method="post">_x000D_
            <?php_x000D_
            if (isset($_SESSION['usuario'])) { ?>_x000D_
                <br>_x000D_
                <div class="form-group text-right">_x000D_
                    <?php echo $_SESSION['usuario']; ?>_x000D_
                    <a href="cerrar_sesion.php" class="btn btn-danger btn-xs">Cerrar sesión</a>_x000D_
                </div>_x000D_
            <?php } else {_x000D_
                ?>_x000D_
                <div class=" form-group text-right">_x000D_
                    <div class="form-group"></div>_x000D_
                    <form action="">_x000D_
                        <input type="text" name="usuario" value="" PLACEHOLDER="Usuario">_x000D_
                        <input type="password" name="password" PLACEHOLDER="Contraseña">_x000D_
                        <button type="submit" name="enviar" class="btn btn-primary btn-xs">Ingresar</button>_x000D_
                        <a href="#" class="btn btn-default btn-xs">Registrarse</a>_x000D_
                    </form>_x000D_
                </div>_x000D_
            <?php }  ?>_x000D_
_x000D_
        </form>_x000D_
    </div>_x000D_
</nav>_x000D_
<div class="container">_x000D_
    <div class="row">_x000D_
        <div class="col-lg-8">_x000D_
            <h3>Elija el típo de cliente</h3>_x000D_
            <select class="form-control" name="razon_social" id="option_tipo">_x000D_
                <option value="n/a">Seleccione una opción</option>_x000D_
                <option value="natural">Natural</option>_x000D_
                <option value="juridico">juridico</option>_x000D_
            </select>_x000D_
            <br>_x000D_
            <div id="formulario">_x000D_
                <div class="alert alert-warning">Por favor el tipo de solicitud que deséa registrar!</div>_x000D_
            </div>_x000D_
        </div>_x000D_
    </div>_x000D_
</div>_x000D_
_x000D_
<script type="text/javascript" src="scripts.js"></script>_x000D_
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>_x000D_
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>_x000D_
</body>_x000D_
</html>

_x000D_

_x000D_

_x000D_

validation.php

_x000D_

_x000D_

<?php_x000D_
require 'conexion.php';_x000D_
_x000D_
_x000D_
if (isset($_POST['enviar'])) {_x000D_
    $usuario = htmlentities(addslashes($_POST['usuario']));_x000D_
    $password = htmlentities(addslashes($_POST['password']));_x000D_
_x000D_
    if (!$usuario == null && !$password == null) {_x000D_
        $go = new validation();_x000D_
        $go->validate($usuario, $password);_x000D_
_x000D_
    } else {_x000D_
        echo "<script>alert ('Verifique los datos');</script>";_x000D_
        echo "<script> window.location.replace('index.php') </script>";_x000D_
    }_x000D_
}_x000D_
_x000D_
_x000D_
class validation_x000D_
{_x000D_
    private $connection;_x000D_
_x000D_
    public function __construct()_x000D_
    {_x000D_
        $con = new conexion();_x000D_
        $this->connection = $con->getConnection();_x000D_
    }_x000D_
_x000D_
    public function validate($user, $pass)_x000D_
    {_x000D_
        try {_x000D_
            $statement = $this->connection->prepare("select * from login where usuario=:usuario and password=:password");_x000D_
            $statement->execute(array(':usuario' => $user, ':password' => $pass));_x000D_
            if ($statement->rowCount() != 0) {_x000D_
                session_start();_x000D_
                $_SESSION['usuario'] = $user;_x000D_
                echo "secion activa ". $_SESSION['usuario'];_x000D_
_x000D_
                //echo "<script> window.location.replace('index.php') </script>";_x000D_
            } else {_x000D_
                echo "<script>alert ('El usuario no existe');</script>";_x000D_
                echo "<script> window.location.replace('index.php') </script>";_x000D_
            }_x000D_
        } catch (Exception $e) {_x000D_
            echo "Error al ejecutar la consulta" . $e->getMessage();_x000D_
        }_x000D_
    }_x000D_
}

_x000D_

_x000D_

_x000D_

solución

Errores

1.- session_start() debe ser llamada antes de enviar cualquier otra cosa al navegador, pero al archivo validation.php lo estás incluyendo despues del <body> y ya has enviado cosas al navegador (todo el HTML anterior).

2.- Ejecutas session_start solo cuando válidas los datos enviados por POST, es decir, que la sesión nunca se vuelve a recuperar ya que nunca más fue inicializada.

Soluciones

1.- Deberías mover el <?php require 'validation.php'; ?> antes del <!DOCTYPE html>

index.php

<?php
require 'validation.php';
?>
<!DOCTYPE html>
<html lang="en">
<body>
...

2.- session_start crea un archivo temporal (depende del tiempo de vida que sea indicado) en el servidor lo cual es contraproducente si se tiene demasiadas visitas. Una forma de iniciar sesión solo cuando se ha validado un usuario es utilizar session_name.

validation.php

<?php
define('PUBLIC_SESSION_NAME', 'cliente');// Nombre de la COOKIE para la session.

// Función helper para iniciar sesión 
function startSession() {
    session_name(PUBLIC_SESSION_NAME);
    session_start();
}

// Validamos que previamente exista la cookie de la sesión 
if (isset($_COOKIE[PUBLIC_SESSION_NAME])) {
    startSession();
}

require 'conexion.php';
//.....
            startSession();// <-- Usamos la función para inicia sesión 
            $_SESSION['usuario'] = $user;
            echo "secion activa ". $_SESSION['usuario'];
//....
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *