Pro ukládání sessions do databáze existuje řada důvodů. Můžete chtít například využívat stejná sessions napříč weby, můžete mít zájem na marketingovém vyhodnocování obsahu dočasně vkládaných dat anebo chcete obejít záludnosti sdílených sessions na hostingu, kde nemáte přístup k php.ini a potřebujete například prodloužit dobu trvání sessions. Nejjednodušší je vytvořit custom handler a ukládat data do databáze.
Kouzlo s ukládáním sessions pomůže dovršit výše uvedená php funkce ve spolupráci s uživatelskými obslužnými funkcemi pro zápis, čtení a čištění úložiště (garbage collector).
1 2 3 4 5 6 |
require("classes/class.custom_sessions.php"); $ses_class = new session(); session_set_save_handler(array(&$ses_class, '_open'), array(&$ses_class, '_close'), array(&$ses_class, '_read'), array(&$ses_class, '_write'), array(&$ses_class, '_destroy'), array(&$ses_class, '_gc')); session_start(); //dále se pracuje s proměnnými $_SESSION['xyz'] stejně jako při použití výchozího ukládání do sdílené složky |
1 2 3 4 5 6 7 |
CREATE TABLE IF NOT EXISTS `sessions` ( `ses_id` varchar(64) NOT NULL, `ses_time` varchar(32) NOT NULL, `ses_start` varchar(32) NOT NULL, `ses_value` text NOT NULL, PRIMARY KEY (`ses_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
<?php class session { var $ses_table = "sessions"; var $mysqli_connect = null; function db_connect() { global $dbserver, $dbuser, $dbpass, $dbname; $this->mysqli_connect = mysqli_connect($dbserver, $dbuser, $dbpass, $dbname); mysqli_query($mysqli_connect, "SET NAMES utf8"); if (!$mysqli_connect) { return FALSE; } else { return TRUE; } } function _open($path, $name) { $this->db_connect(); return TRUE; } function _close() { if($this->mysqli_connect !== null) mysqli_close($this->mysqli_connect); return TRUE; } function _read($ses_id) { $sql = "SELECT * FROM " . $this->ses_table . " WHERE ses_id = '$ses_id'"; $result = mysqli_query($this->mysqli_connect, $sql); if (!$result) { return ''; } $num = mysqli_num_rows ($result); if ($num > 0) { $row = mysqli_fetch_assoc($result); $data = $row["ses_value"]; return $data; } else { return ''; } } function _write($ses_id, $data) { $sql = "UPDATE " . $this->ses_table . " SET ses_time = UNIX_TIMESTAMP(NOW()), ses_value='$data' WHERE ses_id='$ses_id'"; $result = mysqli_query($this->mysqli_connect, $sql); if (!$result) { return FALSE; } if (mysqli_affected_rows()) { return TRUE; } $sql = "INSERT INTO " . $this->ses_table . " (ses_id, ses_time, ses_start, ses_value) VALUES ('$ses_id', UNIX_TIMESTAMP(NOW()), UNIX_TIMESTAMP(NOW()), '$data')"; $result = mysqli_query($this->mysqli_connect, $sql); $match = "#^Duplicate entry '$ses_id' for key \d+$#"; if (!$result && !preg_match($match,mysqli_error())) { return FALSE; } else { return TRUE; } } function _destroy($ses_id) { $sql = "DELETE FROM " . $this->ses_table . " WHERE ses_id = '$ses_id'"; $result = mysqli_query($this->mysqli_connect, $sql); if (!$result) { return FALSE; } else { return TRUE; } } function _gc($life) { $life = 9000; $sql = "DELETE FROM " . $this->ses_table . " WHERE ses_time < UNIX_TIMESTAMP(NOW() - $life)"; $result = mysqli_query($this->mysqli_connect, $sql); if (!$result) { return FALSE; } else { return TRUE; } } } ?> |