Comunidad de diseño web y desarrollo en internet online

Cómo hacer caducar sesiones a partir de una fecha con PHP

Estaba navegando por Cristalab cuando me encontré un aporte que explicaba cómo sumar fechas por medió de PHP, y me acorde que yo había hecho alguna vez un script con manejo de fechas, por lo cual decidí compartirlo a ustedes.

Hace algún tiempo me enfrente con la siguiente situación:

Estaba desarrollando un proyecto para un cliente en el cual existía un sistema de sesiones donde los usuarios para poder ingresar se registraban. Pero este registro debía durar solamente un año, es decir que si el usuario se registraba el 20 de Mayo de 2007, su registro solo debía ser valido hasta el 20 de mayo de 2008, es decir solo duraba una año la afiliación al sistema.

Para esa fecha estaba incursionando en PHP, por lo cual decidí intentar resolver este problema con PHP.

Después de dos o tres días de trabajo logré que a partir de la fecha que el sistema capturaba al momento del registro, determinar si ya había transcurrido un año, para así darle de baja del sistema.

Este es el código:


Código :

<?php 
/*
     caducidad()
     Función Calcula si ya a pasado un año para avisar que ya caduco
     Autor: John Sánchez Alvarez
    Este código es libre de usar y modificarse
*/
function caducidad($fecha_enviada){
   if ($fecha_enviada != "0000-00-00"){
      //las variable f_ son para trabajar fechas
      $f_caduca = strtotime("$fecha_enviada +1 year",$fecha_enviada);
      $f_caduca = date("Y-m-d",$f_caduca);
      $hoy = date("Y-m-d");
      print "<b>Fecha en la cual caduca:</b> ".$f_caduca . "<br>";
      print "<b>Fecha de actual:</b> ".$hoy . "<br>";
      
      $f_hoy = strtotime($hoy);
      $f_hoy = floor($f_hoy/86400);
      // Se divide entre 86400, ya que este es el número de segundos que posee un día
      $f_caduca1 = strtotime($f_caduca);
      $f_caduca1 = floor($f_caduca1/86400);
      //f_compara nos sirve para determinar cuantos días faltan para que se vuelva a habilitar el envió de correo a un determinado usuario
      $f_compara = ($f_caduca1-$f_hoy);
      print "<b>Dias que faltan para caducar:</b> ".$f_compara . "<br>";
      if ($f_compara <= 0){
         //El valor de 1 nos indica que se debe actualizar la base de datos
         return true;
      } else {
         return false;
      }
   } else {
      return false;
   }
}// Cierra la funcion fecha_caducidad

//Implementación
//Esta fecha es la fecha a la cual deseamos evaluarle su caducida
$fecha_registro = "2007-05-20";

print "<b>Fecha ingresada:</b> ".$fecha_registro."<br>";
if(caducidad($fecha_registro)){
   //acá ira el código que quieres se ejecute en caso de caducar
   print "<b>Estado:</b> Ya caduco";
} else {
   //acá ira el código que quieres se ejecute si no ha caducado 
   print "<b>Estado:</b> No ha caducado";
}
?>


Ahora bien, intentaré explicarlo, para los novatos en PHP, y para aquellos que no entiendan algunas líneas.

Si miramos en la línea comentada en donde dice implementación (la cual es la línea 35 aproximadamente); En está línea empieza la implementación del script, la variable $fecha_registro, es la variable que posee la fecha que era registrada cuando el usuario era registrado. A posterior aparece un if en el cual invocamos la función caducidad, mandándole como parámetro $fecha_registro.

En la función caducidad() lo primero que hago es verificar que la fecha no fuera "0000-00-00" que era la fecha que aparecía por defecto en caso de el registro del usuario no poseyera caducidad, luego utilizó la variable $f_caduca en la cual almacenare la misma fecha pero con un año después de más es decir que si la fecha que aparecía en $fecha_registro era 2005-05-12 en $f_caduca debía aparecer 2006-05-12, lo cual lo hagó con la función strtotime , pero esta función presenta un "pequeño inconveniente" ella devuelve la fecha convirtiéndola en una timestamp de UNIX. por lo cual no es muy clara para alguien que no este familiarizado con esto.

Por ejemplo que fecha es esta: 1211256000

Ese número es una fecha timestamp de UNIX, lo cual a cualquiera lo deja loco, imagínese si una chica muy guapa, extremadamente guapa y además súper sexy les dijera nos encontramos en tal hotel el día 1211256000, y no vayas antes ni después. Pues sería algo terrible. Para este caso es lo mismo, me pareció terrible que me lo devolviera en ese formato por lo cual decidí ponerlo en un mejor formato, en la siguiente línea ( $f_caduca = date("Y-m-d",$f_caduca); ) utilice la función date con la cual le doy un formato mucho más entendible a la fecha.

Luego en la variable $hoy capturo la fecha de hoy.

Transformó la variable $hoy a su valor timestamp de UNIX y la almaceno en $f_hoy, luego cogó el valor obtenido y lo divido en 86400 que es el valor correspondiente al número de segundos de un día, esto para saber el número de días como valor timestamp de UNIX, lo mismo hago con $f_caduca del cual guardo su valor en $f_caduca1.

Ya sé, todos deben pensar ¿Por qué diablos entonces lo convirtió a formato fecha si igual iba a utilizar el timestamp de UNIX, es decir de nada sirvió la cháchara de la nena y todo eso del hotel y ese montón de absurdadas que dijo?. Respuesta: Ha por que cuando lo estaba fabricando no sabía si la fecha estaba bien calculada, por lo cual la transformé, para poder apreciarla mejor. es decir. Si alguien va a utilizar este código puede eliminar la línea ( $f_caduca = date("Y-m-d",$f_caduca); que es aproximadamente la línea 14) y además las línea ( $f_caduca1 = strtotime($f_caduca); ) si quiere. ;)

Bueno proseguiré: Después de tener el valor de los días en timestamp de UNIX en la variable $f_compara realizó la diferencia entre los dos valores ($f_compara = ($f_caduca1-$f_hoy); ) la cual me arroja como resultado los días que faltan o los días que sobran para la caducidad. :twisted:

Luego utilizó un if en el cual determino si faltan días, los cuales son siempre valores positivos o si por el contrario ya se paso la fecha de caducidad lo cual me da un número negativo. Dependiendo de esto retorno un true o un false

Volviendo a la línea 43 (aproximadamente) en donde dependiendo del estado se ejecuta una acción.

Bueno, espero que este pequeño tip les sea a alguien de ayuda, a otros para que se aburran, y a otros les haya hecho perder el tiempo

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate