Php 会话\u设置\u保存\u处理程序导致登录循环

Php 会话\u设置\u保存\u处理程序导致登录循环,php,mysql,session,Php,Mysql,Session,我正在尝试使用session\u set\u save\u handler()将会话写入数据库。我得到一个无限循环,我的系统想让我登录,但找不到会话,所以它让我注销。。。但是会议显然存在——只是不在会议桌上 无论如何,下面是我的会话函数代码-我认为这里没有任何错误: <?php // session.functions.php $db = new mysqli("127.0.0.1", "user", "pass", "db"); // define 'openSession()' f

我正在尝试使用
session\u set\u save\u 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;
}

?>
按功能设置:

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


你知道我做错了什么吗?

看来你把两种不同的时间格式搞混了。在mysql中,提供以下格式的时间:

根据函数是在字符串上下文中使用还是在数字上下文中使用,以“YYYY-MM-DD HH:MM:SS”或yyyyymmddhhmmss.uuuuu格式的值形式返回当前日期和时间

在php中,为您提供:

返回自Unix纪元(1970年1月1日00:00:00 GMT)以来以秒为单位测量的当前时间


在您的sql语句中,您正在比较这两种格式,但无法进行比较,因为它们的格式完全不同。

您似乎混淆了两种不同的时间格式。在mysql中,提供以下格式的时间:

根据函数是在字符串上下文中使用还是在数字上下文中使用,以“YYYY-MM-DD HH:MM:SS”或yyyyymmddhhmmss.uuuuu格式的值形式返回当前日期和时间

在php中,为您提供:

返回自Unix纪元(1970年1月1日00:00:00 GMT)以来以秒为单位测量的当前时间


在sql语句中,您正在比较这两个语句,但无法进行比较,因为它们的格式完全不同。

结果是,有一个额外的session\u start(),可以重置会话

原来有一个额外的session_start(),它将重置会话

缺少数据库架构。另外还有一个教程:
get\u magic\u quotes\u gpc()
和数据库转义是两个不同的主题。不要混用它们。添加了数据库架构并从代码中删除了get\u magic\u quotes\u gpc()。检查
会话\u set\u save\u处理程序的返回值
,如果失败将返回FALSE,成功将返回TRUE。bool(TRUE)或1。显然,如果缺少数据库模式,它可以通过print\u r和var\u dump进行检查。另外还有一个教程:
get\u magic\u quotes\u gpc()
和数据库转义是两个不同的主题。不要混用它们。添加了数据库架构并从代码中删除了get\u magic\u quotes\u gpc()。检查
会话\u set\u save\u处理程序的返回值
,如果失败将返回FALSE,成功将返回TRUE。bool(TRUE)或1。显然,它是通过服务器上脚本中的print_r和var_dumpfixed检查的。服务器上的脚本中没有骰子。已修复。没有骰子。
public function check_status() {
    if (empty($_SESSION['exp_user']) || @$_SESSION['exp_user']['expires'] < time()) {
        return false;
    } else {
        return true;
    }
}
// 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();
}
require('includes/session.functions.php');
session_set_save_handler('openSession', 'closeSession', 'readSession', 'writeSession', 'destroySession', 'gcSession');
session_start();
include('includes/authorisation.php');
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)