为什么PHP header();为他而不是我工作

时间:2018-09-18 07:30:42

标签: php header

INTRO: 首先:我知道How to fix "Headers already sent" error in PHP

我的问题不是关于为什么它不起作用。我知道为什么它不起作用,在header();之前有输出。我的问题是,为什么它对我正在学习的YT视频中的一个人有用,当他在header()之前具有相同的输出时

POST: 我是一名超级菜鸟PHP程序员,仅需几个星期即可自学。我正在尝试使用PHP制作登录系统,并从youtube视频中学习。我遇到了错误

  

无法修改标头信息-已发送的标头(输出始于Sites / Login / inc / header.php:5 ...

我想我知道为什么会出错。

我的代码:

index.php

<?php
require_once("inc/header.php");
?>
<?php
    if (func::checkLoginState($conn))
    {
        echo "Welcome" . $_SESSION["username"] . "!";
    } else
    {
        header("location:login.php");
    }
?>

<?php
require_once("inc/footer.php");
?>

functions.php(简短版本,因此返回false)

<?php
class func {
    public static function checkLoginState ($conn)
    {
        return false; 
    }
}
?>

header.php

<?php
include_once("config/config.php");
include_once("functions.php");
?>
<html>
    <head>
        <title>Login project</title>
    </head>
    <body>

config.php仅包含PDO数据库连接设置

footer.php关闭HTML标签

现在,如果我从header.php删除HTML标记,则header();函数将起作用。我一生无法弄清的是,为什么它对那个从我在youtube视频中学习的人有用(他有header.php中的html标签)。

在4:30,您可以看到他的header.php

在6:58可以看到他的index.php(他实际上在header()之前的文件中有html代码;在7:15才可以工作。)

在7:15,您可以在浏览器中看到index.php,它不会引发错误,并将其重定向到login.php

https://youtu.be/3xdxhfNg3Xg?t=4m30s

他也将HTML标记在header.php中,并将其包括在index.php中的if函数之前。我基本上有完全相同的代码。为了简化起见,我在checkLoginState函数中返回了false,因此它在index.php中的函数中执行了else部分。他不在任何地方使用ob_start();(应该可以解决此问题)。

这可能是我错过的一些基本知识,但是却使我非常烦恼。感谢您澄清这一点。另外,由于login.php似乎毫无用处,我应该如何重定向到header();

谢谢,祝你有美好的一天!

4 个答案:

答案 0 :(得分:2)

该错误仅在尝试发送标头之前,先在发送回浏览器时发生。

您在页面顶部有多个php标签,它们之间有空白。另外,您正在发回头文件中的文本。

直接从您的帖子中复制代码,在?>之后的第3行的两组标签之间有一个空格。

1. <?php
2. require_once("inc/header.php");
3. ?> 
4. <?php

您无需在这些行周围打开和关闭php标签。

<?php
    session_start();  // start the session here so you dont forget

    if (func::checkLoginState($conn))
    {
        require_once("inc/header.php");  // only include your top html template if you know you are good to go
        echo "Welcome" . $_SESSION["username"] . "!";
    } else
    {
        header("location:login.php");
    }

    require_once("inc/footer.php");
?>

这很好。

根据您的评论进行编辑

youtube视频可以按他想要的任何方式进行编辑。如果您进行到最后,请删除header redirect并放入登录表单。所以我敢打赌,这对他也不起作用。

答案 1 :(得分:0)

为什么会出现此类型错误

Cannot modify header information - headers already sent by
  1. 换行符或空格位于<?php之前

解决方案:删除<?php

之前的所有内容
  1. utf-8 encoded PHP文件中的BOM(字节顺序标记)

解决方案:将文件编码更改为“不带BOM”(例如,使用记事本++),或先删除BOM

  1. 在标头之前回声

    解决方案::删除删除标头之前的回声 使用ob_start();和ob_end_flush();用于缓冲的输出

Reference

答案 2 :(得分:0)

您可以使用output buffering control来防止标头过早发送出去。您参考的视频可能使用了它。否则他必须使用它来使它起作用。

例如,

<?php

ob_start(); // start buffering all "echo" to an output buffer

?>
<html>

<?php

if (func::checkLoginState()) {
    echo "Login";
} else {
    header('Location: /login.php');
}

?>

</html>

<?php ob_end_flush(); ?>

函数ob_start可以放在header.php或config中。函数调用ob_end_flush可以放在页脚中,也可以完全省略。

由于所有输出都写入输出缓冲区,而不是直接写入浏览器,因此可以在任何回显之后但在ob_end_flush之前使用header调用。

答案 3 :(得分:0)

因此,总而言之,我们无法弄清为什么它适用于视频中的那个人。谢谢大家尝试解决这个问题。理论是:

  1. 他编辑了视频,因此似乎可以使用此版本的代码
  2. 有and ob_start();和ob_end_flush();在代码中的某个位置,但在视频中看不到