PHP/MySQL中的自定义/ DB会话 - 在其他页面显示ERROR
我写了这个自定义会话处理程序!
PLZ看看[,并期待在下面以粗体显示的错误文本帮我找出错误所在]PHP/MySQL中的自定义/ DB会话 - 在其他页面显示ERROR
<?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,"ss",$CurrentTime,$sess_id);
mysqli_stmt_execute($stmt);
return $sess_id;
}
}
function sess_write($sess_id, $data)
{
$con = mysqli_connect("localhost", "root", "","database");
$CurrentTime = time();
$stmt = mysqli_prepare($con,"UPDATE sessions SET Data = ?,DateTouched=? WHERE SessionID=?");
mysqli_stmt_bind_param($stmt,"sss",$data,$CurrentTime,$sess_id);
mysqli_stmt_execute($stmt);
return true;
}
function sess_destroy($sess_id)
{
$con = mysqli_connect("localhost", "root", "","database");
$stmt = mysqli_prepare($con,"DELETE FROM sessions WHERE SessionID = ?");
mysqli_stmt_bind_param($stmt,"s",$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文件
include'DB_Session.php';
$ _SESSION ['foo'] =“BAR”;
$ _SESSION ['bar'] =“FOO”;
echo $ _SESSION ['foo']。 ''。$ _ SESSION ['bar'];
这是[在高于]我session_start.php文件,它完美地工作:)
包括 'DB_Session.php';
echo $ _SESSION ['foo']。' ”。$ _ SESSION [ '酒吧'];
session_destroy();
echo $ _SESSION ['foo']。' ”。$ _ SESSION [ '酒吧'];
这是[在上述]我session_finish.php文件,该文件显示错误:(
这给这个错误,但是会话完全破坏
!注意:未定义指数:中foo session_finish上线.PHP 4
说明:未定义指数:酒吧session_finish.php第4行
说明:未定义指数:在session_finish FOO上线.PHP 6
说明:未定义指数:酒吧session_finish.php第6行
表结构
CREATE TABLE IF NOT EXISTS
sessions
(ID
INT(11)NOT NULL AUTO_INCREMENT,SessionID
CHAR(26)DEFAULT NULL,Data
文本,DateTouched
INT(11)DEFAULT NULL,
PRIMARY KEY(ID
)
)ENGINE = InnoDB的默认字符集= LATIN1 AUTO_INCREMENT = 1;
浏览session_start.php后,我可以看到越来越值存储在数据库和浏览session_finish.php是完全删除后的值,但破坏之前无法显示在其他网页会话数据!
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,"ss",$CurrentTime,$sess_id);
mysqli_stmt_execute($stmt);
return $data; /* $sess_id; THIS WAS CREATING PROBLEM :X */
}
}
错误是returing数据会话时发现!
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,"ss",$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", "root", "","database");
$CurrentTime = time();
$stmt = mysqli_prepare($con,"UPDATE sessions SET Data = ?,DateTouched=? WHERE SessionID=?");
mysqli_stmt_bind_param($stmt,"sss",$data,$CurrentTime,$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", "root", "","database");
$stmt = mysqli_prepare($con,"DELETE FROM sessions WHERE SessionID = ?");
mysqli_stmt_bind_param($stmt,"s",$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_finish.php
- 下载链接,所有3个脚本(session.zip)session_start.php
- 现场演示。
nope,同样的错误存在:( – Sourav 2011-04-14 03:46:24
@Sourav,你怎么称呼session_start.php和session_finish.php?直接或者从某个地方包括? – Wh1T3h4Ck5 2011-04-14 03:55:19
@ Wh1T3h4Ck5直接!我只是检查它是否有效! – Sourav 2011-04-14 03:56:42
请改善此脚本或给出任何建议,使其更好! – Sourav 2011-04-13 14:05:35
更适合http://codereview.stackexchange.com/ – 2011-04-13 14:09:05
@Col。弹片Stackoverflow在质量和数量上比codereview.stackexchange获得更多的用户!所以,PLZ不要关闭它! Lot的标签在codereview.stackexchange中丢失:( – Sourav 2011-04-13 14:26:12