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">
答案 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标头。两个选项:
我建议你学习第二个选项,因为它会让你更灵活。
答案 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>