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