我正在将许多年前在PHP 4.4中编写的PHP应用程序迁移到运行PHP 5.3的新主机。该应用程序仅使用PEAR库而不是其他框架编写。我发现了以下问题:我的主页中有这段代码:
require_once('DB.php'); //the PEAR DB package
$db=DB::connect("mysql://usuario:@localhost/databasename");
if (DB::isError($db)) {
die("MEEEEEPT");
}
//Inicia sesión
session_set_save_handler("Sesion_Open", "Sesion_Close", "Sesion_Read", "Sesion_Write", "Sesion_Delete", "Sesion_Clean");
session_name("misesion");
session_start();
然后,会话处理程序是:
function Sesion_Open() {
global $db;
if (DB::isConnection($db)) { return true; }
else { return false; }
}
function Sesion_Close() {
global $db;
$db->disconnect();
return true;
}
function Sesion_Read($id) {
global $db;
$resultado=$db->query("SELECT datos FROM sesiones WHERE id='$id'");
$num=$resultado->numRows();
if ($num > 0) {
$row=$resultado->fetchRow(DB_FETCHMODE_ASSOC);
$resultado->free();
return $row['datos'];
}
else {
$resultado->free();
return "";
}
}
function Sesion_Write($id, $datos) {
global $db;
$datos=addslashes($datos);
$num=$db->getOne("SELECT COUNT(id) FROM sesiones WHERE id='$id'");
if ($num > 0) {
$sql="UPDATE sesiones SET datos='$datos', tiempo=now() WHERE id='$id'";
}
else {
$sql="INSERT INTO sesiones (id, tiempo, datos) VALUES ('$id', now(), '$datos')";
}
$resultado=$db->query($sql);
if (DB::isError($resultado)) { return false; }
else { return true; }
}
如果我尝试在会话中保存一些数据,请使用,比如说:
$_SESSION['bkla']="Doremifa";
它没有被保存:数据库会话表保持为空,我在日志中收到错误说:
PHP Fatal error: Call to a member function getOne() on a non-object in sesiones.php on line 45
参考“Sesion_Write”中的一行,我尝试在桌面上进行SELECT。
从我看到的,“Sesion_Open”函数可以正确访问$ db对象,但其他人看不到它;对象似乎并不存在。这是怎么回事?我几年没有触及过PHP,所以我不知道PHP4和PHP5之间是否有什么变化导致这种情况,或者还有别的东西。
答案 0 :(得分:0)
Strange behaviour migrating sessions with callbacks from php4 to php5
您需要手动调用session_write_close()
,或将其注册为关闭函数:register_shutdown_function("session_write_close")
。