2012-11-18 31 views
0

我正在將會話存儲在MySQL數據庫中。有些東西是不正確的我的數據庫類

我有一個SessionManager類,它有多個功能。然而,在類的某個地方,我的數據庫類正在被卸載,我似乎無法找出原因。

我測試,以查看是否存在類使用:

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

這是正在產生一個致命的錯誤告訴我,類database沒有找到該功能。記下測試位於__construct,在這種方法具體失敗時的測試上面返回true:

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

'public static'?這意味着它可以通過構造函數 – ajreal

+3

Singletons **和**'mysql _ *()'?沒有冒犯隊友,但你應該得到你所有的頭痛。 –

+0

@ajreal,是的,它們只是公開的,因爲還有其他與會話處理程序的交互。 – bear

回答

1

就在兩個主要點查詢:

  1. 致命錯誤是不是在說謊。因此database類在某些(和那個)點處丟失(不是未設置)。
  2. 您在會話類中使用靜態方法。只有在有問題的函數被調用時才需要會話類。沒有任何設置可以確保實際加載database類定義。

這導致您應該需要該函數調用的database類定義的解決方案。把它放入,並且定義database類。其實我不明白在你的問題中哪一部分你非常想知道。

類和特別是靜態函數是相當直接的,你也可以用標準函數替換它們到一定程度,這可能會使你的使用類型更加明顯和更直接。除非你這樣做,否則不要使用你不常用的語言功能。

+0

嗨@hakre,謝謝:)我不認爲它是撒謊,它只是沒有發生在我身上,它是如此失蹤。很多函數都是靜態的,因爲它們需要被調用而沒有再次實例化整個會話對象。我正在慢慢地將這些腳本移到更合適的位置。 – bear

0

class_exists()檢查您的課程是否可以加載。如果它返回false,你的班級代碼將無法找到。

如果您使用自動加載,則必須檢查自動加載器。

如果你不這樣做,你必須添加一個require_once "Path/To/The/File/With/The/Code/For/The/DatabaseClass.php(帶有類代碼的文件路徑)。

+0

我正在使用一個自動加載器,但是,我認爲該類加載正確,因爲它在前一個函數中沒有失敗。考慮到'class_exists()'對於文件中的一些但不是全部函數是錯誤的,這可能是什麼原因? – bear

0

儘管這可能不能真正回答這個問題,但我發現了兩件有趣的事情。

1,APC對我的數據庫類造成了問題,但我還沒有找到原因。我已在服務器上全局禁用此功能,正在等待調查。

2,檢查MySQL的CONFIGS確實是一樣的,都在開始處理以同樣的方式等

相關問題