Jump to content

Sesiones en php


RomiChan

Recommended Posts

Hola, esta vez tengo problemas con las sesiones xD

 

He hecho el login y todo bien, los que están en la tabla empleado pueden entrar..

 

l1.PNG

 

Al entrar me manda a esta página para poder ir al menú.

 

l2.PNG

Al principio cuando hacia clic en este enlace se me salia de la sesión, por lo que busqué y puse en una parte del codigo session_set_cookie_params(3600), y se me arreglo el problema. Peeeero al cerrar sesión (con destroy) y al volver a la pagina anterior me sigue permitiendo verla, cosa que no debería...

 

Y otra cosa...pensé que la razón de esto fue poner lo de las cookies, lo saqué y nada cambió, incluso el problema que tenia al principio y que se arreglo por esto mismo seguía igual aunque ese parámetro de las cookies no estuviera...que estoy haciendo mal?? otra vez? xD que falta? en que podría mejorar?

 

Les dejo el código de verificación.

<?php
session_start();
include("conexion.php");

if(isset($_POST['login']) && !empty($_POST['login']) &&
isset($_POST['password']) && !empty($_POST['password'])
);

$con=mysql_connect($host,$user,$pw) or die("Problemas al conectar al servidor.");

mysql_select_db($db,$con) or die("Problemas al conectar al servidor.");

$consulta=mysql_query("SELECT login, password FROM empleado WHERE login='$_POST[login]'",$con) or die("Problemas al conectar a la base de datos.");

$sesion=mysql_fetch_array($consulta);

if($_POST['password'] == $sesion['password'])
{
	$_SESSION['username'] == $_POST['login'];
	echo "Sesion exitosa."."<br>";
	
		//session_set_cookie_params(10);
	echo "<a href='menu.php'>Ir al Menu.</a>";
}
else
{
	echo "Los campos no pueden estar vacios.";
}
?>

Y esta bien la forma en que puse la sesión al ir al menú?

<?
session_start();

if(isset($_SESSION['username']))

?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Documento sin título</title>
</head>

<body style="color: #C5393B; background-color: #B8AEAE; text-align: center;">
<form>
<h3>Menú</h3><br>
<button type="submit" name="Ingresar" formaction="ingresar.php">Ingresar</button><br><br>
<button type="submit" name="Buscar" formaction="opbuscar.php">Buscar</button><br><br>
<button type="submit" name="Eliminar" formaction="Eliminar.php">Eliminar</button>
</form><br>
<a href="cerrar.php">Cerrar sesion.</a>
</body>
</html>

Hace un mes que empece a aprender PHP, disculpen mi ignorancia xD. Espero puedan ayudarme >.<

Muchas gracias de antemano =)

Link to comment
Share on other sites

:mmm: Tienes un if que no hace nada...

if(isset($_POST['login']) && !empty($_POST['login']) &&
isset($_POST['password']) && !empty($_POST['password'])
);

Generalmente la forma de ir a una página disponible para usuarios que han iniciado sesión es algo así (es una idea):

<?
session_start();

if(!isset($_SESSION['username'])){
    echo "<h2>No ha iniciado sesión</h2>";
}
else{
?>

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Ponle algún título</title>
</head>

<body style="color: #C5393B; background-color: #B8AEAE; text-align: center;">
<form>
<h3>Menú</h3><br>
<button type="submit" name="Ingresar" formaction="ingresar.php">Ingresar</button><br><br>
<button type="submit" name="Buscar" formaction="opbuscar.php">Buscar</button><br><br>
<button type="submit" name="Eliminar" formaction="Eliminar.php">Eliminar</button>
</form><br>
<a href="cerrar.php">Cerrar sesión.</a>
</body>
</html>

<?php
}
?>
aunque lo más común es usar algo como esto:

<?
session_start();

if(!isset($_SESSION['username'])){
    echo "<h2>No ha iniciado sesión</h2>";
}
else{
    header("Location: pagina.php");
}
?>
o sea, usas header("Location: pagina_a_la_que_quieres_ir.php"); para abrir la página correspondiente.

 

:huasonto:

Link to comment
Share on other sites

Mmm de las dos maneras me dice que no he iniciado sesión al intentar ir al menú.

<?
session_start();

if(!isset($_SESSION['username'])){
    echo "<h2>No ha iniciado sesión</h2>";
}
else{
    header("Location: pagina.php");
}
?>

session_set_cookie_params() me servira para algo? xd

 

 

edit: Ya me funcionó el header =P fue porque lo puse después de un echo. Lo único que me falta es que al cerrar sesión no me de permiso para volver a la pagina anterior.

 

edit2:

......
$consulta=mysql_query("SELECT login, password FROM empleado WHERE login='$_POST[login]'",$con) or die("Problemas al conectar a la base de datos.");

