首 页   · 站长博客 · 用户注册 · 会员登陆  · 会员排行  ·最新主题  ·最近回复  精华区  版权声明  ·论坛管理
  当前登录身份:游客,请先登录。  笔名: 口令: 验证码:   
楼 主  index »  PHP安装/语法/函数 » [原创]关于把session放到数据库的代码,请教.....  


  作者:灿烂季节
  注册时间:2005-04-14
  主题/回复:7/8
  积分:442
  等级:★★☆(五级)
  称号:略有小成

  123@321.net
  未提供
  www.

 

 发表:2005-04-14 23:19:37 阅读 2545 次 回复 6 次 得分2  |   字号 字色
[原创]关于把session放到数据库的代码,请教.....
代码这样的,
<?php 
//包含这个文件到你要使用session的文件中,必须在调用session_start()之前,否则, 
//会很惨的,不要怪我没告诉你。 这样就不需要再做什么工作了,还和你以前用session的方法一 
//样。 
$SESS_DBHOST = "localhost"; 
$SESS_DBNAME = "mydb"; 
$SESS_DBUSER = "root"; 
$SESS_DBPASS = "111111"; 

$SESS_DBH = ""; 
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime"); 

function sess_open($save_path, $session_name) { 
global $SESS_DBHOST, $SESS_DBNAME, $SESS_DBUSER, $SESS_DBPASS, $SESS_DBH; 

if (! $SESS_DBH = mysql_pconnect($SESS_DBHOST, $SESS_DBUSER, $SESS_DBPASS)) { 
echo "<li>Can't connect to $SESS_DBHOST as $SESS_DBUSER"; 
echo "<li>MySQL Error: ", mysql_error(); 
die; 


if (! mysql_select_db($SESS_DBNAME, $SESS_DBH)) { 
echo "<li>Unable to select database $SESS_DBNAME"; 
die; 


return true; 


function sess_close() { 
return true; 


function sess_read($key) { 
global $SESS_DBH, $SESS_LIFE; 

$qry = "SELECT value FROM sessions WHERE sesskey = '$key' AND expiry > " . time(); 
$qid = mysql_query($qry, $SESS_DBH); 

if (list($value) = mysql_fetch_row($qid)) { 
return $value; 


return false; 


function sess_write($key, $val) { 
global $SESS_DBH, $SESS_LIFE; 

$expiry = time() + $SESS_LIFE; 
$value = addslashes($val); 

$qry = "INSERT INTO sessions VALUES ('$key', $expiry, '$value')"; 
$qid = mysql_query($qry, $SESS_DBH); 

if (! $qid) { 
$qry = "UPDATE sessions SET expiry = $expiry, value = '$value' WHERE sesskey 
= '$key' AND expiry > " . time(); 
$qid = mysql_query($qry, $SESS_DBH); 


return $qid; 


function sess_destroy($key) { 
global $SESS_DBH; 

$qry = "DELETE FROM sessions WHERE sesskey = '$key'"; 
$qid = mysql_query($qry, $SESS_DBH); 

return $qid; 


function sess_gc($maxlifetime) { 
global $SESS_DBH; 

$qry = "DELETE FROM sessions WHERE expiry < " . time(); 
$qid = mysql_query($qry, $SESS_DBH); 

return mysql_affected_rows($SESS_DBH); 


session_set_save_handler( 
"sess_open", 
"sess_close", 
"sess_read", 
"sess_write", 
"sess_destroy", 
"sess_gc"); 
?>



我照做了,但是INCLUDE之后就得不到SESSION变量了,

去掉INCLUDE之后,就是说回到用文件存的方法后,是可以得到的,请问这是为什么?

 
 1#楼  
 
  回复人:一起PHP
  注册时间:2004-02-27
  主题/回复:247/1521
  积分:4649
  等级:★★★★★☆(十一级)
  称号:论坛圣人

   
 1#楼 发表于2005-04-14 23:37:36  评分:1 

代码太长,又费脑筋,实在不想细看。
你的意思我基本上明白了。你说你按照他的要求作了以后,不能再用$_SESSION[]获得session内容了。代码没仔细看,但是我估计原因在于你把session存放到数据库中了,还用原来的$_SESSION[]方法取不到了。得从数据库中查询。
 2#楼  
 
  回复人:灿烂季节
  注册时间:2005-04-14
  主题/回复:7/8
  积分:442
  等级:★★☆(五级)
  称号:略有小成

   
 2#楼 发表于2005-04-14 23:44:45  评分:× 

惭愧,其实这段代码什么意思我也不知道,是老外些的扩充函数。

他的说明就是“包含这个文件到你要使用session的文件中,必须在调用session_start()之前,这样就不需要再做什么工作了,还和你以前用session的方法一样。”

所以我照做,但是得不到变量,MYSQL里面的确是有SESSION写入了,

现在我想想可能是PHP.INI里面得设置没调整,应该调整到USER,

现在去试,等会回来。 
 3#楼  
 
  回复人:灿烂季节
  注册时间:2005-04-14
  主题/回复:7/8
  积分:442
  等级:★★☆(五级)
  称号:略有小成

   
 3#楼 发表于2005-04-14 23:55:43  评分:× 

奇怪了,昨天试还是不行,今天就可以得到变量了,

而且照理来说,在PHP.INI里面session.save_handler = 应该是USER,

现在我仍然是FILES,竟然也可以传递,是在是奇怪啊~~
 4#楼  
 
  回复人:一起PHP
  注册时间:2004-02-27
  主题/回复:247/1521
  积分:4649
  等级:★★★★★☆(十一级)
  称号:论坛圣人

   
 4#楼 发表于2005-04-15 00:29:01  评分: 

呵呵,没有做过这类尝试,不知道这么做的好处和必要性。
不过研究一下还是很有价值的。
 5#楼  
 
  回复人:灿烂季节
  注册时间:2005-04-14
  主题/回复:7/8
  积分:442
  等级:★★☆(五级)
  称号:略有小成

   
 5#楼 发表于2005-04-15 18:41:49  评分:× 

SESSION通常是以文件形式存储的,一个SESSION就存一个文件,

如果一个网站同时又几千个甚至几万个SESSION的话,

对于一个操作系统来说,一个文件夹里又那么多文件是件很可怕的事情,

但是存在数据库里的话,既稳定又安全,这个就是目的。
 6#楼  
 
  回复人:pnrj7999
  注册时间:2005-04-04
  主题/回复:73/43
  积分:813
  等级:★★★(六级)
  称号:声名鹊起

用户联系方式已设置为保密
 6#楼 发表于2005-04-16 00:40:04  评分:1 

我刚刚把session的教程发上,在语法单元,你去看看,或许有帮助
  页数1/1首页 « 1 » 末页
  发表回复:您还没有登陆,无法发表回复。请先[登陆]

一起PHP技术联盟 主办:一起PHP 联系方式:站长QQ:4304410 QQ群:8423742 20159565 站长博客 E-mail: nqp@nqp.me 执行时间:0.009sec
SimsmaBBS 2008 (v6.0) Developed by 17php.com,Copyright(C)2003-2010 All rights reserved. 副本授权:一起PHP官方专用版