警告:无法修改标题信息 - 已在/home/blocexco/public_html/classes/mysql/mysql.security.php上发送的输出(由/home/blocexco/public_html/homepage.php:73开始输出) 99
对于第100行的mysql.security.php,第二次重复此错误。
主页:73
<div class="login">
<?php require_once 'login.php'; ?>
</div>
mysql.security.php:99-100
setcookie('username', "", time() - (60 * 60 * 24 * 365));
setcookie('password', "", time() - (60 * 60 * 24 * 365));
我知道这不是我读过的“BOM”问题。我调用header()和setcookie()函数之前和之后都有输出 - 这是必要的,因为主页包含一个php文件,然后注入正确的登录或注销表单。
我听说过在内容的开头使用ob_start(),但这不是一个非常具体的指令......我尝试将它放在homepage.php的开头(就在html标签之前)并且没有'解决任何问题。
我是PHP的新手(几天后,一般来说是web-app dev的新手)。说实话,它让我感到震惊,我不能只改变我所在的页面或创建cookie,通过php而不会向后弯曲......
答案 0 :(得分:3)
您需要将所有setcookie
函数调用移到输出之上,因为setcookie
实际上会发送HTTP标头,而在输出内容后您无法执行此操作。
答案 1 :(得分:1)
好吧,在输出启动后,您无法输出任何标题,包括Cookie。期。
这是一个简单的技术限制,因为HTTP标头需要在HTTP主体之前发送。这不是PHP的错误。
您应该首先确定应该发送的方式来构建您的应用并收集所有必要的数据,然后继续输出实际的HTML。混合逻辑在主HTML体内是混乱的,但你看它。例如,查看MVC模式。
答案 2 :(得分:1)
它与php没有任何关系。基本原则是您的浏览器首先需要标题,稍后会有内容。
现在您只发送了一次标头。因此,如果您执行的操作主要包括发送标头(例如header()
),那么应该首先执行此操作。
如果您已经发送了标题(隐含地,因为您开始输出),则无法再次发送它们。
底线是,如果你想控制你的标题,你必须做的第一件事。这就像想要在节目已经开始之后改变介绍一样。如果使用ob_start
函数,则将所有输出保存到cerain点。我不会推荐这个;使您的程序流动,以便您知道要发送的标头,并先发送它们。然后调用产生输出的函数。
答案 3 :(得分:0)
如果您想在某人登录后设置Cookie,则可以在另一个.php文档中设置Cookie,以便发布表单以验证用户的输入。他们仍然必须超过任何输出。
答案 4 :(得分:0)
确保调用设置cookie是处理的第一件事。
所以这个:
setcookie('username', "", time() - (60 * 60 * 24 * 365));
setcookie('password', "", time() - (60 * 60 * 24 * 365));
应该在任何输出之前尽快调用。
要解决此问题,您可能需要执行以下操作: 并测试它。
然后使用以下方法在相关的php文件中重新添加:
echo '<div class="login">';