• 将SESSION存入数据库类 ---我的第一个原创贴
    时间:2009-07-11   作者:佚名   出处:互联网

    从没在原创区发过帖子, 本人只有半年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  现在到表里看看, 是不是多了一个数据??

    网友留言/评论

    我要留言/评论