当前位置:首页 > PHP教程 > php会话 > 列表

php怎么把session保存到MySql数据库中

发布:smiling 来源: PHP粉丝网  添加日期:2014-06-28 14:03:58 浏览: 评论:0 

session我们多半是保存在服务器中,但是今天有一个功能就是需要把session保存在数据库中,这样可以实现同ie多浏览了,php中session默认的存储方式是硬盘,php也可以改变默认的存储方式,主要使用到session_set_save_handler方法,下面分享下如何将session保存到MySql数据库中的具体代码.

1.建session表,代码如下:

  1. CREATE TABLE `session` ( 
  2.   `sessionid` varchar(128) NOT NULL, 
  3.   `uid` int(11) NOT NULL, 
  4.   `data` mediumblob NOT NULL, 
  5.   `timestamp` int(11) NOT NULL, 
  6.   `ip` varchar(15) NOT NULL, 
  7.   PRIMARY KEY  (`sessionid`), 
  8.   KEY `time_session` (`timestamp`,`sessionid`) 
  9. ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 
  10. //uid 是保留字段 

2.自定义session类,代码如下:

  1. <?php 
  2. class CustomSession{ 
  3.  private static $db_host="localhost"
  4.  private static $db_user="root"
  5.  private static $db_password=""
  6.  private static $database="session"
  7.  
  8.  private $conn
  9.  
  10.  public static function getInstance(){ 
  11.   static $instance=null; 
  12.   if($instance==null){ 
  13.    $instance=new CustomSession(); 
  14.   } 
  15.  
  16.   return $instance
  17.  } 
  18.  
  19.  public function __construct(){ 
  20.   session_set_save_handler( 
  21.   array($this,"open"), 
  22.   array($this,"close"), 
  23.   array($this,"read"), 
  24.   array($this,"write"), 
  25.   array($this,"destroy"), 
  26.   array($this,"gc"
  27.   ); 
  28.  } 
  29.  
  30.  public function __destruct(){ 
  31.   session_write_close(); 
  32.  } 
  33.  
  34.  public function open(){ 
  35.   $this->conn=mysql_connect(CustomSession::$db_host,CustomSession::$db_user,CustomSession::$db_password); 
  36.   mysql_select_db(CustomSession::$database,$this->conn); 
  37.  } 
  38.  
  39.  public function close(){ 
  40.  
  41.   mysql_close($this->conn); 
  42.  } 
  43.  
  44.  public function read($id){ 
  45.   $escaped_id=mysql_escape_string($id); 
  46.   $res=$this->query("select * from `session` where `sessionid`='$escaped_id'"); 
  47.   if($row=mysql_fetch_assoc($res)){ 
  48.    $this->query("update `session` set `timetamp`=UTC_TIMESTAMP() where `sessionid`='$escaped_id'"); 
  49.    return $row['data']; 
  50.   } 
  51.   return ""
  52.  } 
  53.  
  54.  public function write($id,$data){ 
  55.   $query="replace into `session` (`sessionid`,`data`,`ip`,`timestamp`) values ('%s','%s','%s',UNIX_TIMESTAMP(UTC_TIMESTAMP()))"
  56.   $this->query(sprintf($query,mysql_escape_string($id),mysql_escape_string($data),$_SERVER["REMOTE_ADDR"])); 
  57.  } 
  58.  
  59.  public function destroy($id){ 
  60.   $escaped_id=mysql_escape_string($id); 
  61.   $res=$this->query("delete from `session` where `id`='$escaped_id'"); 
  62.   return (mysql_affected_rows($res)==1); 
  63.  } 
  64.  
  65.  public function gc($lifetime){ 
  66.   $this->query("delete from `session` where UNIX_TIMESTAMP(UTC_TIMESTAMP())-`timestamp` > $lifetime"); 
  67.  } 
  68.  
  69.  public function query($query){ 
  70.   $res=mysql_query($query,$this->conn); 
  71.   return $res
  72.  } 
  73.  
  74. ?> 

3.测试程序,代码如下:

  1. <?php 
  2. include('./CustomSession.class.php'); 
  3. CustomSession::getInstance(); 
  4. session_start(); 
  5. $_SESSION['username']='feng'
  6. print_r($_SESSION); 
  7. ?> 

运行测试程序后,查看数据库可以发现session表中已经增加了session记录.

Tags: session MySql数据库

分享到: