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头。 两个选项:
- 在include之后的某处移动输出。
- 使用输出缓冲 ,即在脚本的开始,放置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>