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();
?
谢谢,祝你有美好的一天!
答案 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
<?php
之前 解决方案:删除<?php
utf-8 encoded
PHP文件中的BOM(字节顺序标记)解决方案:将文件编码更改为“不带BOM”(例如,使用记事本++),或先删除BOM
在标头之前回声
解决方案::删除删除标头之前的回声 使用ob_start();和ob_end_flush();用于缓冲的输出
答案 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)
因此,总而言之,我们无法弄清为什么它适用于视频中的那个人。谢谢大家尝试解决这个问题。理论是: