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