Grabar desconexión de usuario logueado

Tengo una web en la que los usuarios pueden loguearse, y al hacerlo se graba en una base de datos mysql el usuario y la hora de conexión.

Quisiera saber cómo hacer para que también quede grabada la hora de "desconexión".

Si pulsan el botón de cerrar sesión es sencillo de hacer, pero mi pregunta va para aquellos casos en que no lo hagan, es decir, en los casos en que sencillamente cierran la página sin cerrar sesión, o en los casos en que la sesión se cierra automáticamente por inactividad.

2

2 Respuestas

0 pts. Informático con experiencia en diversos campos

¿Cómo haces para que se guarde el usuario? Es que mira tengo esto:

index.php:

¿
<?php
/*
 * Valida un usuario y contraseña o presenta el formulario para hacer login
 */
if ($_SERVER['REQUEST_METHOD']=='POST') { // ¿Nos mandan datos por el formulario?
    include('php_lib/config.ini.php'); //incluimos configuración
    include('php_lib/login.lib.php'); //incluimos las funciones
    //verificamos el usuario y contraseña mandados
    if (login($_POST['usuario'],$_POST['password'])) {
       //acciones a realizar cuando un usuario se identifica
       //EJ: almacenar en memoria sus datos, registrar un acceso a una tabla de datos
//Conectamos con la base de datos
  $conexion = mysql_connect(SERVIDOR_MYSQL, USUARIO_MYSQL, PASSWORD_MYSQL);
//si falla
    if (!$conexion) {
        trigger_error('Error al conectar al servidor mysql: ' . mysql_error(),E_USER_ERROR);
    }
    // Seleccionar la base de datos activa
    $db_selected = mysql_select_db(BASE_DATOS, $conexion);
    if (!$db_selected) {
        trigger_error ('Error al conectar a la base de datos: ' . mysql_error(),E_USER_ERROR);
    }
  //Sentencia SQL para buscar un usuario con esos datos 
    $registros=mysql_query("select usuario, nivel from usuarios where usuario = '".$usr."'",$conexion) or die("Problemas en el select:".mysql_error());
    if ($reg=mysql_fetch_array($registros))
        {
        switch($reg['nivel'])
        {
            case 1:
            header('Location: /registro/volu/volu.php');
            break;
            case 2:
            header('Location: /registro/volu/volu5.php');
            break;
            case 3:
            header('Location: /registro/volu/volu10.php');
            break;
            case 4:
            header('Location: /registro/volu/volu15.php');
            break;
            case 5:
            header('Location: /registro/aum/aum.php');
            break;
            case 6:
            header('Location: /registro/aum/aum5.php');
            break;
            case 7:
            header('Location: /registro/aum/aum10.php');
            break;
            case 8:
            header('Location: /registro/aum/aum15.php');
            break;
            default:
            Echo "Algo está fallando. Si los problemas persisten contacta con nosotros desde el enlace ¿problemas?"; 
}
    }
    die();
    } else {
        //acciones a realizar en un intento fallido
        //Ej: mostrar captcha para evitar ataques fuerza bruta, bloqueas durante un rato esta ip, ....
        //preparamos un mensaje de error y continuamos para mostrar el formulario
        $mensaje='Usuario o contraseña incorrectos.';
     }
} //fin if post
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <title>DirecPedidos</title>
<!--comienza el carrusel-->
 <script src="jquery-1.4.4.min.js" type="text/javascript"></script><!--llamamos a los js-->
    <script src="jsCarousel-2.0.0.js" type="text/javascript"></script><!--llamamos a los js-->
    <link href="jsCarousel-2.0.0.css" rel="stylesheet" type="text/css" /><!--llamamos a los css-->
    <script type="text/javascript"><!--función para el auto -->
        $(document).ready(function() {
            $('#carouselv').jsCarousel({ onthumbnailclick: function(src) { alert(src); }, autoscroll: true, masked: false, itemstodisplay: 3, orientation: 'v' });
            $('#carouselh').jsCarousel({ onthumbnailclick: function(src) { alert(src); }, autoscroll: false, circular: true, masked: false, itemstodisplay: 5, orientation: 'h' });
            $('#carouselhAuto').jsCarousel({ onthumbnailclick: function(src) { alert(src); }, autoscroll: true, masked: true, itemstodisplay: 5, orientation: 'h' });
        });       
    </script>
  <style type="text/css">/*carrusel*/
        body
        {
            padding-top: 40px;
        }
        #hWrapperAuto
        {
            margin-top: 20px;
        }
        #demo-tabs
        {
            width: 100%;
            height: 50px;
            color: White;
            margin: 0;
            padding: 0;
        }
        #demo-tabs div.item
        {
            height: 35px;
            float: left;
            background-color: #2F2F2F;
            border: solid 1px gray;
            border-bottom: none;
            padding: 0;
            margin: 0;
            margin-left: 10px;
            text-align: center;
            padding: 10px 4px 4px 4px;
            font-weight: bold;
        }
        #contents
        {
            width: 100%;
            margin: 0;
            padding: 0;
            color: White;
            font: arial;
            font-size: 11pt;
        }
        #demo-tabs div.item.active-tab
        {
            background-color: Black;
        }
        #demo-tabs div.item.active-tabc
        {
            background-color: Black;
        }
        #v1, #v2
        {
            margin: 20px;
        }
        .visible
        {
            display: block;
        }
        .hidden
        {
            display: none;
        }
        #oldWrapper
        {
            margin-left: 100px;
        }
        #contents a
        {
            color: yellow;
        }
        #contents a:hover
        {
            text-decoration: none;
            color: Gray;
        }
        .heading
        {
            font-size: 20pt;
            font-weight: bold;
        }
    </style>
