我在我的应用程序中一直使用header()重定向到不同的页面,看看下面的代码。我已经将代码放在页面顶部,我没有使用任何评论
if(isset($_SESSION['loggedin'])){
header("Location: dashboard.php");
exit;
}
else {
require_once('models/validation.php');
require_once('config/database.php');
以及第50行下面我已经放了一些代码来检查登录凭据并将其重定向到dashboard.php
if( !empty($_POST['username']) || !empty($_POST['password'])) {
if( check_login($_POST['username'], $_POST['password'])) {
header("Location: dashboard.php");
exit;
第一组代码工作正常,因为当我登录并尝试访问index.php时,第一组代码开始运行并将我推回到dashboard.php
我正面临着下面第二组代码的问题,当我成功登录时,它不会将我重定向到dashboard.php,而是会给我以下错误
警告:无法修改标头 信息 - 已经发送的标题 (输出始于 /home/bhatkaln/public_html/test/admin-login/index.php:17) 在 /home/bhatkaln/public_html/test/admin-login/index.php 第54行
我哪里出错了?是否可以使用header()进行重定向,或者我应该考虑使用替代
<meta http-equiv="refresh" content="0;dashboard.php"/>";
编辑:抱歉,我更新了我的错误代码,这是我的第53,54和55行。
if( check_login($_POST['username'], $_POST['password'])) {
header("Location: dashboard.php");
exit;
答案 0 :(得分:5)
必须在PHP的任何其他输出之前调用Header()。
答案 1 :(得分:4)
是的,可以使用header()进行重定向。而且它是唯一的标准方式。
因此,您必须修复此错误。只需检查index.php中的第17行,如错误消息中所述。努力阅读错误消息总是值得的
似乎需要更多澄清。
查看我们的网站,我们可以发现它使用HTTP协议 通过查看HTTP协议,我们可以发现它是非常简单的纯文本协议,服务器响应具有非常原始的结构:它只是一些文本行,除以2部分:控制头部分和页面部分。零件由空行分隔。服务器响应中的第一个空行是分隔符。
因此,通常的HTTP服务器响应看起来像
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Vary: Accept-Encoding
Date: Sun, 19 Sep 2010 15:15:44 GMT
Content-Length: 7644
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Frequently Asked Questions - Stack Overflow</title>
我们可以注意到标题和正文之间有一条空行。所有其他空行没有任何特殊效果,只有第一行。
还有一条规则:标题必须始终存在。可以有没有正文的标题,但没有至少一个标题就不能显示页面正文。
所以,其余的很清楚:如果已经发送了身体部位,则无法发送标题。一个空行 - 一个分隔符 - 已经发送,并且没有办法告诉浏览器它是我们现在正在发送的标题。它将被解释为身体的一部分,没有特殊效果。因此,PHP不会发送它但会引发错误。
为防止此类错误,应使用明智的应用程序布局。通常,每个页面应由2部分组成:逻辑部分和可视化部分。在完成所有逻辑之前,不应启动任何可视化 知道这一点,我们可以假设让index.php与HTML布局的一部分是非常糟糕的主意。非常诱人,但非常糟糕和误导。您可以将index.php用作前端控制器,但它不应包含HTML标记。但是包括一个文件。
使您的页面布局如下(假设我们不使用前端控制器但使用单独的脚本):
news.php:
<?
include "config.php";
//you can do any redirects here
$data = getdbdata("SELECT * FROM news where id = %d",$_GET['id']);
$page_title = $data['title'];
$body = nl2br($data['body']);
$tpl_file = "tpl.news.php";
//or here
//only if everything is OK and you have all data ready - start output:
include "template.php";
?>
template.php(就像你的index.php一样):
<html>
<head>
<title><?=$page_title?></title>
</head>
<body>
<? include $tpl_file?>
</body>
tpl.news.php
<h1><?=$page_title?></h1>
<?=$body?>
其中tpl.news.php
不是包含任何数据操作但仅包含模板的常规PHP文件,仅包含(D)HTML和用于显示以前准备的数据的基本PHP。那非常重要!如果你要使用$ page作为常规的PHP脚本,它将破坏整个想法。
答案 2 :(得分:2)
这听起来更像是你的一个包含文件中有空格,然后是不正确使用标题。检查validation.php文件以确保没有空白区域或第141行回显的内容。