使用 PDO 方式将 Session 保存到 MySQL 数据中
类:
- <?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 数据中的更多相关文章
- 利用session_set_save_handler()函数将session保存到MySQL数据库中
PHP保存session默认的是采用的文件的方式来保存的,这仅仅在文件的空间开销很小的windows上是可以采用的,但是如果我们采用uinx或者是liux上的文件系统的时候,这样的文件系统的文件空间开 ...
- node 爬虫 --- 将爬取到的数据,保存到 mysql 数据库中
步骤一:安装必要模块 (1)cheerio模块 ,一个类似jQuery的选择器模块,分析HTML利器. (2)request模块,让http请求变的更加简单 (3)mysql模块,node连接mysq ...
- Python实现将图片以二进制格式保存到MySQL数据库中,以及取出:
创建数据库表格式: CREATE TABLE photo ( photo_no int(6) unsigned NOT NULL auto_increment, image MEDIUMBLOB, P ...
- Asp.net Session 保存到MySql中
一 网站项目引入"mysql.web.dll" 二 web.config配置中添加mysql数据库连接字符串 <connectionStrings> <remov ...
- Springboot 2.1.1.RELEASE 版本 session保存到MySQL里面
1,pom.xml添加依赖: <!-- 数据库session管理 --> <dependency> <groupId>org.springframework.ses ...
- php 保存到mysql数据库中的中文乱码
近期又php项目,乱码是个头痛的问题 解决方法: 1,php 文件中 添加 header(“Content-Type: text/html; charset=utf-8"); 2,需要做数据 ...
- PHP如何将session保存到memcached中?如何分布式保存PHP session
session_set_save_handler无关的memcached保存session的方法 在memcached服务器上 1)下载memcached #wget http://memcached ...
- php将图片以二进制保存到mysql数据库并显示
一.存储图片的数据表结构: -- -- 表的结构 `image` -- CREATE TABLE IF NOT EXISTS `image` ( `id` int(3) NOT NULL AUTO_I ...
- Python scrapy爬虫数据保存到MySQL数据库
除将爬取到的信息写入文件中之外,程序也可通过修改 Pipeline 文件将数据保存到数据库中.为了使用数据库来保存爬取到的信息,在 MySQL 的 python 数据库中执行如下 SQL 语句来创建 ...
随机推荐
- java环境配置为1.7jdk为什么cmd java -version查看版本是1.8
记录一个小问题: 初始安装的是jdk1.8,后来项目需要要更换成jdk1.7, 因此将环境变量更改为jdk7的目录路径, 但是在cmd命令行运行java -version 发现还是jdk8 解决方法: ...
- BZOJ 4576: [Usaco2016 Open]262144
Description 一个序列,每次可以将两个相同的数合成一个数,价值+1,求最后最大价值 \(n \leqslant 262144\) Sol DP. 这道题是 BZOJ 4580: [Usaco ...
- day1
day1.py ][][: ][: ): : ]['lock'] = 0 json.dump(userlist_message, open(userlist, 'w')) break #输错次数到3次 ...
- C/C++ 中判断某一文件或目录是否存在
方法一:C++中比较简单的一种办法(使用文件流打开文件) #include <iostream> #include <fstream> using namespace std; ...
- ajax返回数据类型为JSON数据的处理
JSON数据处理: 1.编码格式必须为utf8 2.echo json_encode($db->GuanQuery($sql)); 返回的是关联数组.json_encode返回的是json数 ...
- Mysql 服务无法启动 1067
检查my.ini中的
- 在hive中遇到的错误
1:如果在将文件导入到hive表时,查询结果为null(下图) 这个是因为在创建表的时候没有指定列分隔符,hive的默认分隔符是ctrl+a(/u0001) 2.当我复制好几行sql到hive命令 ...
- PHP日期与时间
时间戳是自 1970 年 1 月 1 日(00:00:00 GMT)以来的秒数.它也被称为 Unix 时间戳(Unix Timestamp).Unix时间戳(Unix timestamp),或称Uni ...
- ubuntu下配置jdk
1.首先下载jdk-7u51-linux-i586.tar.gz.并将它放在例如/home目录. 2.解压安装 sudo tar zxvf ./jdk-7u51-linux-i586.tar.gz ...
- phonegap之android原生日历调用
android日历调用首先第一步我们要添加权限 <uses-permission android:name="android.permission.READ_CALENDAR" ...