session_set_save_handler вызывает цикл входа в систему - PullRequest
1 голос
/ 21 июня 2011

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

В любом случаевот мой код для функций сеанса - я не думаю, что здесь что-то не так:

<?php

// session.functions.php

$db = new mysqli("127.0.0.1", "user", "pass", "db");
// define 'openSession()' function
function openSession($sessionPath, $sessionName) {
    return true;
}

// define 'closeSession()' function
function closeSession() {
    return true;
}

// define 'readSession()' method
function readSession($sessionId) {
    global $db;
    // escape session ID
        $sessionId = $db->real_escape_string($sessionId);
    $result = $db->query("SELECT sessiondata FROM sessions WHERE
sessionid='$sessionId' AND expiry > NOW()");
    if ($result->num_rows > 0) {
        $row = $result->fetchRow();
        return $row['sessiondata'];
    }
    // return empty string
    return "";
}

// define 'writeSession()' function
function writeSession($sessionId, $sessionData) {
    global $db;
    $expiry = time() + get_cfg_var('session.gc_maxlifetime') - 1;
    // escape session ID & session data
        $sessionId = $db->real_escape_string($sessionId);
        $sessionData = $db->real_escape_string($sessionData);
    $result = $db->query("SELECT sessionid FROM sessions WHERE
sessionid='$sessionId'");
    // check if a new session must be stored or an existing one must be updated 
    ($result->num_rows > 0) ? $db->query("UPDATE sessions SET     sessionid='$sessionId',expiry='$expiry',sessiondata=
'$sessionData' WHERE sessionid='$sessionId'") or die(mysqli_error($db)) : $db->query("INSERT INTO sessions (sessionid,expiry,sessiondata) VALUES ('$sessionId','$expiry','$sessionData')") or die(mysqli_error($db));
    return true;
}

// define 'destroySession()' function
function destroySession($sessionId) {
    global $db;
    // escape session ID
        $sessionId = $db->real_escape_string($sessionId);
    $db->query("DELETE FROM sessions WHERE sessionid='$sessionId'");
    return true;
}

// define 'gcSession()' function
function gcSession($maxlifetime) {
    global $db;
    $db->query("DELETE FROM sessions WHERE expiry < NOW()");
    return true;
}

?>

Это параметр сеанса для входа в систему:

$this->set_session(array_merge($rs->fetch_assoc(), array('expires' => time() + (15 * 60))));

, установленный функцией:

private function set_session($a=false) {
    if (!empty($a)) {
        $_SESSION['exp_user'] = $a;
    }
}

Как моя система входа в систему проверяет, вошел ли я в систему?

public function check_status() {
    if (empty($_SESSION['exp_user']) || @$_SESSION['exp_user']['expires'] < time()) {
        return false;
    } else {
        return true;
    }
}

Получается, что значение $ _SESSION, согласно var_dump, равно array (0){}

и проверка в самом веб-приложении:

// This is in authorisation.php

if(empty($_SESSION['exp_user']) || @$_SESSION['exp_user']['expires'] < time()) {
        header("location:/login.php");  //@ redirect 
} else {
    $_SESSION['exp_user']['expires'] = time()+(15*60);  //@ renew 15 minutes
        //echo $SID = session_id();
}

Теперь вот что у меня есть в этом файле index.php вверху:

require('includes/session.functions.php');
session_set_save_handler('openSession', 'closeSession', 'readSession', 'writeSession', 'destroySession', 'gcSession');
session_start();
include('includes/authorisation.php');

Вот база данных:

SQL Schema

Если я закомментирую session_set_save_handler(), мы не получим цикл, однако, если я буду держать его там в действии, я получуЦикл между индексом и системой входа в систему (уже авторизован -> index :: check login loop.)

print_r(session_set_save_handler('openSession', 'closeSession', 'readSession', 'writeSession', 'destroySession', 'gcSession')); == 1 

var_dump(session_set_save_handler('openSession', 'closeSession', 'readSession', 'writeSession', 'destroySession', 'gcSession')); == bool(true)

Есть идеи, что я делаю не так?

Ответы [ 2 ]

1 голос
/ 21 июня 2011

Кажется, вы смешиваете два разных формата времени. В mysql NOW() дает вам время в формате:

Возвращает текущую дату и время в виде значения в формате «ГГГГ-ММ-ДД ЧЧ: ММ: СС» или ГГГГММДДЧЧММСС.uuuuuuu в зависимости от того, используется ли функция в строковом или числовом контексте.

В php, time() дает вам:

Возвращает текущее время, измеренное в секундах с начала эпохи Unix (1 января 1970 г., 00:00:00 по Гринвичу).

В своих выражениях sql вы сравниваете два, и вы не можете, так как они совершенно разных форматов.

0 голосов
/ 21 июня 2011

Оказывается, что был дополнительный session_start (), который бы сбрасывал сессию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...