PDO准备默默失败

Wab*_*son 7 php session pdo session-set-save-handler

我正在尝试使用PHP session_set_save_handler,我想使用PDO连接来存储会话数据.

我有这个函数作为写操作的回调:

function _write($id, $data) {
    logger('_WRITE ' . $id . ' ' . $data);
    try {
        $access = time();
        $sql = 'REPLACE INTO sessions SET id=:id, access=:access, data=:data';
        logger('This is the last line in this function that appears in the log.');
        $stmt = $GLOBALS['db']->prepare($sql);
        logger('This never gets logged! :(');
        $stmt->bindParam(':id', $id, PDO::PARAM_STR);
        $stmt->bindParam(':access', $access, PDO::PARAM_INT);
        $stmt->bindParam(':data', $data, PDO::PARAM_STR);
        $stmt->execute();
        $stmt->closeCursor();
        return true;
    } catch (PDOException $e) {
        logger('This is never executed.');
        logger($e->getTraceAsString());
    }
}
Run Code Online (Sandbox Code Playgroud)

前两条日志消息总是显示出来,但是后面的第三条消息永远$stmt = $GLOBALS['db']->prepare($sql)不会显示在日志文件中,也没有异常的痕迹.

会议 db表保持为空.

来自_close回调的日志消息始终存在.

这是我连接数据库的方式:

$db = new PDO('mysql:host=' . DBHOST . ';dbname=' . DBNAME, DBUSER, DBPASS);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Run Code Online (Sandbox Code Playgroud)

我有PHP 5.2.10.

我试图简单地$GLOBALS['db']->exec($sql)使用"手动准备"的$sql内容运行,但它仍然无声地失败.查询本身没问题,我可以通过db控制台执行它.


编辑:

在VolkerK发现问题之后,我发现这篇文章解释了这种奇怪现象背后的原因.也许它也可以为其他人提供信息.


第二次编辑:

最痛苦,最神奇的解决方案是我必须将以下函数调用添加到我的前端控制器(主index.php)文件的最后:

session_write_close();
Run Code Online (Sandbox Code Playgroud)

Vol*_*erK 4

我的赌注是: $GLOBALS['db'] 未设置或不是 pdo 的实例(不再?),因此发生PHP Fatal error: Call to a member function prepare() on a non-object并且 php 退出。

$sql = 'REPLACE INTO sessions SET id=:id, access=:access, data=:data';
logger('This is the last line in this function that appears in the log.');
if ( !isset($GLOBALS['db']) ) {
  logger('there is no globals[db]');
  return;
}
else if ( !is_object($GLOBALS['db']) ) {
  logger('globals[db] is not an object');
  return;
}
else if ( !($GLOBALS['db'] instanceof PDO) ) {
  logger('globals[db] is not a PDO object');
  return;
}
else {
  logger('globals[db] seems ok');
}

$stmt = $GLOBALS['db']->prepare($sql);
logger('This never gets logged! :(');
Run Code Online (Sandbox Code Playgroud)