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

最初の 2 つの主要なポイント:

  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

これは質問の答えにはならないかもしれませんが、興味深いことが 2 つあります。

1. APC が私のデータベース クラスで問題を引き起こしていましたが、まだ理由がわかりません。調査保留中のサーバーでこれをグローバルに無効にしました。

2、MySQL 構成が実際に同じであること、両方が同じ方法でクエリを処理することなどを確認します。

于 2012-11-18T22:50:00.093 に答える