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 respuestas
¿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"
- Compartir respuesta
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..
- Compartir respuesta