将SESSION存入数据库类 ---我的第一个原创贴
时间:2007-12-29
来源:互联网
主要写给像我这样的新手看的,高手就当温习吧.哈哈
----------------------------------------------------------------------------------------------------------------------
这个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');
代码:
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_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'
));
代码:
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;
}
}
----------------------------------------------
不回贴,没关系, 只希望对你有用 下面的原代码是没有ADODB类的, test.php 文件要做小小的修改的,如MYSQL的连接参数, 等...

[ 本帖最后由 kupe 于 2007-12-28 16:20 编辑 ]
作者: kupe 发布时间: 2007-12-28

作者: cld007 发布时间: 2007-12-28

努力
作者: 逆雪寒 发布时间: 2007-12-28
顶了-_-
作者: MoHock 发布时间: 2007-12-28
引用:
原帖由 MoHock 于 2007-12-28 16:37 发表Session 我一向不支持....
顶了-_-
除了SESSION,还可用什么呢? COOKIE肯定不是吧
谢谢....


作者: kupe 发布时间: 2007-12-28
作者: eisdl 发布时间: 2007-12-29
引用:
原帖由 kupe 于 2007-12-28 16:51 发表不知道 MoHock 用什么来做后台验证???
除了SESSION,还可用什么呢? COOKIE肯定不是吧
谢谢....


作者: eisdl 发布时间: 2007-12-29

作者: luzhou 发布时间: 2007-12-29
引用:
原帖由 eisdl 于 2007-12-29 02:11 发表可以用数据库模拟session功能
作者: kupe 发布时间: 2007-12-29
引用:
原帖由 kupe 于 2007-12-29 10:02 发表听起来很不错, 我想这样会更安全, 不知道有没有示例供偶学习一下啊....
写几个函数模拟session的注册和删除 然后就是对数据库的操作了
作者: eisdl 发布时间: 2007-12-29

作者: btsam 发布时间: 2008-01-19
作者: learsu 发布时间: 2008-02-28
作者: htc10 发布时间: 2008-02-28


作者: ct_174880859 发布时间: 2008-02-28
作者: kinganeng 发布时间: 2008-03-13

作者: zenght 发布时间: 2008-03-15
PHP代码:
session_set_save_handler('fw_session_open', 'fw_session_close', 'fw_session_read', 'fw_session_write', 'fw_session_destroy', 'fw_session_gc');PHP代码:
<?php
/**
* 会话引擎
*
* Copyright(c) 2005 by 陈毅鑫(深空). All rights reserved
*
* To contact the author write to {@link mailto:[email protected]}
*
* @author 陈毅鑫(深空)
* @version $Id: session.func.php,v 1.9 2006/08/03 04:58:59 shenkong Exp $
* @package 公共组件
*/
function fw_session_open($save_path, $session_name) {
return true;
}
function fw_session_close() {
return true;
}
function fw_session_read($session_id) {
global $db;
try {
$sql = 'SELECT session_data FROM ' . DB_PREFIX . "session WHERE session_id = '{$session_id}'";
$rs = $db['common']->getOne($sql);
if ($rs) {
return $rs;
} else {
return '';
}
} catch (DB_Exception $e) {
msg('会话读取错误:' . $e->getMessage());
}
}
function fw_session_write($session_id, $data) {
global $db;
try {
$data = $db['common']->escape($data);
$sql = 'SELECT life_time FROM ' . DB_PREFIX . "session WHERE session_id = '{$session_id}'";
$life_time = $db['common']->getOne($sql);
$url = getURL();
$url = $db['common']->escape($url);
$referer = $db['common']->escape($_SERVER['HTTP_REFERER']);
$ip = $db['common']->escape(getIP());
if ($life_time) {
$sql = 'UPDATE ' . DB_PREFIX . "session SET last_update = " . TIME . ", life_time = '{$life_time}', session_data = '{$data}', visit_url = '{$url}', referer = '{$referer}', user_ip = '{$ip}' WHERE session_id = '{$session_id}'";
} else {
$sql = "REPLACE INTO " . DB_PREFIX . "session SET session_id = '{$session_id}', last_update = " . TIME . ", life_time = '{$life_time}', session_data = '{$data}', visit_url = '{$url}', referer = '{$referer}', user_ip = '{$ip}'";
}
$rs = $db['common']->update($sql);
} catch (DB_Exception $e) {
msg('会话写入错误:' . $e->getMessage());
}
}
function fw_session_destroy($session_id) {
global $db;
try {
$sql = 'DELETE FROM ' . DB_PREFIX . "session WHERE session_id = '{$session_id}'";
$db['common']->update($sql);
return true;
} catch (DB_Exception $e) {
msg('会话销毁错误:' . $e->getMessage());
}
}
function fw_session_gc() {
global $db;
try {
$sql = 'DELETE FROM ' . DB_PREFIX . 'session WHERE (' . TIME . ' - last_update) > (life_time + 900)';
$rs = $db['common']->update($sql);
return true;
} catch (DB_Exception $e) {
msg('会话回收错误:' . $e->getMessage());
}
}
?>
作者: 深空 发布时间: 2008-03-17
作者: chyoqin 发布时间: 2008-03-21
顶
作者: zhujbing 发布时间: 2008-03-22

作者: luzhou 发布时间: 2008-03-23
引用:
原帖由 htc10 于 2008-2-28 14:09 发表楼主是模仿cakephp写的吧

作者: kupe 发布时间: 2008-03-24

作者: richardhc 发布时间: 2008-03-24
作者: yiqing666 发布时间: 2008-03-24
支持多种想法
作者: ttapeng 发布时间: 2008-04-18
作者: sindtoto 发布时间: 2008-04-19
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28