有些东西让我的数据库类失去了意义

时间:2012-11-18 22:20:05

标签: php mysql session

我正在将会话存储在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 "";
}

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

3 个答案:

答案 0 :(得分:1)

一开始只有两个要点:

  1. 致命错误不在于说谎。因此database类在某些(和那个)点缺失(而不是未设置)。
  2. 您在会话类中使用静态方法。当调用有问题的函数时,只需要会话类存在。没有任何设置可以确保实际加载database类定义。
  3. 这导致了解决方案,您应该要求该函数调用的database类定义。把它放进去,database类就定义了。实际上我不明白你在问题中想到哪一部分。

    类和特别是静态函数非常简单,你也可以用标准函数替换它们到一定程度,这可能会使你的使用类型更加明显和更直接。在你这样做之前,不要使用你不常见的语言功能。

答案 1 :(得分:0)

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

如果您使用自动加载功能,则必须检查自动加载器。

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

答案 2 :(得分:0)

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

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

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