PHP头redirect不工作

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; 

上面的代码不断给我一个redirect的问题。 错误如下:

警告:无法修改头文件信息 – / Applications / MAMP / htdocs / testygubbins / OO / test / form中已经发送的头文件(输出在/Applications/MAMP/htdocs/testygubbins/OO/test/header.php:15开始)。在线16的PHP。

我完全被这个迷失了。 有谁知道我应该怎么做才能使它工作?

编辑

header.php代码:

 <?php include('class.user.php'); include('class.Connection.php'); $date = date('Ym-j'); ?> <html> <head> <link rel=StyleSheet href="css/style.css" type="text/css" media=screen> <title>Test</title> </head> <body> <div id="page"> 

仔细看看你的包含 – 也许你在结束后有一个空白行?>?

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

请注意,离开include文件是合法的,这是避免这个问题的一个有用的习惯用法。

(编辑:看你的头,你需要避免做任何HTML输出,如果你想输出标题,或使用输出缓冲来捕获它)。

最后,正如PHP头文件指出的那样,你应该使用完整的URL来redirect:

注意:HTTP / 1.1需要一个绝对的URI作为Location的参数包括scheme,hostname和绝对path,但有些客户端接受相对URI。 您通常可以使用$ _SERVER ['HTTP_HOST'],$ _SERVER ['PHP_SELF']和dirname()自己创build绝对URI:

常见问题:

1)header(.......);之前不应有任何输出(即echo..或HTML代码header(.......); 命令。

2)<?php和after ?>标签之前删除任何空格 (或换行符 )。

3) 黄金规则! – 检查这个php文件(也include其他文件)是否有没有BOM编码的UTF8 (而不仅仅是UTF-8 )。 这是很多情况下的问题(因为UTF8编码的文件在开始的PHP文件中有一些特殊的字符,你的文本编辑器不显示)!!!!!!!!!!!

4)header(...); 你必须使用exit;

5)总是使用301或302参考:

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

6) 打开错误报告。 并告诉错误。

7)如果没有以上的帮助,使用JAVSCRIPTredirect(但强烈不推荐的方法),可能是自定义情况下的最后机会…:

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

或者,不要考虑文件中的换行符或空格,可以缓冲输出。 基本上,你在文件的最开始调用ob_start() ,最后调用ob_end_flush() 。 你可以在php.net ob-start函数描述中find更多细节。

编辑:如果使用缓冲,可以在header()函数之前和之后输出HTML – 缓冲将忽略输出并仅返回redirect头。

尝试这个 :

 **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; 

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

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

如果我理解正确,已经从header.php(也许一些HTML)发出的东西,所以头文件已经设置。 您可能需要重新检查您的header.php文件的任何部分,可能会输出HTML或空格之前,你的第一

编辑:我现在确信它是由header.php引起的,因为你有这些HTML输出。 你可以通过移除“include('header.php');” 行并将下面的代码复制到您的文件。

 include('class.user.php'); include('class.Connection.php'); $date = date('Ym-j'); 

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

另外,如果我没有记错,按照http规范,“Location”头只接受完整的URL,而不是相对位置。 请记住这一点。

不要包含header.php。 当你要redirect时,你不应该输出HTML。

创build一个新文件,例如。 “pre.php”。 把它放在里面:

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

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

您的包含产生输出,从而使它不可能稍后发送一个http头。 两个选项:

  1. 在include之后的某处移动输出。
  2. 使用输出缓冲 ,即在脚本的开始,放置ob_start(),并在最后放置ob_flush()。 这使PHP能够首先等待收集所有输出,确定以何种顺序呈现并输出。

我build议你学习第二个选项,因为它使你更加灵活。

也尝试include_once(),而不是include(),也可以工作

另请参阅你的PHP文件的文本编码。 Mine是带有BOM UTF-8 ,它阻止了脚本的工作。 但是,现在工作完美删除BOM

尝试使用JavaScript进行redirect:

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