php保存session数据到mysql数据库

session_set_save_handler()方法的使用案例

sql语句如下 :

CREATE TABLE `session` (
  `id` int(11) unsigned zerofill NOT NULL AUTO_INCREMENT,
  `data` varchar(255) DEFAULT NULL,
  `lapse_time` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;

代码如下: 

<?php

/**
 * 参考: http://c.biancheng.net/view/8192.html
 * https://blog.csdn.net/zyddj123/article/details/78906530
 * 说明: 该函数的两个参数: (1) $savePath参数读取的是配置文件php.ini文件中的 
 * session.save_path="D:\xampp\tmp" 配置项或者通过ini_set()函数动态设置后的值; (2) $sessionName参数读取的是php.ini配置文件的 
 * session.name=PHPSESSID配置项或者通过ini_set()函数动态设置的后的值
 */
// 连接数据库
function sess_open($savePath, $sessionName)
{
	echo "sess_open()方法<br/>";
	global $link;
	$link = mysqli_connect('localhost', 'root', 'root') or die('数据库连接失败!');
	mysqli_select_db($link, 'test') or die('未找到该数据库!');
	return true;
}

// 关闭数据库连接
function sess_close()
{
	echo "sess_close()方法<br/>";
	global $link;
	mysqli_close($link);
	return true;
}

// 读取 Session 内容
function sess_read($sessionId)
{
	echo "sess_read()方法<br/>";
	global $link;
	$time = time();
	$sql = "SELECT data FROM session WHERE id = '$sessionId' AND lapse_time > '$time'";
	$result = mysqli_query($link, $sql);
	$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
	if ($row) {
//		return $row['data'];
		return serialize($row['data']);//坑!!!需要序列化
	} else {
		return serialize(false);//坑!!!需要序列化
	}
}


// 写入 Session
/**
 * 参数 $session_id 就是当前请求的所对应的session_id; 参数 $data 就是当前的session数据序列化 
 * 后的值
 */
function sess_write($sessionId, $data)
{
	echo "sess_write()方法<br/>";
	global $link;
	$lapse_time = time() + (60 * 60);
	$sql = "SELECT data FROM session WHERE id = '$sessionId'";
	$result = mysqli_query($link, $sql);
	if (mysqli_num_rows($result) == 0) {
		$ins_sql = "INSERT INTO session VALUES('$sessionId', '$data', '$lapse_time')";
		$res = mysqli_query($link, $ins_sql);
	} else {
		$up_sql = "UPDATE session SET data = '$data', lapse_time = '$lapse_time' WHERE id = '$sessionId'";
		$res = mysqli_query($link, $up_sql);
	}
	return $res;
}

// 删除 Session
function sess_destroy($sessionId)
{
	echo "sess_destroy()方法<br/>";
	global $link;
	$sql = "DELETE FROM session WHERE id = '$sessionId'";
	return mysqli_query($link, $sql);
}

// 清理失效的 Session
function sess_gc()
{
	echo "sess_gc()方法<br/>";
	global $link;
	$time = time();
	$sql = "DELETE FROM session WHERE lapse_time < '$time'";
	$res = mysqli_query($link, $sql);
	return $res;
}


//session_set_save_handler('sess_open', 'sess_close', 'sess_read', 'sess_write', 'sess_destroy', 'sess_gc');
//echo ini_get("session.save_handler") . PHP_EOL; // 返回 user
//die;

//**********************************************************************
//ini_set("session.save_handler", "user");//user代表自定义
session_set_save_handler('sess_open', 'sess_close', 'sess_read', 'sess_write', 'sess_destroy', 'sess_gc');
session_start();
$_SESSION['user'] = 'admin';

var_dump($_SESSION['user']);

浏览器访问结果如下:

 数据库数据如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值