由于链接资源无效,MySQL连接失败

时间:2011-12-17 02:31:37

标签: php mysql

我的代码:

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会话处理程序。

1 个答案:

答案 0 :(得分:1)

最有可能发生这种情况(根据您的信息进行最佳猜测):

每个the manual会话写入处理程序直到脚本结束后才会被调用。在许多PHP版本中,所有类析构函数都是在调用会话写入处理程序之前运行。因此,如果要关闭__destruct()中的连接,则在write()之前调用__destruct() - 当您尝试保存会话时会导致无效连接。