我想做一些事情,但不知道PHP SESSIONS是否可行。 1.避免多会话。 (我在我的数据库中使用了一个标志,但是当用户没有注销时问题出现了,他们就关闭了浏览器。 2.远程注销用户。
我会把我的代码放在这里。我尝试使用数据库并检查时间差异,因此我重写了数据库中的值,用户可以登录。
Sessions.php
<?php
//Evitamos que nos salgan los NOTICES de PHP
error_reporting(E_ALL ^ E_NOTICE);
//Obtenemos el timestamp del servidor de cuanto se hizo la petición
$hora = $_SERVER["REQUEST_TIME"];
require('conexion.php');
//Duración de la sesión en segundos
$duracion = 9000;
//Si el tiempo de la petición* es mayor al tiempo permitido de la duración,
//destruye la sesión y crea una nueva
if (isset($_SESSION['ultima_actividad']) && ($hora - $_SESSION['ultima_actividad']) > $duracion) {
session_unset();
session_destroy();
// session_start();
};
// * Por esto este archivo debe ser incluido en cada página que necesite comprobar las sesiones
//Definimos el valor de la sesión "ultima_actividad" como el timestamp del servidor
$_SESSION['ultima_actividad'] = $hora;
?>
access.php
//Conectamos a la base de datos
require('../../config/conexion.php');
//Obtenemos los datos del formulario de acceso
$userPOST = $_POST["idUsuario"];
$passPOST = $_POST["idPass"];
//Filtro anti-XSS Seguridad
$userPOST = htmlspecialchars(mysqli_real_escape_string($conexion, $userPOST));
$passPOST = htmlspecialchars(mysqli_real_escape_string($conexion, $passPOST));
//Definimos la cantidad máxima de caracteres
//Esta comprobación se tiene en cuenta por si se llegase a modificar el "maxlength" del formulario
//Los valores deben coincidir con el tamaño máximo de la fila de la base de datos
$maxCaracteresUsername = "20";
$maxCaracteresPassword = "60";
//Si los input son de mayor tamaño, se "muere" el resto del código y muestra la respuesta correspondiente
if(strlen($userPOST) > $maxCaracteresUsername) {
die('El nombre de usuario no puede superar los '.$maxCaracteresUsername.' caracteres');
};
if(strlen($passPOST) > $maxCaracteresPassword) {
die('La contraseña no puede superar los '.$maxCaracteresPassword.' caracteres');
};
//Pasamos el input del usuario a minúsculas para compararlo después con
//el campo "usernamelowercase" de la base de datos
// $userPOSTMinusculas = strtolower($userPOST);
//Escribimos la consulta necesaria
// $consulta = "SELECT * FROM `users` WHERE usernamelowercase='".$userPOSTMinusculas."'";
//Consulta normal sin pedir comprobaciones de minusculas o mayusculas.
$consulta = "SELECT * FROM `users` WHERE username='".$userPOST."'";
//Obtenemos los resultados
$resultado = mysqli_query($conexion, $consulta) or die ("Query problem");
$datos = mysqli_fetch_array($resultado);
//Guardamos los resultados del nombre de usuario normal, no en minúsculas
//y de la contraseña de la base de datos
$userBD = $datos['username'];
$passwordBD = $datos['password'];
//Comprobamos si los datos son correctos
// if($userBD == $userPOSTMinusculas and password_verify($passPOST, $passwordBD)){
if($userBD == $userPOST and $passPOST == $passwordBD){
date_default_timezone_set('America/Chihuahua');
// die($parsedDate); //2016-08-18 22:54:33
//CrearFuncion para la diferencia en las fechas y el accesso en si para no repetir procedimientos...
//Funciones o declaraciones repetidas deberan ser incluidas en esta clase*****************************************
$time = date('Y-m-d H:i:s');
$time_dt = new DateTime($time);
$databasetime_dt = new DateTime($datos['lastActivity']);
//*******************************OBTENER DIFERENCIAS EN LAS FECHAS. ENTRE EL TIEMPO ACTUAL Y LA HORA QUE SE REGISTRA EN LA BASE DE DATOS.
$interval = $databasetime_dt->diff($time_dt);
// die($interval->format('%Y'));
if($datos['logged'] == 0){
session_id($datos['id']);
session_start();
$_SESSION['id'] = $datos['id'];
$_SESSION['usuario'] = $datos['username'];
$_SESSION['estado'] = 'Autenticado';
// ***********************************************************************************//
//SE GENERA UN UPDATE PARA CONFIRMAR QUE EL USUARIO ESTE LOGUEADO, SI LO ESTA, NO PODRA TENER MAS DE UNA SESION ACTIVA CON UN UPDATE EN LA HORA DE ACCESO//
$consultaActivo = "UPDATE users SET logged = 1, lastActivity ='".$time."' WHERE id=".$datos['id'];
$resultadoActivo = mysqli_query($conexion, $consultaActivo);
echo 'Hecho';
}else{
if($interval->format('%Y') >= 1){
session_id($datos['id']);
session_start();
$_SESSION['id'] = $datos['id'];
$_SESSION['usuario'] = $datos['username'];
$_SESSION['estado'] = 'Autenticado';
echo 'Hecho';
// die("Uno o mas años de diferencia");
}else{
if($interval->format('%m') >= 1){
session_id($datos['id']);
session_start();
$_SESSION['id'] = $datos['id'];
$_SESSION['usuario'] = $datos['username'];
$_SESSION['estado'] = 'Autenticado';
echo 'Hecho';
// die("Uno o mas meses de diferencia");
}else{
if($interval->format('%d') >= 1){
session_id($datos['id']);
session_start();
$_SESSION['id'] = $datos['id'];
$_SESSION['usuario'] = $datos['username'];
$_SESSION['estado'] = 'Autenticado';
echo 'Hecho';
// die("Uno o mas dias de diferencia");
}else{
if($interval->format('%H') >=1){
session_id($datos['id']);
session_start();
$_SESSION['id'] = $datos['id'];
$_SESSION['usuario'] = $datos['username'];
$_SESSION['estado'] = 'Autenticado';
echo 'Hecho';
// die("Una o mas hora de diferencia");
}else{
if($interval->format('%i') > 10){
session_id($datos['id']);
session_start();
$_SESSION['id'] = $datos['id'];
$_SESSION['usuario'] = $datos['username'];
$_SESSION['estado'] = 'Autenticado';
echo 'Hecho';
}
else{
echo 'SesionActiva';
}
}
}
}
}
}
/* Sesión iniciada, si se desea, se puede redireccionar desde el servidor */
//Si los datos no son correctos, o están vacíos, muestra un error
//Además, hay un script que vacía los campos con la clase "acceso" (formulario)
// } else if ( $userBD != $userPOSTMinusculas || $userPOST == "" || $passPOST == "" || !password_verify($passPOST, $passwordBD) ) {
} else if ( $userBD != $userPOST || $userPOST == "" || $passPOST == "" || !password_verify($passPOST, $passwordBD) ) {
// die ('<script>$(".input-group-addon").val("");</script>');
echo "Datos erroneos";
} else {
die('Error');
};
?>
logout.php
<?php
//Reanudamos la sesión
session_start();
//Requerimos los datos de la conexión a la BBDD
require('../../config/conexion.php');
$consultaActivo = "UPDATE `users` SET logged=0 WHERE id=".$_SESSION['id'];
$resultadoActivo = mysqli_query($conexion, $consultaActivo);
//Des-establecemos todas las sesiones
unset($_SESSION);
//Destruimos las sesiones
session_destroy();
//Cerramos la conexión con la base de datos
mysqli_close($conexion);
//Redireccionamos a el index
header("Location: ../../");
return true;
die();
?>