+ -
当前位置:首页 → 问答吧 → 将SESSION存入数据库类 ---我的第一个原创贴

将SESSION存入数据库类 ---我的第一个原创贴

时间:2007-12-29

来源:互联网

从没在原创区发过帖子, 本人只有半年PHP开发经验, 如果有错的地方,很各位多指点,谢谢,
主要写给像我这样的新手看的,高手就当温习吧.哈哈
----------------------------------------------------------------------------------------------------------------------
这个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  现在到表里看看, 是不是多了一个数据??
----------------------------------------------
不回贴,没关系, 只希望对你有用 下面的原代码是没有ADODB类的, test.php 文件要做小小的修改的,如MYSQL的连接参数, 等...

session.rar (2.24 KB)
session.rar (2.24 KB)
没有ADODB类的原代码
下载次数: 363
2007-12-28 16:14


[ 本帖最后由 kupe 于 2007-12-28 16:20 编辑 ]

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

学习 学习

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

  不错.如果加多点注释讲解就好了

努力

作者: 逆雪寒   发布时间: 2007-12-28

Session 我一向不支持....
顶了-_-

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

引用:
原帖由 MoHock 于 2007-12-28 16:37 发表
Session 我一向不支持....
顶了-_-
不知道 MoHock   用什么来做后台验证???
除了SESSION,还可用什么呢?   COOKIE肯定不是吧

谢谢....

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

我的是用数据库模拟session 没有用到session

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

引用:
原帖由 kupe 于 2007-12-28 16:51 发表


不知道 MoHock   用什么来做后台验证???
除了SESSION,还可用什么呢?   COOKIE肯定不是吧

谢谢....
可以用数据库模拟session功能

作者: 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 发表


听起来很不错, 我想这样会更安全, 不知道有没有示例供偶学习一下啊....
用cookies和数据库就可以 检查用户cookies然后判断增加或删除

写几个函数模拟session的注册和删除 然后就是对数据库的操作了

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

好有想法的人

作者: btsam   发布时间: 2008-01-19

学习

作者: learsu   发布时间: 2008-02-28

楼主是模仿cakephp写的吧

作者: htc10   发布时间: 2008-02-28

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

精品,绝对支持!!!

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

负载啊负载

作者: zenght   发布时间: 2008-03-15

凑热闹跟一贴,
复制PHP内容到剪贴板
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代码:

<?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

对cookie+mysql仿SESSION很感兴趣,看过Ecshop中的session+cookie+mysql,不过不怎么明白他的session表有什么用. 请高手指点一下.

作者: chyoqin   发布时间: 2008-03-21

值得学习````

作者: zhujbing   发布时间: 2008-03-22

作者: luzhou   发布时间: 2008-03-23

引用:
原帖由 htc10 于 2008-2-28 14:09 发表
楼主是模仿cakephp写的吧
从没研究过cakephp,   我是看PHP手册+公司的实例 写的

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

谢谢啊!刚刚下来看了一下.

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

呵呵,又学了点东西!

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

鼓励原创精品
支持多种想法

作者: ttapeng   发布时间: 2008-04-18

直接把要传递的数据都放到数据库,用的时候再调出来,反复操作数据库的策略好吗?我还是支持SESSION。

作者: sindtoto   发布时间: 2008-04-19

热门下载

更多