我在addToDb.php中有一个heredoc形式(如下所示)。当用户单击表单上的提交按钮(下表中的“添加记录”按钮)时,表单会发回addToDb.php。
在验证表格上有好的数据后,我将数据添加到我的数据库并使用header()来重定向303(这是我第一次尝试使用post / redirect / get)。
我收到错误:
“警告:无法修改标头信息 - 已在C:\ xampp \ htdocs \ foo \ addToDb.php中发送的标头(在C:\ xampp \ htdocs \ foo \ addToDb.php:165处开始输出)在第129行和C:\ xampp \ htdocs \ foo \ addToDb.php第130行“
echo <<<_END
<h1>Please add a new student....</h1>
<p>Fields with an asterisk (*) are required fields.</p>
<form action="addToDb.php" method="post">
<b><i>First name *</b></i> : <input type="text" name=$firstNameLabel /><br />
Middle initial : <input type="text" name=$middleInitialLabel /><br />
<b><i>Last name *</b></i> : <input type="text" name=$lastNameLabel /><br />
<b><i>School*</i></b> : <input type="text" name=$schoolLabel size=40/><br />
Grade: <input type="text" name=$gradeLabel /><br />
<b><i>Email *</b></i> : <input type="text" name=$emailLabel size=40 /><br />
<input type="submit" name="addrecord" value="ADD RECORD" /><br />
</form>
_END;
*(注意:上面的_END,它关闭了heredoc,出现在addToDb.php的第165行 - 我得到的错误消息中提到了第165行。)*
因此,当按下“ADD RECORD”提交按钮时,将重新输入相同的addToDb.php文件,并再次显示与上面相同的格式。
当由于提交而重新输入addToDb.php时,我检查用户提供的有效表单数据,并保存到数据库中,如果它是有效数据并调用header(),如下所示:
// check for valid form data and add to the database, then redirect now.........
header("HTTP/1.1 303 See Other");
header("Location: http://localhost/foo/index.php");
exit();
(注意:上面标题的两个调用显示在addToDb.php的第129行和第130行)
所以这就是发生的事情:
“警告:无法修改标头信息 - 已在第129行的C:\ xampp \ htdocs \ foo \ addToDb.php中发送的标头(输出从C:\ xampp \ htdocs \ foo \ addToDb.php:165开始)在第130行的C:\ xampp \ htdocs \ foo \ addToDb.php中“
我过去使用过heredoc方法没有任何问题。
但这是我生命中第一次尝试实施Post / Redirect / Get。
那么 - heredoc是否会以某种方式干扰我的PRG?
答案 0 :(得分:0)
标头必须是发送给客户端的第一件事。你可以在代码中做任何你喜欢的事情(即测试post / get变量),只要你没有向客户端发送任何数据(即使用echo或在php标签之外放置普通的html),然后再发送http标头。发送标题后,您当然可以随心所欲地做任何事情。
所以你得到错误:
Cannot modify header information - headers already sent by...
标题是在文档开头自动提供的,因为您没有在那里提供标题。