session_start()会导致致命错误

时间:2011-03-09 14:43:33

标签: php session fatal-error

我会保持这么简单。为什么在我的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数组中,然后重定向回原始页面即可。那里没有关于异常或类解构器的内容。

2 个答案:

答案 0 :(得分:0)

我认为在session _start之前没有回显或打印。

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

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

尝试

答案 1 :(得分:0)

NO GLOBALS !!!!!!!

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

然后只需使用

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

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

如果你可以为重构而烦恼,并且仍然只有holla。

我实际上并不认为这是问题所在......

我跑了

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();

并且没有错误......