heredoc干扰Post / Redirect / Get场景中的header()

时间:2012-01-16 21:52:06

标签: php heredoc post-redirect-get

我在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行)

所以这就是发生的事情:

  • 我用有效数据填写表格
  • 推'添加记录'
  • 然后在重新输入addToDb.php
  • 时重新显示表单
  • 我的记录成功添加到数据库中,但......
  • 我在浏览器中看不到index.php,我仍然看到addToDb.php
  • 我收到如上所述的错误消息,并在下面重复:

“警告:无法修改标头信息 - 已在第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?

1 个答案:

答案 0 :(得分:0)

标头必须是发送给客户端的第一件事。你可以在代码中做任何你喜欢的事情(即测试post / get变量),只要你没有向客户端发送任何数据(即使用echo或在php标签之外放置普通的html),然后再发送http标头。发送标题后,您当然可以随心所欲地做任何事情。

所以你得到错误:

Cannot modify header information - headers already sent by...

标题是在文档开头自动提供的,因为您没有在那里提供标题。