【问题标题】:session_start() causes fatal errorsession_start() 导致致命错误
【发布时间】:2011-03-09 14:43:33
【问题描述】:

我会保持简单。为什么在我的 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();

当我尝试将全局 $pdo 变量分配为类属性时,问题出现在 Gallery 类中。当$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 数组中保存一个键并重定向回原始页面。那里没有关于异常或类解构器的内容。

【问题讨论】:

  • bugs.php.net/bug.php?id=33598 ?你确定是 session_start() 吗?
  • 我没有__destruct 方法,更不用说一个抛出异常了;我已经通过删除它将它隔离到session_start() 调用,这也抑制了错误。
  • 但如果 session_start 失败,它会在页面顶部显示错误......
  • 你把它简单了。尝试为您的问题添加更多详细信息。错误可能在于调用 session_start() 的上下文中。尝试更好地描述它或在 session_start() 之前的行中发布回溯。

标签: php session fatal-error


【解决方案1】:

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

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

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

试试

【讨论】:

    【解决方案2】:

    没有全球!!!!!!!

    为您的数据库连接创建一个包装器(如果您只有一个 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();
    

    并且没有错误...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多