PHP / MySQL中的custom / 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,$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 */
 }
}
发现会话时错误是重现数据!     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...