已发送标头,尝试了多种解决方案

时间:2017-07-13 11:01:20

标签: php

所以我在这里读了很多问题,但没有人帮我解决问题。

我有这个PHP页面加载时出现此错误: -

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /Library/WebServer/Documents/k/editprofile.php:1) in /Library/WebServer/Documents/k/class/class.user.php on line 2

Warning: Cannot modify header information - headers already sent by (output started at /Library/WebServer/Documents/k/editprofile.php:1) in /Library/WebServer/Documents/k/verify_user.php on line 4

我已经检查过,并且没有" echo"或"打印"或任何空格。 这个错误可能是什么原因?

档案: -

editprofile.php

<?php
include 'class/class.user.php';
include 'common_includes.php';
$user = new user();
.
.
.

class.user.php

<?php
session_start();
include 'dbconnector.php';
class user{
.
.
.

verify_user.php

<?php
if((!isset($_SESSION['logged'])) || ($_SESSION['logged'] != 1))
{
header("Location:login.php?error=Please Login First");
}
?>

dbconnector.php

<?php
$connectionString = 'mysql:host=127.0.0.1;dbname=k';
try
{
$conn = new PDO($connectionString, 'root', 'k');
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e)
{
echo $e->getMessage();
}
?>

common_includes.php

<?php
include 'verify_user.php';
include 'config.php';
?>

1 个答案:

答案 0 :(得分:0)

HTTP响应需要以标题开头,然后是正文。在PHP页面中,您回显或包含为混合HTML的任何内容都将进入正文,因此如果您开始回显,然后写入标题,它将失败。这很棘手,因为PHP让人很容易(有些人会说太容易)在不知情的情况下写入正文。

仅从你的片段中,我看到了两件大事:

  1. 您使用PHP关闭?>结束文件。这意味着它被认为是内容之后的一切。即使它看起来没有任何后续的东西,它也很容易。额外的空间甚至换行都会破裂。解决方案:不要将?>放在文件的末尾。它没有任何优势,大多数现代PHP风格指南都会主动禁止它。
  2. echo中运行header()之前,您可能会发生verify_user.php次。如果您要回复PDOException,之后您可能只想die,以便它不会写错误消息,然后设置标题。检查标题之前可能运行的任何其他回声。
  3. 一般情况下,您希望尽可能早地设置标题。