PHP标头重定向无法正常工作

时间:2009-01-08 10:55:06

标签: php

include('header.php');

$name = $_POST['name'];
$score = $_POST['score'];
$dept = $_POST['dept'];

$MyDB->prep("INSERT INTO demo (`id`,`name`,`score`,`dept`, `date`) VALUES ('','$name','$score','$dept','$date')");
// Bind a value to our :id hook
// Produces: SELECT * FROM demo_table WHERE id = '23'
$MyDB->bind(':date', $date);
// Run the query
$MyDB->run();

header('Location:index.php');
    exit;

以上代码一直给我一个重定向问题。错误如下:

  

警告:无法修改标头信息 - 已经发送的标头(输出       开始于/Applications/MAMP/htdocs/testygubbins/OO/test/header.php:15)       第16行/Applications/MAMP/htdocs/testygubbins/OO/test/form.php。

我对这完全感到沮丧。有谁知道我应该做些什么让它起作用?

修改

header.php代码:

<?php
include('class.user.php');
include('class.Connection.php');

$date = date('Y-m-j');

?>
<html>
<head>
    <link rel=StyleSheet href="css/style.css" type="text/css" media=screen>
    <title>Test</title>
</head>
<body>
<div id="page">

12 个答案:

答案 0 :(得分:45)

仔细查看您的包含 - 结束后可能还有一个空行?&gt; ?

这将导致一些文字空格作为输出发送,从而阻止您进行后续标题调用。

请注意,离开收盘是否合法?&gt;关闭包含文件,这是避免此问题的有用习惯。

(编辑:查看标题,如果要输出标题,则需要避免执行任何HTML输出,或使用输出缓冲来捕获它)。

最后,正如PHP manual page for header指出的那样,您应该使用完整的网址来重定向:

  

注意:HTTP / 1.1需要绝对值   URI作为位置的参数:   包括方案,主机名和   绝对路径,但有些客户接受   相对URI。你通常可以使用   $ _ SERVER [ 'HTTP_HOST'],   $ _SERVER ['PHP_SELF']和dirname()来   从亲戚那里做一个绝对的URI   一个人自己:

答案 1 :(得分:24)

常见问题:

1) echo... 命令之前应该没有输出(即 header(...); 或HTML部分)

2) header(...);之后您必须使用exit();

3)<?php之前和?>标记之后删除所有空白(或换行符)。

4)检查php文件(以及其他.php文件,include d) -  它们应该具有 UTF8而无BOM 编码(而不仅仅是 UTF-8 )。由于默认 UTF8 会在文件开头添加不可见字符(称为&#34; BOM &#34;),因此您应该避免这种情况!!!!!!! !!!!

5)使用301或302参考:

header("location: http://example.com",  true,  301 );  exit;

6) 启用错误报告。并告诉错误。

7)如果以上都没有帮助,使用JAVASCRIPT重定向(但是,不鼓励的方法),可能是自定义案例中的最后一次机会...:

echo "<script type='text/javascript'>window.top.location='http://website.com/';</script>"; exit;

答案 2 :(得分:8)

或者,不考虑文件中某处的换行符或空格,可以缓冲输出。基本上,您在文件的最开头调用ob_start(),在结尾调用ob_end_flush()。您可以在php.net ob-start function description找到更多详细信息。

修改 如果使用缓冲,则可以在header()函数之前和之后输出HTML - 缓冲将忽略输出并仅返回重定向标头。

答案 3 :(得分:5)

试试这个:

**ob_start();**

include('header.php');

$name = $_POST['name'];
$score = $_POST['score'];
$dept = $_POST['dept'];

$MyDB->prep("INSERT INTO demo (`id`,`name`,`score`,`dept`, `date`) VALUES ('','$name','$score','$dept','$date')");
// Bind a value to our :id hook
// Produces: SELECT * FROM demo_table WHERE id = '23'
$MyDB->bind(':date', $date);
// Run the query
$MyDB->run();

header('Location:index.php');

**ob_end_flush();**

    exit;

答案 4 :(得分:3)

查看/Applications/MAMP/htdocs/testygubbins/OO/test/header.php第15行。

在那个位置,它会产生一些输出。修理它。 :)

答案 5 :(得分:2)

如果我理解正确,已经从header.php(可能是某些HTML)发送了一些内容,因此标题已经设置好了。您可能需要重新检查header.php文件,以查找可能在第一个之前输出HTML或空格的任何部分

编辑:我现在确定它是由header.php引起的,因为你有那些HTML输出。您可以通过删除“include('header.php');”来解决此问题。并将以下代码复制到您的文件中。

include('class.user.php');
include('class.Connection.php');

        $date = date('Y-m-j');

答案 6 :(得分:2)

你可能在php文件中的某处有一些“纯文本”被解释为脚本输出。它甚至可能是php脚本标记说明符之前或之后的换行符(小于+问号+“php”)。

此外,如果我没记错,根据http规范,“Location”标题只接受完整的URL,而不是相对位置。记住这一点。

答案 7 :(得分:2)

不要包含header.php。当您要重定向时,不应输出HTML。

制作一个新文件,例如。 “pre.php”。把它放进去吧:

<?php
include('class.user.php');
include('class.Connection.php');
?>

然后在header.php中,包括它,而不是包括其他两个文件。 在form.php中,包括pre.php而不是header.php。

答案 8 :(得分:1)

您的include会产生输出,从而无法在以后发送http标头。两个选项:

  1. 在include之后将输出移动到某处。
  2. 使用output buffering,即在脚本开头放置ob_start(),最后放入ob_flush()。这使PHP能够首先等待收集所有输出,确定以什么顺序呈现它,然后输出它。
  3. 我建议你学习第二个选项,因为它会让你更灵活。

答案 9 :(得分:1)

还可以尝试使用include_once()而不是也可以使用的include()

答案 10 :(得分:0)

另请参阅 php 文件文本编码。我的UTF-8 BOM BOM,它阻止了脚本工作。但是在删除{{1}} ...

之后,现在可以完美地运行

答案 11 :(得分:-2)

尝试使用JavaScript进行重定向:

<script type="text/javascript">
  window.location.href='index.php';
</script>