</head>
<style>/*caja de ayuda*/
 a.activator{
    width: 47px;
    height: 28px;
    position: absolute;
    top: 0px;
    left: 0px;
    z-index: 1;
    cursor: pointer;
        }
        /* Style for overlay and box */
        .overlay{
            background:transparent url(images/overlay.png) repeat top left;
            position:fixed;
            top:0px;
            bottom:0px;
            left:0px;
            right:0px;
            z-index:100;
        }
        .box{
            position:fixed;
            top:-900px;
            left:30%;
            right:30%;
            background-color:#1B1E1F;
            color:#7F7F7F;
            padding:20px;
            border:2px solid #999;
            -moz-border-radius: 20px;
            -webkit-border-radius:20px;
            -khtml-border-radius:20px;
            -moz-box-shadow: 0 1px 5px #333;
            -webkit-box-shadow: 0 1px 5px #333;
            z-index:101;
        }
        .box h1{
            border-bottom: 1px dashed #7F7F7F;
            margin:-20px -20px 0px -20px;
            padding:10px;
            background-color:#666;
            color:#F90;
            -moz-border-radius:20px 20px 0px 0px;
            -webkit-border-top-left-radius: 20px;
            -webkit-border-top-right-radius: 20px;
            -khtml-border-top-left-radius: 20px;
            -khtml-border-top-right-radius: 20px;
        }
        a.boxclose{
            float:right;
            width:26px;
            height:26px;
            background:transparent url(images/cancel.png) repeat top left;
            margin-top:-30px;
            margin-right:-30px;
            cursor:pointer;
        }
    </style>
<body>
<div style="float:left; left:35%; position:absolute">
<img src="./logos/logo.png" width="500" />
</div>
<div style="float:left; left:40%; position:absolute; top:300px;">
        <?php
            //si hay algún mensaje de error lo mostramos escapando los carácteres html
            if (!empty($mensaje)) echo('<h2>'.htmlspecialchars($mensaje).'</h2>');
        ?>
        <form action="index.php" enctype="multipart/form-data" method="post">
            <label>Usuario:
                     <input name="usuario" type="text" />
            </label>
          </br></br> <label>Contraseña:
                <input name="password" type="password" />
            </label>
            </br></br><input type="submit" value="Entrar" name="submit" style="float:left; left:40%; position:absolute" />
        </form>
        <div style="position:absolute; float:left; left:35%; top:200px; width:200px;">
            <!-- The activator -->
            <a class="activator" id="activator">¿Problemas?</a>
        </div>
