0

私が直面している問題は2つあります。

  1. 複数のページにまたがるセッションを作成する方法として、セッション ラッパー クラスを使用したいと考えています。
  2. 設定されたタイムアウト後に上記のセッションを期限切れにする方法が必要です。

ユース ケースの例として、サイトがページにアクセスする前に認証を必要とする場合、セッション ラッパーのインスタンスを作成し、ユーザーの資格情報が有効な場合はアカウント ページにリダイレクトします。

// index.php
if (invalidUser) {
   // Show error
} else if(userIsValid($user_email, $user_pass)) {
   $sess = new Session("MySite", 10);
   Utils::redirect("accountPage.php"); 
}

アカウント ページにリダイレクトするユーティリティ メソッドは次のとおりです。

// utils.php
ob_start(); // Start output buffer
/**
  * Redirects the HTTP header to another location.
  *
  * @param (String) $address the new location to send the browser.
  */
  public static function redirect($address) {
     header("Location: $address");
     exit();
  }

セッション ラッパー クラスの実装は次のとおりです。

// session.php
class Session {        
       /**
         * Default Constructor.
         *
         * @param (String) $name the name of the session, as well as the session cookie name 
         * @param (String) $timeout the amount of time to permit the existence of 
         * this session.
         * -1, indicates that the session should live on indefinetely.
         */
        function __construct($name, $timeout = -1) {
            session_name($name);
            session_start();

            $_SESSION["timeout"] = $timeout;
            $_SESSION["created"] = time();
        }

    /**
     * Determines if the session is still considered "alive" based on its 
     * timeout + creation time.
     * If the session has expired we remove the session effectively "Timing out".
     */
    public static function isExpired() {

        // Default infinite timeout case
        if ($_SESSION["created"] == -1) {
            return false;
        }

        // Evaluate time left on session
        if(($_SESSION["timeout"] + $_SESSION["created"]) <= time()) {
            // Remove Session
            return true; 
        } else {
            // Session has not expired yet
            return false;
        }
    }
}

$_SESSION globalこのページの配列内のデータを期待しますが、 NULL. 同様の投稿を読んだことがありますが、特定の実装で何かが欠けていると思います。

// accountsPage.php
<?php
include_once("session.php");

Session::isExpired(); => false
print_r($_SESSION); => NULL

リダイレクトせずに$_SESSION global配列を印刷すると、その中にデータがあるため、部分的に機能することはわかっています。各ページの先頭に追加することは知っていsession_start()ますが、追加のセッションと Cookie の作成を軽減したいと考えています。

事前に感謝します。

4

2 に答える 2

1

要求された $ _SESSIONのインデックスが見つからず、同じsession_nameSession::isExpiredの下にないため、返して正しく動作しています。FALSE

あなたが呼び出した最初のページで言ってみましょうnew Session('MyWebsite', 10);他のページでは、セッションを開始して $_SESSION 値を取得する前に、 MyWebsiteセッション名を呼び出す必要があります。

開発者がどのセッション名を呼び出す必要があるかを指定しなかった場合、セッション名は新しいリクエストごとにデフォルト名にリセットされます。そのため、返されnullます。コードを少し変更しています。

function __construct($name, $timeout = -1) {
   session_name($name);
   session_start();

   if(!isset($_SESSION['created'])) {
      $_SESSION["timeout"] = $timeout;
      $_SESSION["created"] = time();
   }
}

public function isExpired() {
   /* your code here */
}

isExpired() から静的を取得していますが、静的はクラス コンストラクターを呼び出しませんでした。2 ページ目の例

<?php
include('session.php');

$session = new Session('MyWebsite', 10);
$session->isExpired();
print_r($_SESSION);
于 2013-06-08T19:48:06.163 に答える
0

すべてのsession_start()ページの出力を送信する前に呼び出す必要があります。「accountsPage.php」の場合、「session.php」ファイルを含めますが、そのファイルはクラスを定義するだけで、ページのコードのどこかにない限り、実際にはこの関数を呼び出しません。new Session("MySite", 10);

と を実際に削除session_name($name);session_start();__construct、代わりに「session.php」スクリプトの先頭に配置することをお勧めします。$name明らかに"MySite"(Hard coded)に置き換える必要がありますが、それを回避する方法があります。

于 2013-06-08T18:04:15.707 に答える