使用 PDO 方式将 Session 保存到 MySQL 数据中

本文介绍了一种使用 PHP 实现将 Session 数据保存到 MySQL 数据库的方法。通过自定义类实现 SessionHandlerInterface 接口,可以高效地管理和操作 Session 数据。文章提供了完整的代码示例,包括连接数据库、创建表结构、读写 Session 数据等关键步骤。

类:

<?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 

转载于:https://www.cnblogs.com/dee0912/p/5399812.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值