使用 PDO 方式将 Session 保存到 MySQL 数据中
2023-09-11 14:17:02 时间
类:
<?php /* 使用数据库保存session */ class DBHandler implements SessionHandlerInterface { protected $dbh; public function open($save_path, $name) { try { $this->connect($save_path, $name); return true; } catch(PDOException $e) { echo $e->getMessage(); return false; } } public function close() { return true; } public function destroy($session_id) { $sth = $this->dbh->prepare("DELETE FROM sessions WHERE session_id = ?"); $sth->execute(array($session_id)); return true; } public function gc($maxlifetime) { $sth = $this->dbh->prepare("DELETE FROM sessions WHERE last_update < ?"); $sth->execute(array(time() - $maxlifetime)); return true; } public function read($session_id) { $sth = $this->dbh->prepare("SELECT session_data FROM sessions WHERE session_id = ?"); $sth->execute(array($session_id)); $row = $sth->fetch(PDO::FETCH_NUM); if(count($row) == 0) { return ''; } else { return $row[0]; } } public function write($session_id, $session_data) { date_default_timezone_set('PRC'); $now = time(); $sth = $this->dbh->prepare("UPDATE sessions SET session_data = ?, last_update = ? WHERE session_id = ?"); $sth->execute(array($session_data, $now, $session_id)); if($sth->rowCount() == 0) { $sth2 = $this->dbh->prepare("INSERT INTO sessions (session_id, session_data, last_update) VALUES (?,?,?)"); $sth2->execute(array($session_id, $session_data, $now)); } } public function createTable($save_path, $name, $connect = true) { if($connect) { $this->connect($save_path, $name); } $sql =<<<_SQL_ CREATE TABLE sessions ( session_id VARCHAR(64) NOT NULL, session_data MEDIUMTEXT NOT NULL, last_update INT NOT NULL, PRIMARY KEY (session_id) ) _SQL_; $this->dbh->exec($sql); } public function connect($save_path) { $parts = parse_url($save_path); parse_str($parts['query'], $query); //$dsn格式:mysql:host=localhost;dbname=test $dsn = $parts['scheme'].":host=".$parts['host'].";dbname=".$query['dbname']; $user = $query['user']; $password = $query['password']; $this->dbh = new PDO($dsn, $user, $password); $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); try { $this->dbh->query('SELECT 1 FROM sessions LIMIT 1'); } catch(Exception $e) { $this->createTable($save_path, NULL, false); } } }
使用:
<?php include './db.php'; ini_set('session.save_path', "mysql://localhost?user=root&password=&dbname=test"); ini_set('session.gc_maxlifetime', 5); ini_set('session.gc_divisor', 2); session_set_save_handler(new DBHandler); session_start(); if(! isset($_SESSION['visits'])) { $_SESSION['visits'] = 0; } $_SESSION['visits']++; echo '你是第 '.$_SESSION['visits'].' 次访问';
参考:
<PHP Cookbook>3'rd
相关文章
- Sqoop-将Hive ORC表导出到MySQL(全量、更新)
- MySQL: built-in function
- MYSQL入门与进阶(完结)
- MySQL第九讲 MySQL集群主从搭建指定数据库同步数据
- 掘地三尺搞定 Redis 与 MySQL 数据一致性问题
- MySQL事务的隔离级别以及脏读、幻读和不可重复读
- 【MySQL进阶-07】深入理解mysql性能优化以及解决慢查询问题
- mysql查询一周一个月一年三个月的数据
- mysql中Group By 分析
- 通过Navicat for MySQL远程连接的时候报错mysql 1130的解决方法
- 基于Java+MySQL实现(Web)火车售票系统【100010413】
- mac ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
- 如何在 MySQL 中使用 JSON 数据,在 MySQL 中学习“NoSQL”
- 记录一次mysql使用load into命令导入csv格式数据的过程
- mysql远程连接 Host is not allowed to connect to this MySQL server
- mysql导出数据报错The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
- (1.13)mysql优化数据库对象
- Mysql 拼接 json
- Mysql清空表(truncate)与删除表中数据(delete)的区别
- [Mysql] 删除数据