在数据库中保存会话session

<?php
/**
*数据库高级概念--在数据库中保存session;
*db_session.inc.php
*/
$sdbc=NULL;//变量$sdbc将保存数据库连接,在此对其进行初始化,然后在每个函数里让它成为全局变量。
//定义打开会话的函数,作用在于建立一个数据库连接。
function open_session(){
    global $sdbc;
    $sdbc=mysqli_connect('localhost','root','LUANtao','test') OR die('Cannot connect to the database.');
    return true;
}
//定义关闭会话的函数,它将关闭数据库连接,返回操作成功的状态。
function close_session(){
    global $sdbc;
    return mysqli_close($sdbc);
}
//定义读取会话数据的函数,接受一个会话ID并检索其数据并返回。
function read_session($sid){
    global $sdbc;
    //格式化字符串,并使用mysqli_real_escape_string()来保证其安全。
    $q=sprintf('select data from sessions where id="%s"',mysqli_real_escape_string($sdbc,$sid));
    $r=mysqli_query($sdbc,$q);
    if(mysqli_num_rows($r)==1){
        list($data)=mysqli_fetch_array($r,MYSQLI_NUM);
        return $data;
    }else{
        return '';
    }
}
//定义向数据库写入数据函数,接收会话ID和会话数据
function write_session($sid,$data){
    global $sdbc;
    $q=sprintf('replace into sessions (id,data) values ("%s","%s")',mysqli_real_escape_string($sdbc,$sid),mysqli_real_escape_string($sdbc,$data));
    //在数据库中首次插入数据要用insert语句,之后要使用update语句。使用replace可以得到相同的结果。
    $r=mysql_query($sdbc, $q);
    return  mysqli_affected_rows($sdbc);
}
//创建销毁会话的函数,接收一个会话ID,通常发生在session_destory()函数被调用时使用。
function  destroy_session($sid){
    global $sdbc;
    $q=sprintf('delete from sessions where id="%s"', mysqli_real_escape_string($sdbc,$sid));
    $r=mysqli_query($sdbc,$q);
    $_SESSION=array();//清除数组$_SESSION
    return mysqli_affected_rows($sdbc);
}
//定义来收集函数,大多数程序员不会考虑的事情,其原因是PHP会自动删除旧的会话。
//它接收一个以秒为单位的时间,用以接收什么事‘旧’的会话。删除超过指定时间没有被访问的会话。
function clean_session($expire){
    global $sdbc;
    $q=sprintf('delete from sessions where date_add(last_accessed,interval %d second)<now()',(int)$expire);
    $r=mysqli_query($sdbc,$q);
    return mysqli_affected_rows($sdbc);
}
//告诉PHP使用会话处理函数
//在PHP设置里session.auto_start的值是On(表示每个页面会自动启动会话),就不能使用函数session_set_save_handler()。
session_set_save_handler('open_session', 'close_session', 'read_session', 'write_session','destroy_session', 'clean_session');
//启动会话。
session_start();
//session_set_save_handler()并不启动会话,需要调用session_start()。
//必须以上述次序使用函数。如果颠倒,脚本中定义的处理函数会被忽略掉。
//在所有输出被发送到web浏览器后,"写入"会话才会被调用,之后,“关闭“才会被调用
?>
<?php
/* 
 * 数据库高级概念--在数据库中保存session;
*index.php
 */
//session_start()函数位于db_session.inc.php里,它必须在任何内容被发送到浏览器前调用,所以这个文件必须包含在任何HTML之前。
require_once 'db_session.inc.php';
//给空会话保存些数据
if(empty ($_SESSION)){
    $_SESSION['blah']='nmlaut';
    $_SESSION['this']='3615684.45';
    $_SESSION['that']='blue';
    echo'<p>Session Data Stored.</p>';
}else{
    echo '<p>Session Data Exits:<pre>'.print_r($_SESSION,1).'</pre></p>';
}
//创建注销功能
if(isset($_GET['logout'])){
    session_destroy();
    echo '<p>Session destoryed.</p>';
}else{
    echo '<a href="index.php?logout=ture">Log Out</a>';
}
//显示会话数据
echo '<p>Session Data:<pre>'.print_r($_SESSION,1).'</pre></p>';
session_write_close();
?>
 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值