$sesion=mysql_fetch_array($consulta);

if($_POST['password'] == $sesion['password'])
{
	$_SESSION['username'] == $_POST['login'];
	header("location: menu.php");
	echo "Sesion exitosa."."<br>";
	exit; 
	//echo "<a href='verificarloginmenu.php'>Ir al Menu.</a>";
}
else
{
	echo "Error al inicar sesion. Revice que el nombre de usuario y contraseña sean correctos.";
}

Aquí puse el header y me envia a la página menu.

<?
session_start();

if(!isset($_SESSION['username'])){
    echo "<h2>No ha iniciado sesión</h2>";
}
else{
	//echo $user=$_SESSION['username']; 
	
?>
 
	
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Documento sin título</title>
</head>

<body style="color: #C5393B; background-color: #B8AEAE; text-align: center;">
<form>
<h3>Menú</h3><br>
<button type="submit" name="Ingresar" formaction="ingresar.php">Ingresar</button><br><br>..........................

Pero lo tenia como lo que esta en comentario, después pensé que en esta pagina tb se debería verificar, lo puse como tu propusiste y me dice que no he iniciado sesión. Asi que supongo que al entrar al menú como lo hice al principio en realidad no me inicia sesion, y por lo mismo no me funciona el destroy al cerrar sesión.

 

sorry por lo desordenado xd

Edited by RomiChan
Link to comment
Share on other sites

:mmm: Escribiste mal esta línea:

$_SESSION['username'] == $_POST['login'];
...se supone que debería ser una asignación.


Las páginas quedarían más o menos así:

[hide]

login.php

<?php
    session_start();
    if(isset($_SESSION['username']))
    {
        header("Location: cerrar.php");
        exit;
    }
?>
<!DOCTYPE html>
<head>
<title>Iniciar sesión</title>
</head>
<body>
<form action="validar.php" method="post">
    <p>Usuario:
    <input type="text" name="login"></p>
    <p>Contraseña:
    <input type="password" name="password"></p>
    <input type="submit" name="submit" value="Entrar">
</form>
<?php
    if(isset($_SESSION['mensaje']) && !empty($_SESSION['mensaje']))
    {
        echo $_SESSION['mensaje'];
    }
?>
</body>
</html>
Obviamente, tú puedes remplazar el formulario de ingreso por el que ya tienes hecho.

 

validar.php

<?php
    session_start();
    include("conexion.php");

    $_SESSION['mensaje'] = "";

    if(isset($_POST['login']) && !empty($_POST['login']) &&
       isset($_POST['password']) && !empty($_POST['password'])){

        $con=mysql_connect($host,$user,$pw) or die("Problemas al conectar al servidor.");

        mysql_select_db($db,$con) or die("Problemas al conectar al servidor.");

        $consulta=mysql_query("SELECT login, password FROM empleado WHERE login='$_POST[login]'",$con) or die("Problemas al conectar a la base de datos.");

        $sesion=mysql_fetch_array($consulta);

        if($_POST['password'] == $sesion['password'])
        {
            $_SESSION['username'] = $_POST['login'];
            header("Location: menu.php");
            exit;
        }
        else
        {
            $_SESSION['mensaje'] = "Usuario o contraseña incorrectos.";
        }
    }
    else
    {
        $_SESSION['mensaje'] = "Debe especificar usuario y contraseña.";
    }
    header("Location: login.php");
?>
Le modifiqué los mensajes de error y la forma en que se muestran.

 

menu.php

<?php
    session_start();
    if(!isset($_SESSION['username']))
    {
        header("Location: login.php");
        exit;
    }
?>
<!DOCTYPE html>
<head>
<title>Menú</title>
</head>
<body>
<?php
    echo "<h3>Bienvenido ".$_SESSION['username']."</h3>";
?>
<center><h1>Aquí debería haber un menú</h1></center>
<p>
<center><a href="cerrar.php">Cerrar sesión</a></center>
</p>
</body>
</html>
El código PHP inicial (las primeras 8 líneas) deberían ir en todas las otras páginas (ingresar.php, opbuscar.php, etc.), excepto en cerrar.php. La idea es que el resto de las páginas empiecen con las primeras 8 líneas en PHP que sirven para verificar si el usuario inició sesión, después viene el código HTML (obviamente dicho código HTML puede contener código PHP incrustado).

 

cerrar.php

Sólo debe tener el código que destruye las variables de sesión y después vuelve a la página login.php.

[/hide]

 

:huasonto:

Edited by susodicho
Link to comment
Share on other sites

Funcionó *O*

Pero quiero ver si entendí bien.

Cuando cerrar.php me lleva a login.php, este ultimo me confirma que este cerrada la sesión llevandome a cerrar.php nuevamente, asi evita que pueda devolverme a la pagina anterior, cierto?.

Tal vez haya una manera mejor de explicarlo, pero así lo entendí yo.

<?
	if(isset($_SESSION['mensaje']) && !empty($_SESSION['mensaje']))
	{
		echo $_SESSION['mensaje'];
	}
?>

Esta parte del código me confunde un poco xD Sé por que esta ahí, y de donde vienen. Pero esto me hace entender que el mensaje se publicará si o si cuando no este puesto en pantalla, cuando sé que es por las condiciones hechas en verificar.php.

En fin, debo dar por hecho que es asi, a menos que me des una explicación que pueda aclararme mas =P

 

Muchas gracias por la ayuda :gracias:

Edited by RomiChan
Link to comment
Share on other sites

Funcionó *O*

Pero quiero ver si entendí bien.

Cuando cerrar.php me lleva a login.php, este ultimo me confirma que este cerrada la sesión llevandome a cerrar.php nuevamente, asi evita que pueda devolverme a la pagina anterior, cierto?.

Tal vez haya una manera mejor de explicarlo, pero así lo entendí yo.

No, el código PHP que está al comienzo del archivo login.php es para detectar algo que en realidad normalmente no debería ocurrir: ¿qué pasa si alguien ingresa a la página login.php si ya inició sesión?. Si tu sitio está bien hecho, no debería haber forma de que un usuario que inició sesión pueda acceder a la página login.php (en ninguna parte debería haber un enlace para que el usuario llegue a esa página). Así que yo pensé que si un usuario con sesión abierta se las ingenió para llegar a la página login.php es porque quizás quiere cerrar la sesión, y por eso lleva a la página cerrar.php. Esto puede ocurrir si un usuario tiene varias pestañas abiertas y hace rato inició sesión en una de ellas, después de un tiempo y con un montón de pestañas abiertas, decide entrar a la página y para eso usa el enlace a la página login.php que tiene almacenado en sus favoritos (marcadores o bookmarks) en una nueva pestaña. En este escenario, no parece buena idea cerrarle la sesión al usuario, ya que no se acordaba que ya había iniciado sesión en otra pestaña. Así que ahora creo sería mejor llevarlo a la página menu.php si ya tiene una sesión abierta, ya que esa es la pantalla que normalmente se muestra al iniciar sesión.

Así que mejor cambia eso y aprovechas de poner algún comentario explicativo en esa parte del código PHP (el del comienzo del archivo login.php).

 

De forma similar, también deberías revisar qué pasa cuando alguien se las ingenia para ingresar a la página verificar.php (normalmente nadie debería saber siquiera de la existencia de esa página), pero algún curioso podría ver el código fuente de la página login.php y darse cuenta que lleva a la página verificar.php. Fíjate qué pasa si se ingresa a la página verificar.php con y sin sesión abierta. ;)


 

