从PHP4到PHP5:会话处理程序无法访问全局DB对象

时间:2013-12-09 18:30:31

标签: php session

我正在将许多年前在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之间是否有什么变化导致这种情况,或者还有别的东西。

1 个答案:

答案 0 :(得分:0)

啊,找到了答案:

Strange behaviour migrating sessions with callbacks from php4 to php5

您需要手动调用session_write_close(),或将其注册为关闭函数:register_shutdown_function("session_write_close")