0

我会保持这个简单。为什么在我的 PHP 脚本顶部调用session_start(),我在底部得到这个输出:

Fatal error: Exception thrown without a stack frame in Unknown on line 0

这是怎么回事?

编辑:一些进一步的细节,因为我已经进一步隔离了问题。

index.php(摘抄):

<?php
session_start();

require_once('inc/database.php');
require_once('inc/gallery.php');
...

database.php

<?php
try {
    $dsn = 'mysql:host=localhost;dbname=tees_db';
    $pdo = new PDO($dsn, '[username removed]', '[password removed]');
}
catch (PDOException $e) {
    header('HTTP/1.1 503 Service Unavailable');
    die('There was an error connecting to the database.');
}

gallery.php(摘抄):

<?php
class Gallery {
    private $pdo;
    public function __construct() {
        global $args, $pdo, $request;
        $this->pdo = $pdo;
    }
    ...
}
$gallery = new Gallery();

Gallery当我尝试将全局$pdo变量分配为类属性时,问题就出现在课堂上。$pdo当只是一个 PDO 实例时,为什么这会导致致命错误?

编辑 2:我发现关闭浏览器并重新启动(终止会话)会抑制错误。该错误仅在inc/confirm.php被调用时触发。

inc/confirm.php是用于 18 岁以上确认的脚本。内容很少:

session_start();

if (isset($_GET['mod'])) {
    $mod = $_GET['mod'];
    $_SESSION[$mod] = '1';
}

header('Location: '.$_SERVER['HTTP_REFERER']);
exit;

如您所见,只需在$_SESSION数组中保存一个键并重定向回原始页面。那里没有关于异常或类解构器的信息。

4

2 回答 2

0

我假设在 session _start 之前没有回声或打印。

如果函数调用前有空格,请尝试将其删除。

在调用 session_start 之前尝试 ob_clean 。我不知道副作用。:(

尝试

于 2011-03-09T14:48:39.907 回答
0

没有全球!!!!!!!

为您的数据库连接创建一个包装器(如果您只有一个 db,则单例类是“OK” - 如果您有更多,则需要修改一个(如果您需要示例))。

然后只需使用

class Gallery {
    private $pdo;
    public function __construct() {

        $this->pdo = DBObj::getInst();
    }
    ...
}
$gallery = new Gallery();

如果您可以费心重构并且仍然有问题,那就好了。

我实际上并不认为这是这里的问题......

我跑了

session_start();

try {
    $dsn = 'mysql:host=localhost;dbname=DB';
    $pdo = new PDO($dsn, 'UN', 'PW');
}
catch (PDOException $e) {
    header('HTTP/1.1 503 Service Unavailable');
    die('There was an error connecting to the database.');
}

class Gallery {
    private $pdo;
    public function __construct() {
        global $args, $pdo, $request;
        $this->pdo = $pdo;
    }

}

$gallery = new Gallery();

并且没有错误...

于 2011-03-10T10:20:07.783 回答