· 8 years ago · Jun 29, 2018, 05:12 PM
1<?php
2/*
3Manejador de sesiones propio
4Recuerda crear una tabla asÃ:
5
6CREATE TABLE IF NOT EXISTS sesiones(
7 id VARCHAR(255) NOT NULL PRIMARY KEY,
8 datos TEXT NOT NULL,
9 ultimo_acceso BIGINT UNSIGNED NOT NULL
10);
11
12@author parzibyte
13@see parzibyte.me/blog
14@date 2018-06-28
15
16 */
17class ManejadorDeSesion implements \SessionHandlerInterface
18{
19 private $base_de_datos; #Aquà vamos a guardar nuestra referencia a la base de datos
20 public function open($ruta_de_guardado, $nombre_de_sesion)
21 {
22 $pass = ""; // Contraseña del servidor MySQL
23 $usuario = "root"; // Usuario de MySQL
24 $nombre_base_de_datos = "test"; // El nombre de la base de datos (no el de la tabla)
25 $host = "localhost"; // El host, normalmente localhost pero puede ser una IP en algunos casos
26 try {
27 $this->base_de_datos = new PDO('mysql:host=' . $host
28 . ';dbname=' . $nombre_base_de_datos,
29 $usuario, $pass);
30 return true;
31 } catch (Exception $e) {
32 //TODO: Imprimir o guardar el mensaje en un log
33 return false;
34 }
35 }
36
37 public function close()
38 {
39 #Eliminamos referencia a la base de datos
40 $this->base_de_datos = null;
41 return true;
42 }
43
44 public function write($id_de_sesion, $datos_de_sesion)
45 {
46 $ultimo_acceso = time();
47 $sentencia = $this->base_de_datos->prepare("REPLACE INTO sesiones (id, datos, ultimo_acceso) VALUES (?, ?, ?);");
48 return $sentencia->execute([$id_de_sesion, $datos_de_sesion, $ultimo_acceso]);
49 }
50
51 public function read($id_de_sesion)
52 {
53 $sentencia = $this->base_de_datos->prepare("SELECT datos FROM sesiones WHERE id = ?;");
54 $sentencia->execute([$id_de_sesion]);
55 # Recuperar como objeto (con PDO::FETCH_OBJ), para acceder a $fila->datos
56 $fila = $sentencia->fetch(PDO::FETCH_OBJ);
57
58 # Si no existen datos con ese id, fetch devuelve FALSE
59 if ($fila === false) {
60 return ""; # Cadena vacÃa
61 } else {
62 return $fila->datos;
63 }
64 }
65
66 public function destroy($id_de_sesion)
67 {
68 $sentencia = $this->base_de_datos->prepare("DELETE FROM sesiones WHERE id = ?;");
69 return $sentencia->execute([$id_de_sesion]);
70 }
71
72 public function gc($tiempo_de_vida)
73 {
74 #Calculamos el tiempo actual menos el tiempo de vida.
75 $caducidad = time() - $tiempo_de_vida;
76
77 $sentencia = $this->base_de_datos->prepare("DELETE FROM sesiones WHERE ultimo_acceso < ?;");
78 return $sentencia->execute([$caducidad]);
79 }
80
81}