问题描述
||
我写了这个自定义的会话处理程序!
请看一下[并查看下面的粗体错误文本,以帮助我找出错误的出处]
<?PHP
function sess_open($sess_path,$sess_name) {
return true;
}
function sess_close() {
return true;
}
function sess_read($sess_id)
{
$con = MysqLi_connect(\"localhost\",\"root\",\"\",\"database\");
$stmt = MysqLi_prepare($con,\"SELECT Data FROM sessions WHERE SessionID = ?\");
MysqLi_stmt_bind_param($stmt,\"s\",$sess_id);
MysqLi_stmt_execute($stmt);
MysqLi_stmt_bind_result($stmt,$data);
MysqLi_stmt_fetch($stmt);
if (is_null($data))
{
$CurrentTime = time();
MysqLi_stmt_close($stmt);
$stmt = MysqLi_prepare($con,\"INSERT INTO sessions (SessionID,Datetouched) VALUES (?,?)\");
MysqLi_stmt_bind_param($stmt,\"ss\",$sess_id,$CurrentTime);
MysqLi_stmt_execute($stmt);
return \'\';
}
else
{
MysqLi_stmt_close($stmt);
$stmt = MysqLi_prepare($con,\"UPDATE sessions SET Datetouched = ? WHERE SessionID = ?\");
MysqLi_stmt_bind_param($stmt,$CurrentTime,$sess_id);
MysqLi_stmt_execute($stmt);
return $sess_id;
}
}
function sess_write($sess_id,$data)
{
$con = MysqLi_connect(\"localhost\",\"database\");
$CurrentTime = time();
$stmt = MysqLi_prepare($con,\"UPDATE sessions SET Data = ?,Datetouched=? WHERE SessionID=?\");
MysqLi_stmt_bind_param($stmt,\"sss\",$data,$sess_id);
MysqLi_stmt_execute($stmt);
return true;
}
function sess_destroy($sess_id)
{
$con = MysqLi_connect(\"localhost\",\"DELETE FROM sessions WHERE SessionID = ?\");
MysqLi_stmt_bind_param($stmt,$sess_id);
MysqLi_stmt_execute($stmt);
return true;
}
function sess_gc($sess_maxlifetime)
{
$CurrentTime = time();
MysqLi_query($con,\"DELETE FROM sessions WHERE Datetouched + $sess_maxlifetime < $CurrentTime;\");
return true;
}
session_set_save_handler(\"sess_open\",\"sess_close\",\"sess_read\",\"sess_write\",\"sess_destroy\",\"sess_gc\");
session_start();
?>
这是[在上方]我的DB_Session.PHP文件
包括\'DB_Session.PHP \';
$ _SESSION [\'foo \'] = \“ BAR \”;
$ _SESSION [\'bar \'] = \“ FOO \”;
回声$ _SESSION [\'foo \']。 \'\'。$ _ SESSION [\'bar \'];
这是[在上面]我的session_start.PHP文件,它可以正常工作:)
包括\'DB_Session.PHP \';
echo $ _SESSION [\'foo \']。\'\'。$ _ SESSION [\'bar \'];
session_destroy();
echo $ _SESSION [\'foo \']。\'\'。$ _ SESSION [\'bar \'];
这是[在上面]我的session_finish.PHP文件,显示错误:(
尽管会话被完全破坏了,但是却给出了这个错误!
注意:未定义的索引:第4行的session_finish.PHP中的foo
注意:未定义的索引:第4行的session_finish.PHP中的bar
注意:未定义的索引:第6行的session_finish.PHP中的foo
注意:未定义的索引:第6行的session_finish.PHP中的bar
表结构
如果不存在sessions
,则创建表(
ID
int(11)NOT NULL AUTO_INCREMENT,
SessionID
char(26)DEFAULT NULL,
Data
文字,
Datetouched
int(11)DEFAULT NULL,
主键(ID
)
)ENGINE = InnoDB DEFAULT CHARSET = latin1 AUTO_INCREMENT = 1;
浏览session_start.PHP之后,我可以看到该值已存储在数据库中,并且浏览session_finish.PHP之后,该值已被完美删除,但是在销毁之前无法在其他页面中显示SESSION数据!
解决方法
session_finish.php文件在哪里?
但很可能您必须在使用变量之前定义变量(foo,baz)
确保该变量已定义,因此该通知不会出现
,DB_Session.php有问题!绝对是
当我使用自定义处理程序
session_set_save_handler(...)
删除行时,该行有效,但对该行却无效。所以问题出在您的函数中,但是我仍然找不到哪里?
DB_Session.php
<?php
function sess_open($save_path,$session_name) {
// my code
global $sess_save_path;
$sess_save_path = $save_path;
return true;
}
function sess_close() {
return true;
}
function sess_read($sess_id) {
$con = mysqli_connect(\"localhost\",\"root\",\"\",\"database\");
$stmt = mysqli_prepare($con,\"SELECT Data FROM sessions WHERE SessionID = ?\");
mysqli_stmt_bind_param($stmt,\"s\",$sess_id);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt,$data);
mysqli_stmt_fetch($stmt);
if (is_null($data)) {
$CurrentTime = time();
mysqli_stmt_close($stmt);
$stmt = mysqli_prepare($con,\"INSERT INTO sessions (SessionID,DateTouched) VALUES (?,?)\");
mysqli_stmt_bind_param($stmt,\"ss\",$sess_id,$CurrentTime);
mysqli_stmt_execute($stmt);
}
else {
mysqli_stmt_close($stmt);
$stmt = mysqli_prepare($con,\"UPDATE sessions SET DateTouched = ? WHERE SessionID = ?\");
mysqli_stmt_bind_param($stmt,$CurrentTime,$sess_id);
mysqli_stmt_execute($stmt);
}
// my code
global $sess_save_path;
$sess_file = \"$sess_save_path/sess_\" . $sess_id;
return (string) @file_get_contents($sess_file);
}
function sess_write($sess_id,$data) {
$con = mysqli_connect(\"localhost\",\"database\");
$CurrentTime = time();
$stmt = mysqli_prepare($con,\"UPDATE sessions SET Data = ?,DateTouched=? WHERE SessionID=?\");
mysqli_stmt_bind_param($stmt,\"sss\",$data,$sess_id);
mysqli_stmt_execute($stmt);
// my code
global $sess_save_path;
$sess_file = \"$sess_save_path/sess_\" . $sess_id;
if ($fp = @fopen($sess_file,\"w\")) {
$return = fwrite($fp,$data);
fclose($fp);
return $return;
}
else return false;
}
function sess_destroy($sess_id) {
$con = mysqli_connect(\"localhost\",\"DELETE FROM sessions WHERE SessionID = ?\");
mysqli_stmt_bind_param($stmt,$sess_id);
mysqli_stmt_execute($stmt);
// my code
global $sess_save_path;
$sess_file = \"$sess_save_path/sess_\" . $sess_id;
return(@unlink($sess_file));
}
function sess_gc($sess_maxlifetime) {
$CurrentTime = time();
mysqli_query($con,\"DELETE FROM sessions WHERE DateTouched + $sess_maxlifetime < $CurrentTime;\");
// my code
global $sess_save_path;
foreach (glob(\"$sess_save_path/sess_*\") as $filename) {
if (filemtime($filename) + $sess_maxlifetime < time()) {
@unlink($filename);
}
}
return true;
}
session_set_save_handler(\"sess_open\",\"sess_close\",\"sess_read\",\"sess_write\",\"sess_destroy\",\"sess_gc\");
session_start();
?>
尝试用此脚本替换您的脚本,并让mi知道那里发生了什么?
session_start.php的现场演示
session_finish.php的现场演示
所有3个脚本的下载链接(session.zip)。
,function sess_read($sess_id)
{
$con = mysqli_connect(\"localhost\",\"database\");
$stmt = mysqli_prepare($con,\"SELECT Data FROM sessions WHERE SessionID = ?\");
mysqli_stmt_bind_param($stmt,$sess_id);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt,$data);
mysqli_stmt_fetch($stmt);
if (is_null($data))
{
$CurrentTime = time();
mysqli_stmt_close($stmt);
$stmt = mysqli_prepare($con,?)\");
mysqli_stmt_bind_param($stmt,$CurrentTime);
mysqli_stmt_execute($stmt);
return \'\';
}
else
{
mysqli_stmt_close($stmt);
$stmt = mysqli_prepare($con,\"UPDATE sessions SET DateTouched = ? WHERE SessionID = ?\");
mysqli_stmt_bind_param($stmt,$sess_id);
mysqli_stmt_execute($stmt);
return $data; /* $sess_id; THIS WAS CREATING PROBLEM :X */
}
}
发现会话时错误是重现数据!