0

可能重复:
PHP 已发送的标头

所以我的网站基于一个脚本,其中包括页眉、文件夹中的页面,然后是页脚。我现在尝试引入登录系统,但问题是我不断收到已经发送的标题。这是我必须编写的代码,以便如果未设置会话,则重定向。

<?php 

if(empty($_SESSION['user'])) 
{ 

    header("Location: login.php"); 

    die("Redirecting to login.php"); 
} 
?> 

现在我说得对,标题已经发送问题,你可以在这里看到第一手资料 - http://www.cogameservers.com/ncms这不是因为标题内容已经显示,导致标题已经发送?

所以我有一个变量设置为一个名为 p 的 $_GET 变量,我可以制作一堆 if else 语句来实现它,以便如果 $_GET["p"] == home,那么我执行顶部的标题我的 header.php,是第一个调用的页面。

很抱歉,这可能看起来令人困惑,请在您希望看到的代码上留下请求


索引.php

<?php 
include($_SERVER['DOCUMENT_ROOT'].'/ncms/lib/php/_dc.php');
include($_SERVER['DOCUMENT_ROOT'].'/ncms/lib/php/_ncms_fns.php');

$script   = $_SERVER['SCRIPT_NAME'];
error_reporting(E_ALL);
include($_SERVER['DOCUMENT_ROOT'].'/ncms/default/header.php');
if($_GET["p"] == 'ncms' || !isset($_GET["p"])) {
    include($_SERVER['DOCUMENT_ROOT'].'/ncms/pages/home.php');
} else if(file_exists($_SERVER['DOCUMENT_ROOT'].'/ncms/pages/'.$_GET["p"].'.php')) {
    include($_SERVER['DOCUMENT_ROOT'].'/ncms/pages/'.$_GET["p"].'.php');    
} else {
    include($_SERVER['DOCUMENT_ROOT'].'/ncms/default/404.php'); 
}
include($_SERVER['DOCUMENT_ROOT'].'/ncms/default/footer.php');
?>

谢谢 - 死灵。

4

5 回答 5

2

那是因为你有并且当变量不存在error_reporting(E_ALL);时它会显示一个通知,这将导致标题已经发送通知。$_GET

用。。。来代替:

if(!isset($_GET["p"])) {
    include($_SERVER['DOCUMENT_ROOT'].'/ncms/pages/home.php');
} else if(file_exists($_SERVER['DOCUMENT_ROOT'].'/ncms/pages/'.$_GET["p"].'.php')) {
    include($_SERVER['DOCUMENT_ROOT'].'/ncms/pages/'.$_GET["p"].'.php');    
} else {
    include($_SERVER['DOCUMENT_ROOT'].'/ncms/default/404.php'); 
}

如果$_GET['p']不存在,您会收到未定义的索引通知。

或者您可以更改:

$_GET["p"] = isset($_GET["p"]) ? $_GET["p"] : '';
if($_GET["p"] == 'ncms' || $_GET["p"] == '') {

并在代码执行后添加标头,标头之前不应存在输出。

我看到您的问题仍然存在于第 85 行的 common.php 中。因为它输出了一些东西。验证

于 2012-09-29T05:45:58.637 回答
0

当您尝试在发送标头之前发送一些数据时会发生这种情况......因为您已经将它们与数据一起发送了。重定向必须位于页面上的任何其他内容之前。这包括您的大标题文本和所有错误。这还包括从服务器发送到浏览器的任何 HTML(可见或不可见)。每当服务器向浏览器发送任何内容时,它都会发送标头并且您无法再次发送它们。

因此,将重定向的代码移动到所有“标题”文本内容之上并修复其他错误。

于 2012-09-29T05:45:50.853 回答
0

您应该session_start在输出任何内容之前调用。或者您的代码之前可能有一些空白<?php

于 2012-09-29T05:46:09.277 回答
0

如果在 header.php 的开头似乎没有尾随空格,则可能是 BOM 问题。如果您的编辑器配置为将文件保存为“utf-8 with bom”或“utf-16 with bom”,则这些“字节顺序掩码”被视为 php 的输出。

于 2012-09-29T07:54:35.687 回答
-1

删除<?phpstatemnet 之前的空格,然后重试。

<?php如果语句前有空格,有时它会给出错误消息。

于 2012-09-29T05:44:07.860 回答