sql建立到mysql的会话_如何在数据库中保存会话session

1、创建会话表

在数据库上创建简单的sessions表,

CREATE TABLE sessions(

id CHAR(32) NOT NULL,

data TEXT,

last_accessed TIMESTAMP NOT NULL,

PRIMARY KEY(id)

);

2、定义会话函数,让PHP来使用这些函数

通过调用session_set_save_handler()函数来完成。调用它需要6个参数,每个参数都是一个函数名,见表:

次序

函数被调用的时机

1

启动会话

2

关闭会话

3

读取会话数据

4

写入会话数据

5

销毁会话数据

6

旧的会话数据应该被删除(执行垃圾收集程序)

现在先根据需要建立这6个函数:

/*

*打开会话的函数

*/

public function open_session(){

global $sdbc;

$sdbc = mysqli_connect('localhost','root','','test',3306);

if($sdbc == false)

return false;

return true;

}

/*

*关闭会话函数

*/

public function close_session(){

global $sdbc;

return mysqli_close($sdbc);

}

/*

*读取会话数据的函数

*/

public function read_session($sid){

global $sdbc;

//query the database

$sql = sprintf('SELECT sid FROM mb_sessions WHERE sid = "%s"',mysqli_real_escape_string($sdbc,$sid));

$result = mysqli_query($sdbc,$sql);

if(mysqli_num_rows($result) == 1){

list($data) = mysqli_fetch_array($result,MYSQL_NUM);

return $data;

}else{

return '';

}

}

/*

*向数据库写入数据的函数

*$sid 会话ID

*$data 会话数据,是数组$_SESSION序列化的结果

*/

public function write_session($sid,$data){

global $sdbc;

$sql = sprintf('REPLACE INTO mb_sessions (sid,data) VALUES ("%s","%s")',mysqli_real_escape_string($sdbc,$sid),

mysqli_real_escape_string($sdbc,$data));

$result = mysqli_query($sdbc,$sql);

if(mysqli_num_rows($result) >0)

return true;

else

return false;

}

/*

*销毁会话数据的函数

*/

public function destory_session($sid){

global $sdbc;

$sql = sprintf('DELETE FROM mb_sessions WHERE sid = "%s"',mysqli_real_escape_string($sdbc,$sid));

if(mysqli_num_rows(mysqli_query($sdbc,$sql)) > 0)

return true;

else

return false;

}

/*

*垃圾回收函数

*/

public function clean_session($expire){

global $sdbc;

$q = sprintf('DELETE FROM mb_sessions WHERE DATE_ADD(last_accessed,INTERVAL %d SECOND) < NOW()',(int)$expire);

$r = mysqli_query($sdbc,$q);

return true;

}

使用会话处理函数:

session_set_save_handler('open_session','close_session','read_session','write_session','destroy_session','clean_session');

再启动会话,注意这两者的顺序不能调换!

session_start();

文件保存为db_session.inc.php。

这里,需要注意以下几点:

session_set_save_handler并不会启动会话,我们还需要调用session_start()来启动。如果session_start()在之前执行,脚本中定义的处理函数就会被忽略而得不到执行。

每次到新的页面可以先通过调用require_once(' db_session.inc.php '),从而简化步骤

如果在PHP设置里session.auto_start = 1(意味着每个页面将会自动启动会话),就不能使用函数session_set_save_handler()。

在脚本运行结束之后,数据库连接是自动关闭的,然后会话函数会尝试向数据库写入数据并关闭连接,这样就会导致产生一系列莫名其妙的问题。为了避免这些问题,我们应该在脚本执行结束之前调用session_write_close()函数,他会调用“写入”和“关闭”函数,而这时数据库连接还是存在的。

在使用header()函数重定向浏览器之前也应该调用session_write_close()函数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值