0

我将会话存储在 MySQL 数据库中。

我有一个具有多种功能的 SessionManager 类。但是,在课堂的某个地方,我的数据库类正在被卸载,我似乎无法找出原因。

我使用以下方法测试了该类是否存在:

echo (class_exists('database') === TRUE ? 'Yes' : 'No');

这是产生致命错误的函数,告诉我database找不到该类。请注意,上面的测试在测试所在的位置返回 true,__construct并且在此方法中特别失败:

public static function writeSession($sessionId, $sessionData)
{
    $sessionId = session_id();
    session_write_close();
    session_id($sessionId);
    $expiry = time() + ini_get('session.gc_maxlifetime') - 1;
    $sessionId = database::getInstance()->real_escape_string($sessionId);
    $sessionData = database::getInstance()->real_escape_string($sessionData);
    $result = database::getInstance()->query("SELECT sessionid FROM sessions WHERE sessionid='$sessionId'");
    ($result->num_rows > 0) ?
        database::getInstance()->query("UPDATE sessions SET sessionid='$sessionId',expiry='$expiry',sessiondata= '$sessionData' WHERE sessionid='$sessionId'")
        : database::getInstance()->query("INSERT INTO sessions (sessionid,expiry,sessiondata) VALUES ('$sessionId','$expiry','$sessionData')") ;
}

即使我尝试实例化一个新的数据库对象,也找不到该类,就好像它消失了一样。

该课程有效,并且在以前的方法中很好:

  public static function readSession($sessionId)
{

    $sessionId = session_id();
    $sessionId = database::getInstance()->real_escape_string($sessionId);
    $time = time();
    $result = database::getInstance()->query("SELECT sessiondata FROM sessions WHERE sessionid='$sessionId' AND expiry > $time");
    if ($result->num_rows > 0) {
        $row = $result->fetch_array();
        return $row['sessiondata'];
    }
    return "";
}

谁能看到这里发生了什么?

4

3 回答 3

1

开头只有两个重点:

  1. 致命错误没有说谎。所以database类在某些(和那个)点丢失(不是未设置)。
  2. 您在会话类中使用静态方法。这只需要在调用相关函数时会话类存在。没有任何设置可以确保database实际加载类定义。

这导致您应该需要该database函数调用的类定义的解决方案。把它放进去,database类就定义好了。实际上,我不明白您对问题的哪一部分感到好奇。

类,尤其是静态函数相当简单,您也可以在一定程度上用标准函数替换它们,这可能会使您的使用类型更加明显和更加直接。在您使用之前不要使用您觉得不常用的语言功能。

于 2012-11-18T22:58:44.810 回答
0

class_exists()检查您的类是否可以加载。如果返回 false,则无法定位您的类代码。

如果你使用自动加载,你必须检查你的自动加载器。

如果不这样做,则必须添加一个require_once "Path/To/The/File/With/The/Code/For/The/DatabaseClass.php(带有类代码的文件路径)。

于 2012-11-18T22:24:25.543 回答
0

虽然这可能并不能真正回答这个问题,但我发现了两件有趣的事情。

1,APC导致我的数据库类出现问题,但我还没有找到原因。我已在待调查的服务器上全局禁用此功能。

2,检查 MySQL 配置是否确实相同,都以相同的方式处理查询等。

于 2012-11-18T22:50:00.093 回答