PHP: acceso al sistema entre hora inicial y final

En el post de hoy veremos cómo podemos hacer un sistema en PHP para hacer que los usuarios entren solo en determinada hora específica, por ejemplo, desde las 10 de la mañana hasta las 2 de la tarde.

Básicamente vamos a ver cómo guardar la hora de entrada y salida, y dejar que el usuario ingrese solo si está en ese rango.

Te voy a mostrar un ejemplo de cómo guardar los datos en la base de datos y cómo comparar al momento de iniciar sesión. Te aviso desde ahora que el código será como un ejemplo para que tú puedas tomarlo y adaptarlo al tuyo.

Diseñando la base de datos

Como vamos a comparar únicamente la hora necesitamos guardar a la misma con los dos puntos que separan la hora y los minutos.

Para ello necesitamos un campo de texto que soporte al menos 5 caracteres. En mi caso usaré varchar de 5.

Por cierto, en la tabla de los horarios también necesitamos tener el id del usuario para el cual estamos definiendo el horario y agregar las relaciones necesarias:

CREATE TABLE horarios(
	id_usuario int,
	entrada varchar(5),
	salida varchar(5)
);

Registrar horario

Ahora veamos cómo vamos a guardar los horarios de entrada y salida para nuestro sistema. Aquí vamos a necesitar el id del usuario (que debe venir de la base de datos) y la hora de entrada y salida.

Yo he creado un arreglo con usuarios ficticios para el ejemplo. Las cosas que hay que resaltar son los input, que son de tipo time y que funcionan en Chrome y Firefox.

<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
</head>
<?php
// Estos usuarios deberían venir de su base de datos. Aquí solo los pongo como ejemplo
$usuarios = [
	[
		"id" => 1,
		"nombre" => "Luis"
	],
	[
		"id" => 2,
		"nombre" => "Juan"
	]
];
?>

<body>
	<form action="guardar_turno.php" method="post">
		<select name="id_usuario">
			<?php foreach ($usuarios as $usuario) { ?>
				<option value="<?php echo $usuario["id"] ?>"><?php echo $usuario["nombre"] ?></option>
			<?php } ?>
		</select>
		<p>Hora de entrada:</p>
		<input type="time" name="entrada" required>

		<p>Hora de salida:</p>
		<input type="time" name="salida" required>
		<button type="submit">Ok</button>
	</form>
</body>

</html>

Estos input nos darán la hora en formato de 24 horas, por ejemplo, 23:44. Y así como estén, los vamos a guardar en nuestra base de datos para consultarlos más adelante.

Guardando entrada y salida

De nuevo te muestro un ejemplo de cómo se van a guardar los datos después de recibirlos del formulario:

<?php
$entrada = $_POST["entrada"];
$salida = $_POST["salida"];
$idUsuario = $_POST["id_usuario"];
/*Aquí guardamos la entrada y salida en la base de datos como varchar de longitud 5
*/
$bd = include_once "bd.php";
$sentencia = $bd->prepare("INSERT INTO horarios(id_usuario, entrada, salida) VALUES(?, ?, ?)");
$sentencia->execute([$idUsuario, $entrada, $salida]);
echo "Registrado correctamente";

Simplemente guardamos el id del usuario, la entrada y la salida. Por cierto, recuerda que solo debería existir un horario por cada usuario, así que antes de guardar deberías ver si no existe otro horario, o deberías eliminar antes de guardar.

Comprobando hora

Cuando el usuario inicie sesión en nuestro sistema vamos a obtener su ID, y esto ya depende de ti. Por ejemplo, puede que obtengas el id a través de su correo o de los datos que ingrese para hacer login.

Una vez que tengas el id vas a consultar su horario de entrada y salida, y luego calcular la hora actual. En PHP podemos obtener la hora en formato de 24 horas con date("H:i"):

<?php
// Invocado en el login
// Hasta aquí suponemos que ya tenemos el usuario y contraseña o los datos de login, así como el id del usuario
$bd = include_once "bd.php";
$idUsuario = 1; // Debe venir de la base de datos
$consulta = "SELECT entrada, salida FROM horarios WHERE id_usuario = ?";
$sentencia = $bd->prepare($consulta);
$sentencia->execute([$idUsuario]);
$horario = $sentencia->fetch();
if (!$horario) {
	echo "No existen registros de horario con ese id";
	exit;
}
// Hasta aquí podemos estar seguros de que existe un horario para ese usuario 
date_default_timezone_set("America/Mexico_City");
$horaActual = date("H:i");
$entrada = $horario["entrada"];
$salida = $horario["salida"];
if ($horaActual > $entrada && $horaActual < $salida) {
	echo "Bienvenido";
} else {
	echo "No puedes entrar a esta hora";
}

La magia sucede en la línea 19.

Cuando ya tenemos la hora actual y la entrada y salida del empleado (o los detalles de su turno) simplemente comparamos las cadenas de manera lexicográfica, es decir, las comparamos como si fueran números, pero ordenadas alfabéticamente.

Explicación en vídeo

Conclusión

Ya lo único que faltaría es poner una expiración a la sesión para expulsar al usuario a esa hora, pero eso queda en ti.

Por cierto, yo utilicé MySQL y PDO para los ejemplos pero esto puede adaptarse para cualquier otro motor, pues solo utilizo datos de tipo texto.

Te dejo más tutoriales de PHP por aquí.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

4 comentarios en “PHP: acceso al sistema entre hora inicial y final”

  1. Hola soy estudiante de informática y me gustaría me ayudaran con mi proyecto , es un control de entrad y salida del personal obrero y administrativo de una escuela

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *