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是完全删除后的值,但破坏之前无法显示在其他网页会话数据!

+0

请改善此脚本或给出任何建议,使其更好! – Sourav 2011-04-13 14:05:35

+0

更适合http://codereview.stackexchange.com/ – 2011-04-13 14:09:05

+0

@Col。弹片*在质量和数量上比codereview.stackexchange获得更多的用户!所以,PLZ不要关闭它! Lot的标签在codereview.stackexchange中丢失:( – Sourav 2011-04-13 14:26:12

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数据会话时发现!

其中是session_finish.php文件? 但最有可能你使用它们 之前,以确保变量是定义所以此通知将不会出现你必须定义变量(FOO,巴兹)

+0

@hish看看突出显示的行,我用粗体显示文件名 – Sourav 2011-04-13 14:14:55

+0

@hish我已经在session_start中定义了会话,然后浏览了session_finish,并且得到了那些错误 – Sourav 2011-04-13 14:31:11

+0

会话中没有变量(foo,baz) – hish 2011-04-13 14:31:18

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知道这是怎么回事呢?

+0

nope,同样的错误存在:( – Sourav 2011-04-14 03:46:24

+0

@Sourav,你怎么称呼session_start.php和session_finish.php?直接或者从某个地方包括? – Wh1T3h4Ck5 2011-04-14 03:55:19

+0

@ Wh1T3h4Ck5直接!我只是检查它是否有效! – Sourav 2011-04-14 03:56:42