</div>
<!--El carrusel-->
 <div id="contents">
      <div id="v2">           
                    <div id="hWrapperAuto">
                        <div id="carouselhAuto">
                            <div>
                                <img alt="" src="images/img_1.jpg" /><br />
                                <span class="thumbnail-text">Catálogo</span>
                            </div>
                            <div>
                                <img alt="" src="images/img_2.jpg" /><br />
                                <span class="thumbnail-text">Image Text</span>
                            </div>
                            <div>
                                <img alt="" src="images/img_1.jpg" /><br />
                                <span class="thumbnail-text">Image Text</span>
                            </div>
                            <div>
                                <img alt="" src="images/img_2.jpg" /><br />
                                <span class="thumbnail-text">Image Text</span>
                            </div>     
                            <div>
                                <img alt="" src="images/img_1.jpg" /><br />
                                <span class="thumbnail-text">Image Text</span>
                            </div>
                            <div>
                                <img alt="" src="images/img_2.jpg" /><br />
                                <span class="thumbnail-text">Image Text</span>
                            </div>     
                            <div>
                                <img alt="" src="images/img_1.jpg" /><br />
                                <span class="thumbnail-text">Image Text</span>
                            </div>
                            <div>
                                <img alt="" src="images/img_2.jpg" /><br />
                                <span class="thumbnail-text">Image Text</span>
                            </div>     
                            <div>
                                <img alt="" src="images/img_1.jpg" /><br />
                                <span class="thumbnail-text">Image Text</span>
                            </div>
                            <div>
                                <img alt="" src="images/img_2.jpg" /><br />
                                <span class="thumbnail-text">Image Text</span></div>     <div>
                                <img alt="" src="images/img_1.jpg" /><br />
                                <span class="thumbnail-text">Image Text</span></div>
                            <div>
                                <img alt="" src="images/img_2.jpg" /><br />
                                <span class="thumbnail-text">Image Text</span></div>     <div>
                                <img alt="" src="images/img_1.jpg" /><br />
                                <span class="thumbnail-text">Image Text</span></div>
                            <div>
                                <img alt="" src="images/img_2.jpg" /><br />
                                <span class="thumbnail-text">Image Text</span></div>     <div>
                                <img alt="" src="images/img_1.jpg" /><br />
                                <span class="thumbnail-text">Image Text</span></div>
                            <div>
                                <img alt="" src="images/img_2.jpg" /><br />
                                <span class="thumbnail-text">Image Text</span></div>
                        </div>
                    </div>
   </div>
</div>
        </div>
    </div>
    <!--Fin carrusel-->
<!--la emergente-->
<div class="overlay" id="overlay" style="display:none;"></div>
        <div class="box" id="box">
            <a class="boxclose" id="boxclose"></a>
            <h1><font size="+2">Recuperar o registrarse</font></h1>
            <p>
                <font size="+1">Para recuperar su contraseña o poder registrarse debe ponerse en contacto con:</br></br>
                Joaquin: 635 665 679</br></br>
                mail: [email protected]</br></br>
            </p></font>
        </div>
        <!-- The JavaScript -->
<script type="text/javascript">
            $(function() {
                $('#activator').click(function(){
                    $('#overlay').fadeIn('fast',function(){
                        $('#box').animate({'top':'160px'},500);
                    });
                });
                $('#boxclose').click(function(){
                    $('#box').animate({'top':'-900px'},500,function(){
                        $('#overlay').fadeOut('fast');
                    });
                });
            });
        </script>
