类:

  1. <?php
  2.  
  3. /* 使用数据库保存session */
  4.  
  5. class DBHandler implements SessionHandlerInterface {
  6.  
  7. protected $dbh;
  8.  
  9. public function open($save_path, $name) {
  10. try {
  11. $this->connect($save_path, $name);
  12. return true;
  13. } catch(PDOException $e) {
  14. echo $e->getMessage();
  15. return false;
  16. }
  17. }
  18.  
  19. public function close() {
  20. return true;
  21. }
  22.  
  23. public function destroy($session_id) {
  24. $sth = $this->dbh->prepare("DELETE FROM sessions WHERE session_id = ?");
  25. $sth->execute(array($session_id));
  26. return true;
  27. }
  28.  
  29. public function gc($maxlifetime) {
  30. $sth = $this->dbh->prepare("DELETE FROM sessions WHERE last_update < ?");
  31. $sth->execute(array(time() - $maxlifetime));
  32. return true;
  33. }
  34.  
  35. public function read($session_id) {
  36. $sth = $this->dbh->prepare("SELECT session_data FROM sessions WHERE session_id = ?");
  37. $sth->execute(array($session_id));
  38. $row = $sth->fetch(PDO::FETCH_NUM);
  39. if(count($row) == 0) {
  40. return '';
  41. } else {
  42. return $row[0];
  43. }
  44. }
  45.  
  46. public function write($session_id, $session_data) {
  47. date_default_timezone_set('PRC');
  48. $now = time();
  49. $sth = $this->dbh->prepare("UPDATE sessions SET session_data = ?,
  50. last_update = ? WHERE session_id = ?");
  51. $sth->execute(array($session_data, $now, $session_id));
  52. if($sth->rowCount() == 0) {
  53. $sth2 = $this->dbh->prepare("INSERT INTO sessions (session_id, session_data, last_update) VALUES (?,?,?)");
  54. $sth2->execute(array($session_id, $session_data, $now));
  55. }
  56. }
  57.  
  58. public function createTable($save_path, $name, $connect = true) {
  59. if($connect) {
  60. $this->connect($save_path, $name);
  61. }
  62. $sql =<<<_SQL_
  63. CREATE TABLE sessions (
  64. session_id VARCHAR(64) NOT NULL,
  65. session_data MEDIUMTEXT NOT NULL,
  66. last_update INT NOT NULL,
  67. PRIMARY KEY (session_id)
  68. )
  69. _SQL_;
  70. $this->dbh->exec($sql);
  71. }
  72.  
  73. public function connect($save_path) {
  74. $parts = parse_url($save_path);
  75. parse_str($parts['query'], $query);
  76.  
  77. //$dsn格式:mysql:host=localhost;dbname=test
  78. $dsn = $parts['scheme'].":host=".$parts['host'].";dbname=".$query['dbname'];
  79. $user = $query['user'];
  80. $password = $query['password'];
  81.  
  82. $this->dbh = new PDO($dsn, $user, $password);
  83. $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  84.  
  85. try {
  86. $this->dbh->query('SELECT 1 FROM sessions LIMIT 1');
  87. } catch(Exception $e) {
  88. $this->createTable($save_path, NULL, false);
  89. }
  90. }
  91. }

  

使用:

  1. <?php
  2.  
  3. include './db.php';
  4.  
  5. ini_set('session.save_path', "mysql://localhost?user=root&password=&dbname=test");
  6. ini_set('session.gc_maxlifetime', 5);
  7. ini_set('session.gc_divisor', 2);
  8. session_set_save_handler(new DBHandler);
  9.  
  10. session_start();
  11.  
  12. if(! isset($_SESSION['visits'])) {
  13. $_SESSION['visits'] = 0;
  14. }
  15.  
  16. $_SESSION['visits']++;
  17. 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. java环境配置为1.7jdk为什么cmd java -version查看版本是1.8

    记录一个小问题: 初始安装的是jdk1.8,后来项目需要要更换成jdk1.7, 因此将环境变量更改为jdk7的目录路径, 但是在cmd命令行运行java -version 发现还是jdk8 解决方法: ...

  2. BZOJ 4576: [Usaco2016 Open]262144

    Description 一个序列,每次可以将两个相同的数合成一个数,价值+1,求最后最大价值 \(n \leqslant 262144\) Sol DP. 这道题是 BZOJ 4580: [Usaco ...

  3. day1

    day1.py ][][: ][: ): : ]['lock'] = 0 json.dump(userlist_message, open(userlist, 'w')) break #输错次数到3次 ...

  4. C/C++ 中判断某一文件或目录是否存在

    方法一:C++中比较简单的一种办法(使用文件流打开文件) #include <iostream> #include <fstream> using namespace std; ...

  5. ajax返回数据类型为JSON数据的处理

    JSON数据处理: 1.编码格式必须为utf8 2.echo json_encode($db->GuanQuery($sql));   返回的是关联数组.json_encode返回的是json数 ...

  6. Mysql 服务无法启动 1067

    检查my.ini中的

  7. 在hive中遇到的错误

    1:如果在将文件导入到hive表时,查询结果为null(下图) 这个是因为在创建表的时候没有指定列分隔符,hive的默认分隔符是ctrl+a(/u0001)   2.当我复制好几行sql到hive命令 ...

  8. PHP日期与时间

    时间戳是自 1970 年 1 月 1 日(00:00:00 GMT)以来的秒数.它也被称为 Unix 时间戳(Unix Timestamp).Unix时间戳(Unix timestamp),或称Uni ...

  9. ubuntu下配置jdk

    1.首先下载jdk-7u51-linux-i586.tar.gz.并将它放在例如/home目录. 2.解压安装 sudo tar zxvf ./jdk-7u51-linux-i586.tar.gz  ...

  10. phonegap之android原生日历调用

    android日历调用首先第一步我们要添加权限 <uses-permission android:name="android.permission.READ_CALENDAR" ...