会话数据未写入数据库

时间:2010-06-24 22:48:43

标签: php mysql session

我正在翻新的网站使用session_set_save_handler函数将会话数据写入其数据库,如下所示:

session_set_save_handler (array(&$ses_class, '_open'), 
                          array(&$ses_class, '_close'), 
                          array(&$ses_class, '_read'), 
                          array(&$ses_class, '_write'), 
                          array(&$ses_class, '_destroy'), 
                          array(&$ses_class, '_gc'));

我有_open,_close等功能记录他们收到的任何调用到error_log 文件但在打开时我只看到对_write和_close的调用。为什么这些是 只调用函数?

另外,根据我在_write函数的页面可以或不能写入 数据库,返回'拒绝访问...(使用密码:否)'mysql_error。

我很茫然。我应该看看哪些好资源?

3 个答案:

答案 0 :(得分:1)

您肯定在 session_start()之后致电session_set_save_handler

  

'访问被拒绝...(使用密码:否)'   mysql_error。

这通常表示数据库尚未连接,因此PHP尝试使用默认用户名和无密码进行连接,99.999%的时间不起作用。例如。在mysql_query()

之前调用了mysql_connect()

听起来像代码的排序问题。

答案 1 :(得分:0)

PHP 5.1有一个错误,在会话关闭之前对象被销毁了。我的解决方案是为我的DB对象创建一个析构函数,该函数显式关闭了会话。

另一个问题是,在初始化数据库连接之前,您可能有代码启动会话。这需要仔细跟踪您的包含,寻找意外调用$_SESSION的全局代码。这也将与您的session_set_save_handler()电话一起播放。我在以前的工作中遇到过这个问题。唯一的解决方案是重新排序事物的初始化方式,这样它们就不会以错误的顺序发生。

答案 2 :(得分:0)

我的问题是两部分,这个答案对应于第二部分,即无法写入数据库的问题。

我正在使用的网站使用的会话对象没有存储数据库资源,因此代码中下游的数据库连接破坏了会话的连接。我创建了一个对象变量来存储数据库资源,并在所有会话查询中明确引用它,即

$result = mysql_query($query)

成了

$result = mysql_query($query, $this -> db);

我现在能够很好地写入数据库。