2013-06-08 2 views
0

Проблема я столкнулся в два раза:данные сеанса не передаются на другие страницы

  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; 
     } 
    } 
} 

Я ожидал бы данные в пределах $_SESSIONglobal массив на этой странице, но его NULL. Я читал подобные сообщения, но, я думаю, что у меня что-то не хватает с моей конкретной реализацией.

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

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

Я знаю, что это частично работает, потому что если я не перенаправлять, а затем распечатать $_SESSIONglobal массив есть данные в нем. Я знаю о добавлении session_start() в начале каждой страницы, но я хотел бы облегчить создание дополнительных сессий и файлов cookie.

Любая помощь была бы очень благодарна заранее!

ответ

1

Ваш Session::isExpired ведет себя корректно, возвращая FALSE, потому что индекс запрошенной $ _SESSION не найден и не находится под тем же session_name.

Предположим, что на первой странице вы назвали new Session('MyWebsite', 10);. На других страницах вам нужно позвонить MyWebsite имя сеанса перед началом сеанса и получить значения $ _SESSION.

Имя сеанса сбрасывается на имя по умолчанию для каждого нового запроса, если разработчик не указал, какое имя сеанса необходимо вызвать. Вот почему он вернет 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(), статический не вызывал класс contructor.Пример для вашей второй страницы

<?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

Это хорошо, но есть ли способ, который я могу назвать файлом cookie сеанса, который создается при создании экземпляра «session.php»? – Romelus

Смежные вопросы