我正在将会话存储在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 "";
}
谁能看到这里发生了什么?
答案 0 :(得分:1)
一开始只有两个要点:
database
类在某些(和那个)点缺失(而不是未设置)。database
类定义。这导致了解决方案,您应该要求该函数调用的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配置是否确实相同,都以相同的方式处理查询等。