<script>
  jQuery(document).ready(function($) {
      $('a').smoothScroll({
        speed: 1000,
        easing: 'easeInOutCubic'
      });
      $('.showOlderChanges').on('click', function(e){
        $('.changelog .old').slideDown('slow');
        $(this).fadeOut();
        e.preventDefault();
      })
  });
  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-2196019-1']);
  _gaq.push(['_trackPageview']);
  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl/' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();
</script>
    </body>
</html>

consig.ini.php:

<?php
/* 
 * Configuración general: conexión a la base de datos y otro parámetros
 */
define('SERVIDOR_MYSQL','127.0.0.1'); //servidor de la base de datos
define('USUARIO_MYSQL','user'); //usuario de la base de datos
define('PASSWORD_MYSQL','pass'); //la clave para conectar
define('BASE_DATOS','bd'); // indica el nombre de la base de datos que contiene la tabla de los usuarios
define('TABLA_DATOS_LOGIN','usuarios'); //nombre de la tabla usarios
define('CAMPO_USUARIO_LOGIN','usuario'); //campo que contiene los datos de los usuarios (se puede usar el email)
define('CAMPO_CLAVE_LOGIN','password'); //campo que contiene la contraseña
define('METODO_ENCRIPTACION_CLAVE','texto'); //método utilizado para almacenar la contraseña encriptada. Opciones: sha1, md5, o texto
?>

login.lib.php:

<?php
function login($usuario,$password) {
    //usuario y password tienen datos?
    if (empty($usuario)) return false;
    if (empty ($password)) return false;
    //1 - conectamos a la base de datos utilizando los parámetros globales
    $link =  mysql_connect(SERVIDOR_MYSQL, USUARIO_MYSQL, PASSWORD_MYSQL);
    if (!$link) {
        trigger_error('Error al conectar al servidor mysql: ' . mysql_error(),E_USER_ERROR);
    }
    // Seleccionar la base de datos activa
    $db_selected = mysql_select_db(BASE_DATOS, $link);
    if (!$db_selected) {
        trigger_error ('Error al conectar a la base de datos: ' . mysql_error(),E_USER_ERROR);
    }
    //2 - preparamos la consulta SQL a ejecutar utilizando sólo el usuario y evitando ataques de inyección SQL.
    $query='SELECT '.CAMPO_USUARIO_LOGIN.', '.CAMPO_CLAVE_LOGIN.' FROM '.TABLA_DATOS_LOGIN.' WHERE '.CAMPO_USUARIO_LOGIN.'="'.  mysql_real_escape_string($usuario).'" LIMIT 1 '; //la tabla y el campo se definen en los parametros globales
    $result = mysql_query($query);
    if (!$result) {
        trigger_error('Error al ejecutar la consulta SQL: ' . mysql_error(),E_USER_ERROR);
    }
    //3 - extraemos el registro de este usuario
    $row = mysql_fetch_assoc($result);
    if(mysql_num_rows($result) == 1) {
    // Obtuvimos un solo resultado.
    // Primero, guardamos la informacion del usuario en variables de sesion
    // (es util mas adelante para saber si alguien esta logueado, por ejemplo)
 session_start(); 
      //Guardamos dos variables de sesión que nos auxiliará para saber si se está o no "logueado" un usuario 
    $_SESSION['usuario'] = $usuario;}
    if ($row) {
        //4 - Generamos el hash de la contraseña encriptada para comparar o lo dejamos como texto plano
        switch (METODO_ENCRIPTACION_CLAVE) {
            case 'sha1'|'SHA1':
                $hash=sha1($password);
                break;
            case 'md5'|'MD5':
                $hash=md5($password);
                break;
            case 'texto'|'TEXTO':
                $hash=$password;
                break;
            default:
                trigger_error('El valor de la constante METODO_ENCRIPTACION_CLAVE no es válido. Utiliza MD5 o SHA1 o TEXTO',E_USER_ERROR);
        }
     //   var_dump($row);
       // var_dump($hash);
        //5 - comprobamos la contraseña
        if ($hash==$row[CAMPO_CLAVE_LOGIN]) {
            @session_start();
            $_SESSION['USUARIO']=array('user'=>$row[CAMPO_USUARIO_LOGIN]); //almacenamos en memoria el usuario
            // en este punto puede ser interesante guardar más datos en memoria para su posterior uso, como por ejemplo un array asociativo con el id, nombre, email, preferencias, ....
           return true; //usuario y contraseña validadas
           if(mysql_num_rows($result) == 1) {
    // Obtuvimos un solo resultado.
    // Primero, guardamos la informacion del usuario en variables de sesion
    // (es util mas adelante para saber si alguien esta logueado, por ejemplo)
    $_SESSION['usuario'] = $usuario;}
        } else {
            @session_start();
            unset($_SESSION['USUARIO']); //destruimos la session activa al fallar el login por si existia
            return false; //no coincide la contraseña
        }
    } else {
        //El usuario no existe
        return false;
    }
}
/**
 * Veridica si el usuario está logeado
 * @return bool
 */
