【问题标题】:heredoc interfering with header() in Post/Redirect/Get scenarioheredoc 在 Post/Redirect/Get 场景中干扰 header()
【发布时间】:2012-02-11 19:03:47
【问题描述】:

我在 addToDb.php 中有一个 heredoc 表单(如下所示)。当用户单击表单上的提交按钮(下面表单中的“添加记录”按钮)时,表单将回传到 addToDb.php。

在确认表单上的数据正常后,我将数据添加到我的数据库并使用 header() 进行 303 重定向(这是我第一次尝试使用 post/redirect/get)。

我收到一个错误:

“警告:无法修改标头信息 - 标头已由 C:\xampp\htdocs\foo\addToDb.php 中的(输出开始于 C:\xampp\htdocs\foo\addToDb.php:165)发送在第 129 行和第 130 行的 C:\xampp\htdocs\foo\addToDb.php 中"

 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 行。)*

所以当“添加记录”提交按钮被按下时,相同的 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();

(注意:上面对 header 的两个调用出现在 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?

【问题讨论】:

    标签: php heredoc post-redirect-get


    【解决方案1】:

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

    所以你得到了错误:

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

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

    【讨论】:

    • 我做到了。谢谢。一旦我删除了所有调试回显和所有其他输出,重定向就可以正常工作到 index.php。我什至不得不删除一个 var_dump() 调用。
    猜你喜欢
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    相关资源
    最近更新 更多