将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 现在到表里看看, 是不是多了一个数据??