function estoy_logeado () {
    @session_start(); //inicia sesion (la @ evita los mensajes de error si la session ya está iniciada)
    if (!isset($_SESSION['USUARIO'])) return false; //no existe la variable $_SESSION['USUARIO']. No logeado.
    if (!is_array($_SESSION['USUARIO'])) return false; //la variable no es un array $_SESSION['USUARIO']. No logeado.
    if (empty($_SESSION['USUARIO']['user'])) return false; //no tiene almacenado el usuario en $_SESSION['USUARIO']. No logeado.
    //cumple las condiciones anteriores, entonces es un usuario validado
    return true;
}
/**
 * Vacia la sesion con los datos del usuario validado
 */
function logout() {
    @session_start(); //inicia sesion (la @ evita los mensajes de error si la session ya está iniciada)
    unset($_SESSION['USUARIO']); //eliminamos la variable con los datos de usuario;
    session_write_close(); //nos asegurmos que se guarda y cierra la sesion
    return true;
}
?>

Ahora tenfo un formulario simple que se llama volu.php y llama a guarda.php:

<?php 
$link = mysqli_connect("127.0.0.1", "tousinfo_tous", "ceorth");
mysqli_select_db($link, "tousinfo_direcpedidos");
$tildes = $link->query("SET NAMES 'utf8'"); //Para que se inserten las tildes correctamente
$nombre = $_POST["nombre"];
$nick = $_POST["nick"];
@session_start();
$_SESSION['USUARIO']=array('user'=>$row[CAMPO_USUARIO_LOGIN]);
if ($_SESSION["usuario"] = "SI"){ //evalúa si tu usuario NO esta logueado
$_SESSION["usuario"] = $usr;}
mysqli_query($link, "INSERT INTO volu0 VALUES ('$usr', '$nombre', '$nick')");
mysqli_close($link); // Cerramos la conexion con la base de datos
echo 'Los datos han sido insertados en la base de datos';
echo $_SESSION['usuario'];
?>

Lo que quiero es que en una tabla simple con usuario nombre y nick todos varchar de 60 me guarde el usuario que está logado y el nombre y nick que introduzca. Pero solo me guarda en usuario un "SI"

23.850 pts. Desarrollador web

Ese cuento es fácil.

En los casos en que no cierra sesión pues edúcalos.. ¿Cómo? Crea una tabla en la que guardes el usuario cuando inicia sesión. Cuando cierre sesión eliminas ese registro. ¿Para qué esto? También sirve para que apliques la lógica al inicio de sesion:

Si el usuario existe en esa tabla quiere decir que ya se encuentra conectado sino pues lo dejas iniciar sesión y creas el registro.

Cuando les cierras la sesión automáticamente también les tienes que eliminar ese registro para que no queden atrapados.

Ahora lo bueno... tienes que crear algún modulo para que se libere el usuario. Entonces cuando no cierran sesión bien tienen que pedirle ayuda a alguien para libere el usuario osea.. una consulta que elimine el usuario de esa tabla..

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas