2013-06-08 1 views
0
에 전달되지

내가 직면하고 문제는 두 배입니다 : 나는 여러 페이지에 걸쳐 세션을 생성하는 방법으로 내 세션 래퍼 클래스를 사용하고자하는세션 데이터는 다른 페이지

  1. .
  2. 설정 시간 초과 후 위의 세션을 만료시키는 방법이 좋겠습니까?

예제 사용 사례로서, 내 사이트가 페이지에 액세스하기 전에 인증을 요구하면 사용자의 자격 증명이 유효하면 계정 페이지로 리디렉션 할 것이므로 내 세션 래퍼의 인스턴스를 만들 것입니다.

// 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 내에서 데이터를 기대 : 여기

// 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(); 
    } 

이 세션 래퍼 클래스의 구현입니다 : 여기
// index.php 
if (invalidUser) { 
    // Show error 
} else if(userIsValid($user_email, $user_pass)) { 
    $sess = new Session("MySite", 10); 
    Utils::redirect("accountPage.php"); 
} 

는 계정 페이지로 리디렉션 유틸리티 방법 global이 페이지의 배열은 NULL입니다. 비슷한 게시물을 읽었지만 특정 구현을 통해 뭔가를 놓치고있는 것 같습니다. 나는 $_SESSION global 배열을 인쇄 한 후 리디렉션하지 않으면 그 안에 데이터가 있기 때문에 나는 그것을 알고

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

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

부분적으로 작동합니다. 각 페이지의 시작 부분에 session_start()을 추가하는 것에 대해 알고 있지만 추가 세션 및 쿠키를 작성하는 것을 완화하고 싶습니다.

도움이 될 것입니다 사전에 감사드립니다!

답변

1

Session::isExpired은 요청한 $ _SESSION의 색인을 찾을 수없고 일치하지 않으므로 FALSE을 반환하여 올바르게 작동합니다. session_name.

첫 번째 페이지에서 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 */ 
} 

static은 isExpired()에서 가져오고 static은 클래스 생성자를 호출하지 않았습니다.두 번째 페이지의 예

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

$session = new Session('MyWebsite', 10); 
$session->isExpired(); 
print_r($_SESSION); 
+0

아주 잘 했어! – Romelus

0

에 대한 출력을 보내기 전에 페이지마다 session_start()으로 전화해야합니다. "accountsPage.php"의 경우 "session.php"파일을 포함 시키지만 그 파일은 클래스를 정의 할 뿐이며 페이지 코드에 어딘가에 new Session("MySite", 10);이 없으면 실제로이 함수를 호출하지 않습니다.

실제로 session_name($name);session_start();__construct에서 제거하고 대신 "session.php"스크립트 상단에 배치하는 것이 좋습니다. 분명히 $name"MySite" (하드 코딩 됨)으로 대체해야하지만 그 주위에는 여러 가지 방법이 있습니다.

+0

괜찮 았지만 "session.php"인스턴스를 만들 때 만들어지는 세션 쿠키의 이름을 지정할 수있는 방법이 있습니까? – Romelus