.::: 一路问情 :::.
  • 注册
  • 登录
  • 会员
  • FTP资源中心
  • 七海争霸
  • 社区设施
  • 帮助
.::: 一路问情 :::. » 『建站技术』 » 将SESSION存入数据库类
‹‹ 上一主题 | 下一主题 ››
发新话题
  • 发新话题
  • 发布投票
  • 发布商品
  • 发布悬赏
  • 发布活动
  • 发布辩论
  • 发布视频
打印

[技术] 将SESSION存入数据库类

ivanisme
看贴不回的后果

初级会员

帖子
83 
威望
30 点 
金钱
201 元 
好评
0 点 
  • 个人空间
  • 发短消息
  • 加为好友
  • 当前离线
1楼 大 中 小 发表于 2008-2-26 09:22  只看该作者

将SESSION存入数据库类

这个SESSION类, 是以ADODB 来操作数据库的.


SESSION,经常用在后台验证,  PHP默认是存在文件里的. 但最好存到数据库中,
这样可以解决如: 1 跨站访问   2 一个帐号同一时间只能由一人登陆 3 可很方便统计在线人数

现在就开工了.

首先 你得将php.ini  
session.save_handler = files  改成 session.save_handler = user   指示服务器将SESSION数据存在数据库中.
如果你是虚拟空间的话, 就没有设置权限了, 可以在PHP文件中用如下语句修改:
复制内容到剪贴板
代码:

ini_set('session.save_handler', 'user');
第二步:session表 表结构如下:
复制内容到剪贴板
代码:

CREATE TABLE `system_session` (
  `s_id` varchar(255) NOT NULL default '',
  `s_expire` int(10) unsigned NOT NULL default '0',
  `user_id` int(10) unsigned NOT NULL default '0',
  `user_ip` varchar(15) NOT NULL default '',
  `user_act` varchar(20) NOT NULL default '',
  `user_code` varchar(20) NOT NULL default '',
  `s_data` mediumtext NOT NULL,
  PRIMARY KEY  (`s_id`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk;
s_id  session_id
s_expire session到期时间
s_data session 的内容
以下是我在网站中自定义的数据
user_id
user_ip
.......

第三步:实现功能
.........
新建一个test.php 文件 输入如下代码:
主要是:
1 实例化ADODB数据库类,
2 实例化sessionDb类
下面的代码新手应该也看得懂.就是得到一个ADODB的实例
复制内容到剪贴板
代码:

//数据库
$C_DB = array();
$C_DB['type'] = "mysql";
$C_DB['host'] = "localhost";
$C_DB['user'] = "root";
$C_DB['password'] = "";
$C_DB['dbname'] = "test";


//数据库类(adodb)
require_once($C_DIR['lib']."adodb/adodb.inc.php");
//连数据库
$CONN = &ADONewConnection($C_DB['type']);
$CONN->Debug = $C_DB['debug'];
if( !$CONN->Connect($C_DB['host'],$C_DB['user'],$C_DB['password'],$C_DB['dbname']) )
{
die("连接不上数据库");
}
$CONN->SetFetchMode(ADODB_FETCH_ASSOC);
$CONN->Execute("SET NAMES gbk");


//建session
//指示 将SESSION存入数据库
ini_set('session.save_handler', 'user');
//实例化SESSION类
require_once($C_DIR['func']."session.php");
/*
array(
'conn' => adodb连接类实例
'table' => session 存在哪个表里
);
*/
new sessionDb(array(
'conn' => $CONN,
'table' => 'system_session'
));
sessionDb 类 如下:
复制内容到剪贴板
代码:
class sessionDb
{
//ADODB数据连接
var $conn;
//要操作的表
var $table = 'system_session';
//关键字
var $primaryKey = 's_id';
//session数据
var $data;
//
function sessionDb($config)
{
$this->__construct($config);
}
function __construct($config)
{
$this->init($config);
session_set_save_handler(array(&$this, 'cOpen'),
array(&$this, 'cClose'),
array(&$this, 'cRead'),
array(&$this, 'cWrite'),
array(&$this, 'cDestroy'),
array(&$this, 'cGc'));
session_name('test');
session_cache_limiter('private, must-revalidate');
session_start();
}
function init($config)
{
foreach ((array)$config as $k => $v)
{
if (!$v)
{
continue;
}
$this->$k = $v;
}
$this->config = $config;
return true;
}

function cOpen($save_path,$s_id)
{
return true;
}
function cClose()
{
return true;
}
function cRead($s_id)
{
$now_time = time();

$sql = "SELECT s_data FROM {$this->table} WHERE {$this->primaryKey}='$s_id' AND s_expire>$now_time";
$rs = $this->conn->Execute($sql);

if(!$rs || $rs->EOF)
{
return "";
}
else
{
return $rs->fields['s_data'];
}
return "";
}
function cWrite($s_id,$s_data)
{
$rec = $this->getData($s_id, $s_data);
$sql = "SELECT {$this->primaryKey} FROM {$this->table} WHERE {$this->primaryKey}='$s_id'";
$rs = $this->conn->Execute($sql);

if(!$rs || $rs->EOF)
{
$rec[$this->primaryKey] = $s_id;
$this->conn->AutoExecute("{$this->table}",$rec,"INSERT");
if($this->conn->Affected_Rows())
{
return true;
}
}
else
{
$this->conn->AutoExecute("{$this->table}",$rec,"UPDATE","{$this->primaryKey}='$s_id'");
if($this->conn->Affected_Rows())
{
return true;
}
}
return false;
}
function cDestroy($s_id)
{
$sql = "DELETE FROM {$this->table} WHERE {$this->primaryKey}='$s_id'";
$this->conn->Execute($sql);
if($this->conn->Affected_Rows())
{
return true;
}
return false;
}
function cGc($life_time)
{
$now_time = time();
$sql = "DELETE FROM {$this->table} WHERE s_expire < $now_time";
$this->conn->Execute($sql);
return intval($this->conn->Affected_Rows());
}

//写入session的数据,可根据需要修改
function getData($s_id, $s_data)
{
global $C_SYS;
//$this->conn = getConn();
$C_SYS['login_expire'] = !intval($C_SYS['login_expire']) ? 30 : $C_SYS['login_expire'];
$expire = time() + $C_SYS['login_expire'] * 60;

$rec = array();
//session的有效期
$rec['s_expire'] = $expire;
//session 数据
$rec['s_data'] = $s_data;
//其它自定义数据
$rec['user_id'] = isset($GLOBALS['U_ENV']['user_id']) ? $GLOBALS['U_ENV']['user_id'] : '';
$rec['user_ip'] = isset($GLOBALS['U_ENV']['ip']) ? $GLOBALS['U_ENV']['ip'] : '';
$rec['user_act'] = isset($GLOBALS['ACT']) ? $GLOBALS['ACT'] : '';
$rec['user_code'] = isset($GLOBALS['CODE']) ? $GLOBALS['CODE'] : '';

return $rec;
}
}
刷新http://localhost/ test.php  现在到表里看看, 是不是多了一个数据??



QQ
UID
73836 
精华
0 
积分
30 
钻石
0 克拉 
宣传
0 点 
来路
搜索引擎 
阅读权限
10 
来自
上海 
在线时间
0 小时 
注册时间
2008-2-25 
最后登录
2008-2-26 

查看详细资料

TOP

‹‹ 上一主题 | 下一主题 ››
发新话题
 

 

当前时区 GMT+8, 现在时间是 2008-7-7 05:30 蜀ICP备08000616号

清除 Cookies - 联系我们 - Ask Love - Archiver - WAP - TOP

Powered by Discuz! 6.0.0 []

Processed in 0.027017 second(s), 5 queries, Gzip enabled.

  • 控制面板首页
  • 编辑个人资料
  • 积分交易
  • 积分记录
  • 公众用户组
  • 个人空间管理
  • 资源中心
  • 名人堂
  • 社区银行
  • 醒目高亮
  • 勋章中心
  • 空间互踩
  • 便民查询
  • 邮箱图标
一路问情友情提示你:单帖回复不可以三帖连续哦!