<?
	if(isset($_SESSION['mensaje']) && !empty($_SESSION['mensaje']))
	{
		echo $_SESSION['mensaje'];
	}
?>
Esta parte del código me confunde un poco xD Sé por que esta ahí, y de donde vienen. Pero esto me hace entender que el mensaje se publicará si o si cuando no este puesto en pantalla, cuando sé que es por las condiciones hechas en verificar.php.

En fin, debo dar por hecho que es asi, a menos que me des una explicación que pueda aclararme mas =P

 

Tal como está hecho, resulta que el mensaje es persistente, o sea, aunque se recargue la página, siempre muestra el último mensaje de error (sin necesidad de haber pasado por verificar.php). Así que sí tiene una pifia. Nótese que verificar.php sí limpia el mensaje al comienzo (le asigna una cadena vacía) y, por lo tanto, si se inició sesión correctamente, no hay ningún problema. Además creo sería mejor usar otra forma de ver si ocurrió un error o no, así que podrías hacer los siguientes cambios (ojo, estos cambios no arreglan la pifia, sólo hacen que sea un poco más elegante):
  • En login.php cambia esta línea:
    if(isset($_SESSION['mensaje']) && !empty($_SESSION['mensaje']))
    ...por esta:
    if(isset($_SESSION['mensaje']))
  • En verificar.php cambia esta línea:
    $_SESSION['mensaje'] = "";
    ...por esta:
    unset($_SESSION['mensaje']);
Insisto, esto no arregla el problema del mensaje de error persistente. Para arreglarlo, simplemente hay que destruir la variable que contiene el mensaje de error justo después de mostrarlo, o sea, en el archivo login.php, agrega la línea unset($_SESSION['mensaje']); después de la línea que muestra el mensaje.

 

:huasonto:

Edited by susodicho
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...