php - session_set_save_handler 导致登录循环

标签 php mysql session

我正在尝试使用 session_set_save_handler() 将 session 写入数据库。我遇到了一个无限循环,我的系统想要让我登录,但找不到 session ,所以它让我退出……但 session 显然存在 - 只是不在表中。

无论如何,这是我的 session 函数代码 - 我认为这里没有任何问题:

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

?>

这是登录的 session 设置:

$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(),我们不会得到循环,但是,如果我保持它在那里运行,我会得到索引和登录系统(已经登录)之间的循环-> 索引::检查登录循环。)

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)

知道我做错了什么吗?

最佳答案

您似乎混淆了两种不同的时间格式。在 mysql 中,NOW()给你一个时间格式:

Returns the current date and time as a value in 'YYYY-MM-DD HH:MM:SS' or YYYYMMDDHHMMSS.uuuuuu format, depending on whether the function is used in a string or numeric context.

在 PHP 中,time()给你:

Returns the current time measured in the number of seconds since the Unix Epoch (January 1 1970 00:00:00 GMT).

在您的 sql 语句中,您正在比较两者,但您不能,因为它们是完全不同的格式。

关于php - session_set_save_handler 导致登录循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6418222/

相关文章:

android - Flurry for Android 会平衡开始/结束 session 调用吗?

javascript - 您如何在 Meteor 中存储特定于客户端的数据服务器端?

php - 过多使用 session 是否会降低 PHP 的性能?

php - 使用 flot、mysql、php 进行实时绘图

PHP 警告 ZipArchive::extractTo(): 权限被拒绝

php - Laravel:如何从一组集合中创建一个集合?

php - 从数据库中删除最早 7 天的行

php - 在查询中使用 REGEX 准备的 SQL 语句的安全性

php - 为什么我的 MySQL 数据库会添加空行?

php - 在 laravel 5.2 中查询 groupBy 内的原始数据