从没在原创区发过帖子, 本人只有半年PHP开发经验, 如果有错的地方,很各位多指点,谢谢,
主要写给像我这样的新手看的,高手就当温习吧.哈哈
----------------------------------------------------------------------------------------------------------------------
这个SESSION类, 是以ADODB 来操作数据库的.
SESSION,经常用在后台验证, PHP默认是存在文件里的. 但最好存到数据库中,
这样可以解决如: 1 跨站访问 2 一个帐号同一时间只能由一人登陆 3 可很方便统计在线人数
现在就开工了.
首先 你得将php.ini
session.save_handler = files 改成 session.save_handler = user 指示服务器将SESSION数据存在数据库中.
如果你是虚拟空间的话, 就没有设置权限了, 可以在PHP文件中用如下语句修改:
1.
2. ini_set('session.save_handler', 'user');
复制代码
第二步:session表 表结构如下:
1.
2. CREATE TABLE `system_session` (
3. `s_id` varchar(255) NOT NULL default '',
4. `s_expire` int(10) unsigned NOT NULL default '0',
5. `user_id` int(10) unsigned NOT NULL default '0',
6. `user_ip` varchar(15) NOT NULL default '',
7. `user_act` varchar(20) NOT NULL default '',
8. `user_code` varchar(20) NOT NULL default '',
9. `s_data` mediumtext NOT NULL,
10. PRIMARY KEY (`s_id`)
11. ) 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. //数据库
3. $C_DB = array();
4. $C_DB['type'] = "mysql";
5. $C_DB['host'] = "localhost";
6. $C_DB['user'] = "root";
7. $C_DB['password'] = "";
8. $C_DB['dbname'] = "test";
9.
10.
11. //数据库类(adodb)
12. require_once($C_DIR['lib']."adodb/adodb.inc.php");
13. //连数据库
14. $CONN = &ADONewConnection($C_DB['type']);
15. $CONN->Debug = $C_DB['debug'];
16. if( !$CONN->Connect($C_DB['host'],$C_DB['user'],$C_DB['password'],$C_DB['dbname']) )
17. {
18. die("连接不上数据库");
19. }
20. $CONN->SetFetchMode(ADODB_FETCH_ASSOC);
21. $CONN->Execute("SET NAMES gbk");
22.
23.
24. //建session
25. //指示 将SESSION存入数据库
26. ini_set('session.save_handler', 'user');
27. //实例化SESSION类
28. require_once($C_DIR['func']."session.php");
29. /*
30. array(
31. 'conn' => adodb连接类实例
32. 'table' => session 存在哪个表里
33. );
34. */
35. new sessionDb(array(
36. 'conn' => $CONN,
37. 'table' => 'system_session'
38. ));
复制代码
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.
43. function cOpen($save_path,$s_id)
44. {
45. return true;
46. }
47. function cClose()
48. {
49. return true;
50. }
51. function cRead($s_id)
52. {
53. $now_time = time();
54.
55. $sql = "SELECT s_data FROM {$this->table} WHERE {$this->primaryKey}='$s_id' AND s_expire>$now_time";
56. $rs = $this->conn->Execute($sql);
57.
58. if(!$rs || $rs->EOF)
59. {
60. return "";
61. }
62. else
63. {
64. return $rs->fields['s_data'];
65. }
66. return "";
67. }
68. function cWrite($s_id,$s_data)
69. {
70. $rec = $this->getData($s_id, $s_data);
71. $sql = "SELECT {$this->primaryKey} FROM {$this->table} WHERE {$this->primaryKey}='$s_id'";
72. $rs = $this->conn->Execute($sql);
73.
74. if(!$rs || $rs->EOF)
75. {
76. $rec[$this->primaryKey] = $s_id;
77. $this->conn->AutoExecute("{$this->table}",$rec,"INSERT");
78. if($this->conn->Affected_Rows())
79. {
80. return true;
81. }
82. }
83. else
84. {
85. $this->conn->AutoExecute("{$this->table}",$rec,"UPDATE","{$this->primaryKey}='$s_id'");
86. if($this->conn->Affected_Rows())
87. {
88. return true;
89. }
90. }
91. return false;
92. }
93. function cDestroy($s_id)
94. {
95. $sql = "DELETE FROM {$this->table} WHERE {$this->primaryKey}='$s_id'";
96. $this->conn->Execute($sql);
97. if($this->conn->Affected_Rows())
98. {
99. return true;
100. }
101. return false;
102. }
103. function cGc($life_time)
104. {
105. $now_time = time();
106. $sql = "DELETE FROM {$this->table} WHERE s_expire < $now_time";
107. $this->conn->Execute($sql);
108. return intval($this->conn->Affected_Rows());
109. }
110.
111. //写入session的数据,可根据需要修改
112. function getData($s_id, $s_data)
113. {
114. global $C_SYS;
115. //$this->conn = getConn();
116. $C_SYS['login_expire'] = !intval($C_SYS['login_expire']) ? 30 : $C_SYS['login_expire'];
117. $expire = time() + $C_SYS['login_expire'] * 60;
118.
119. $rec = array();
120. //session的有效期
121. $rec['s_expire'] = $expire;
122. //session 数据
123. $rec['s_data'] = $s_data;
124. //其它自定义数据
125. $rec['user_id'] = isset($GLOBALS['U_ENV']['user_id']) ? $GLOBALS['U_ENV']['user_id'] : '';
126. $rec['user_ip'] = isset($GLOBALS['U_ENV']['ip']) ? $GLOBALS['U_ENV']['ip'] : '';
127. $rec['user_act'] = isset($GLOBALS['ACT']) ? $GLOBALS['ACT'] : '';
128. $rec['user_code'] = isset($GLOBALS['CODE']) ? $GLOBALS['CODE'] : '';
129.
130. return $rec;
131. }
132. }
复制代码
刷新http://www.kaiyuanba.cn/ test.php 现在到表里看看, 是不是多了一个数据??