php自定义会话处理程序——write + close函数不能访问全局连接变量


php custom session handler -- write + close functions do NOT have access to global connection variable

我正在修改http://phpsecurity.org/code/ch08-2以使用mysqli函数,并且我遇到了一个奇怪的问题,其中_write函数无法访问数据库。错误如下。似乎在_write + _close函数中$_sess_db变量不可用。我已经在读取功能中验证了连接是否可用。

注意:如果我在_write + _close函数中重新连接到数据库,我可以得到这个工作;但这并不理想,因为它应该只在_open函数中打开一次。

ALSO:我知道全局变量不是最好的解决方案;但是请只对这个问题留下评论和答案。

错误:

Warning: mysqli_real_escape_string() expects parameter 1 to be mysqli, null given in /Applications/MAMP/htdocs/phppos/resellers_session.php on line 47
Warning: mysqli_real_escape_string() expects parameter 1 to be mysqli, null given in /Applications/MAMP/htdocs/phppos/resellers_session.php on line 48
Warning: mysqli_real_escape_string() expects parameter 1 to be mysqli, null given in /Applications/MAMP/htdocs/phppos/resellers_session.php on line 49
Warning: mysqli_query() expects parameter 1 to be mysqli, null given in /Applications/MAMP/htdocs/phppos/resellers_session.php on line 54
Warning: mysqli_close() expects parameter 1 to be mysqli, null given in /Applications/MAMP/htdocs/phppos/resellers_session.php on line 17
代码:

<?php
session_set_save_handler('_open', '_close', '_read', '_write', '_destroy', '_clean');
session_start();
function _open()
{
    global $_sess_db;
    $_sess_db = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_DBNAME);
     return TRUE;
}
//CANNOT CONNECT TO DATABASE
function _close()
{
    global $_sess_db;
    return mysqli_close($_sess_db);
}
//CANNOT CONNECT TO DATABASE
function _write($id, $data)
{   
    global $_sess_db;
    $access = time();
    $id = mysqli_real_escape_string($_sess_db, $id);
    $access = mysqli_real_escape_string($_sess_db,$access);
    $data = mysqli_real_escape_string($_sess_db, $data);
    $sql = "REPLACE 
            INTO sessions
            VALUES  ('$id', '$access', '$data')";
    return mysqli_query($_sess_db, $sql);
}

从您所展示的代码中,您没有显式调用session_write_close(),而是等待PHP在脚本关闭阶段隐式关闭和写入会话。不幸的是,这种隐式操作发生在全局变量的作用域之外——因此出现了null s。

如果你坚持使用全局变量,那么下面的东西应该可以为你工作:

register_shutdown_function('shutdown');
function shutdown()
{
    session_write_close();
}

我会仔细考虑使用你的自定义会话处理程序-你有什么是不健壮的,虽然它似乎在一些轻测试下正确工作,你可能会以一个严重的头痛结束,如果你不完全了解发生了什么。