我的代码:
class cdbsHandler
{
[...]
private $link;
function __construct($mysqld)
{
[...]
$this->link = mysql_connect(
$mysqld['host'], $mysqld['user'], $mysqld['password']
);
mysql_select_db($mysqld['database'], $this->link);
}
function write($sessionId, $data)
{
$sessionId = mysql_real_escape_string($sessionId, $this->link);
}
[...]
}
我使用这样的类:
static function startSession($name, $mysqld)
{
[...]
$sessionHandler = new cdbsHandler($mysqld);
session_set_save_handler(
array ($sessionHandler,"open"),
array ($sessionHandler,"close"),array ($sessionHandler,"read"),
array ($sessionHandler,"write"),array ($sessionHandler,"destroy"),
array ($sessionHandler,"gc")
);
session_start();
}
其中$mysqld
是数据库凭据。
每次用户加载页面时都会调用静态函数。
我得到的错误是:
mysql_real_escape_string(): 2 is not a valid MySQL-Link resource
(calling mysql_real_escape_string in the write function)
凭据是正确的。它们从配置文件加载,并在会话启动后成功用于建立几行连接。
对我来说非常重要: 我实际上能够登录并且数据被写入数据库(/ session)但是一旦登录页面将我重定向到主页,就会出现上面提到的错误。 (登录页面验证会话数据中保存的表单令牌。但是在发送该请求后,脚本将无法再访问任何会话数据。)
更多信息: 代码来自具有数据库“backup”的memcached会话处理程序。
答案 0 :(得分:1)
最有可能发生这种情况(根据您的信息进行最佳猜测):
每个the manual会话写入处理程序直到脚本结束后才会被调用。在许多PHP版本中,所有类析构函数都是在调用会话写入处理程序之前运行。因此,如果要关闭__destruct()中的连接,则在write()之前调用__destruct() - 当您尝试保存会话时会导致无效连接。