类:

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

使用 PDO 方式将 Session 保存到 MySQL 数据中的更多相关文章

  1. 利用session_set_save_handler()函数将session保存到MySQL数据库中

    PHP保存session默认的是采用的文件的方式来保存的,这仅仅在文件的空间开销很小的windows上是可以采用的,但是如果我们采用uinx或者是liux上的文件系统的时候,这样的文件系统的文件空间开 ...

  2. node 爬虫 --- 将爬取到的数据,保存到 mysql 数据库中

    步骤一:安装必要模块 (1)cheerio模块 ,一个类似jQuery的选择器模块,分析HTML利器. (2)request模块,让http请求变的更加简单 (3)mysql模块,node连接mysq ...

  3. Python实现将图片以二进制格式保存到MySQL数据库中,以及取出:

    创建数据库表格式: CREATE TABLE photo ( photo_no int(6) unsigned NOT NULL auto_increment, image MEDIUMBLOB, P ...

  4. Asp.net Session 保存到MySql中

    一 网站项目引入"mysql.web.dll" 二 web.config配置中添加mysql数据库连接字符串 <connectionStrings> <remov ...

  5. Springboot 2.1.1.RELEASE 版本 session保存到MySQL里面

    1,pom.xml添加依赖: <!-- 数据库session管理 --> <dependency> <groupId>org.springframework.ses ...

  6. php 保存到mysql数据库中的中文乱码

    近期又php项目,乱码是个头痛的问题 解决方法: 1,php 文件中 添加 header(“Content-Type: text/html; charset=utf-8"); 2,需要做数据 ...

  7. PHP如何将session保存到memcached中?如何分布式保存PHP session

    session_set_save_handler无关的memcached保存session的方法 在memcached服务器上 1)下载memcached #wget http://memcached ...

  8. php将图片以二进制保存到mysql数据库并显示

    一.存储图片的数据表结构: -- -- 表的结构 `image` -- CREATE TABLE IF NOT EXISTS `image` ( `id` int(3) NOT NULL AUTO_I ...

  9. Python scrapy爬虫数据保存到MySQL数据库

    除将爬取到的信息写入文件中之外,程序也可通过修改 Pipeline 文件将数据保存到数据库中.为了使用数据库来保存爬取到的信息,在 MySQL 的 python 数据库中执行如下 SQL 语句来创建 ...

随机推荐

  1. Python简单源码解析

    主要为一些简单的源代码的解析以及一些方法的理解. 说明:这些文件都不是我写的,详情可参考Github上的内容. 批量修改文件类型 def batch_rename(work_dir, old_ext, ...

  2. js 时间构造函数

    js 时间构造函数,js中没有类似ToString("yyyy-mm-dd HH:mm:ss") 的方法,但是可以用下面的方式来初始化 var cdate = new Date(& ...

  3. ffmpeg-20160822-bin.7z

    ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 5 屏幕横向放大 20 像素 6 屏幕横向缩小 20 像素 S 下一帧 [ -2秒 ] +2 ...

  4. 单词(bzoj 3172)

    Description 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input 第一个一个整数N,表示有多少个单词,接下来N ...

  5. 使用MyBatis Generator自动创建代码( SSM框架)

    步骤: 1.找到该文件目录 (上图文件下载地址:http://download.csdn.net/download/u014617413/9668872) 2.修改generatorConfig.xm ...

  6. 去掉input框点击时的默认颜色

    1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 < ...

  7. Windows 8.1安装 Vmware10

    之前在windows 8上安装的Vmware 9.0,已经激活了用的蛮好,可是自从上次自动更新系统到windows 8.1后,启动虚拟机时提示要激活 使用各种激活码与注册机都无效,就算注册表信息丢失但 ...

  8. QQ列表展示

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  9. hdu分类 Math Theory(还有三题!)

    这个分类怎么觉得这么水呢.. 这个分类做到尾的模板集: //gcd int gcd(int a,int b){return b? gcd(b, a % b) : a;} //埃氏筛法 O(nlogn) ...

  10. 09 Request/Response

         Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象      request和response对象即然代表 ...