Chinaunix首页 | 论坛 | 博客
  • 博客访问: 198517
  • 博文数量: 264
  • 博客积分: 6010
  • 博客等级: 准将
  • 技术积分: 2740
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-03 13:25
文章分类

全部博文(264)

文章存档

2011年(1)

2009年(263)

我的朋友

分类:

2009-06-03 16:12:58

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


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

现在就开工了.

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

  1. ini_set('session.save_handler', 'user');

第二步:session表 表结构如下:

  1. CREATE TABLE `system_session` (
  2.   `s_id` varchar(255) NOT NULL default '',
  3.   `s_expire` int(10) unsigned NOT NULL default '0',
  4.   `user_id` int(10) unsigned NOT NULL default '0',
  5.   `user_ip` varchar(15) NOT NULL default '',
  6.   `user_act` varchar(20) NOT NULL default '',
  7.   `user_code` varchar(20) NOT NULL default '',
  8.   `s_data` mediumtext NOT NULL,
  9.   PRIMARY KEY  (`s_id`)
  10. ) 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的实例

  1. //数据库
  2. $C_DB = array();
  3. $C_DB['type'] = "mysql";
  4. $C_DB['host'] = "localhost";
  5. $C_DB['user'] = "root";
  6. $C_DB['password'] = "";
  7. $C_DB['dbname'] = "test";


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


  19. //建session
  20. //指示 将SESSION存入数据库
  21. ini_set('session.save_handler', 'user');
  22. //实例化SESSION类
  23. require_once($C_DIR['func']."session.php");
  24. /*
  25. array(
  26. 'conn' => adodb连接类实例
  27. 'table' => session 存在哪个表里
  28. );
  29. */
  30. new sessionDb(array(
  31. 'conn' => $CONN,
  32. 'table' => 'system_session'
  33. ));

sessionDb 类 如下:
  1. class sessionDb
  2. {
  3. //ADODB数据连接
  4. var $conn;
  5. //要操作的表
  6. var $table = 'system_session';
  7. //关键字
  8. var $primaryKey = 's_id';
  9. //session数据
  10. var $data;
  11. //
  12. function sessionDb($config)
  13. {
  14. $this->__construct($config);
  15. }
  16. function __construct($config)
  17. {
  18. $this->init($config);
  19. session_set_save_handler(array(&$this, 'cOpen'),
  20. array(&$this, 'cClose'),
  21. array(&$this, 'cRead'),
  22. array(&$this, 'cWrite'),
  23. array(&$this, 'cDestroy'),
  24. array(&$this, 'cGc'));
  25. session_name('test');
  26. session_cache_limiter('private, must-revalidate');
  27. session_start();
  28. }
  29. function init($config)
  30. {
  31. foreach ((array)$config as $k => $v)
  32. {
  33. if (!$v)
  34. {
  35. continue;
  36. }
  37. $this->$k = $v;
  38. }
  39. $this->config = $config;
  40. return true;
  41. }

  42. function cOpen($save_path,$s_id)
  43. {
  44. return true;
  45. }
  46. function cClose()
  47. {
  48. return true;
  49. }
  50. function cRead($s_id)
  51. {
  52. $now_time = time();

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

  55. if(!$rs || $rs->EOF)
  56. {
  57. return "";
  58. }
  59. else
  60. {
  61. return $rs->fields['s_data'];
  62. }
  63. return "";
  64. }
  65. function cWrite($s_id,$s_data)
  66. {
  67. $rec = $this->getData($s_id, $s_data);
  68. $sql = "SELECT {$this->primaryKey} FROM {$this->table} WHERE {$this->primaryKey}='$s_id'";
  69. $rs = $this->conn->Execute($sql);

  70. if(!$rs || $rs->EOF)
  71. {
  72. $rec[$this->primaryKey] = $s_id;
  73. $this->conn->AutoExecute("{$this->table}",$rec,"INSERT");
  74. if($this->conn->Affected_Rows())
  75. {
  76. return true;
  77. }
  78. }
  79. else
  80. {
  81. $this->conn->AutoExecute("{$this->table}",$rec,"UPDATE","{$this->primaryKey}='$s_id'");
  82. if($this->conn->Affected_Rows())
  83. {
  84. return true;
  85. }
  86. }
  87. return false;
  88. }
  89. function cDestroy($s_id)
  90. {
  91. $sql = "DELETE FROM {$this->table} WHERE {$this->primaryKey}='$s_id'";
  92. $this->conn->Execute($sql);
  93. if($this->conn->Affected_Rows())
  94. {
  95. return true;
  96. }
  97. return false;
  98. }
  99. function cGc($life_time)
  100. {
  101. $now_time = time();
  102. $sql = "DELETE FROM {$this->table} WHERE s_expire < $now_time";
  103. $this->conn->Execute($sql);
  104. return intval($this->conn->Affected_Rows());
  105. }

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

  113. $rec = array();
  114. //session的有效期
  115. $rec['s_expire'] = $expire;
  116. //session 数据
  117. $rec['s_data'] = $s_data;
  118. //其它自定义数据
  119. $rec['user_id'] = isset($GLOBALS['U_ENV']['user_id']) ? $GLOBALS['U_ENV']['user_id'] : '';
  120. $rec['user_ip'] = isset($GLOBALS['U_ENV']['ip']) ? $GLOBALS['U_ENV']['ip'] : '';
  121. $rec['user_act'] = isset($GLOBALS['ACT']) ? $GLOBALS['ACT'] : '';
  122. $rec['user_code'] = isset($GLOBALS['CODE']) ? $GLOBALS['CODE'] : '';

  123. return $rec;
  124. }
  125. }
阅读(171) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~