我正在翻新的网站使用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。
我很茫然。我应该看看哪些好资源?
答案 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);
我现在能够很好地写入数据库。