没有header()或meta的PHP重定向

时间:2011-01-22 17:00:01

标签: php redirect header require

我正在尝试设计一个执行某些数据库操作的页面,然后将用户重定向回他们来自的页面。问题是我使用require()函数来获取与数据库的连接,因此标题已经发送。元标记是不可能的,因为我希望它看起来像所有进程都是从它们来自的页面完成的。有小费吗?有没有办法可以使用require()header()或者我必须删除一个?是否有替代header()

6 个答案:

答案 0 :(得分:7)

如果在发送某些内容之前无法发送header(),请在发送任何内容之前在脚本的开头放置ob_start(); output buffering。这样,任何内容都将存储在缓冲区中,直到脚本结束或手动发送缓冲区内容时才会发送。

另一方面,简单地require另一个文件不会生成任何标题/内容,除非包含的脚本发送它们。最常见的“隐藏”原因是在<?php ?>标记之前或之后没有注意到空格。

答案 1 :(得分:4)

正如Artefacto所指出的,连接到数据库不应该要求任何输出。修复您输入的任何内容(例如database_connect.php)。请参阅“已发送标头”问题的this search,这可能会帮助您找到“隐藏”输出。

答案 2 :(得分:2)

ob_start(); // start output buffering
echo "<html......"; // You can even output some content, it will still work.
.
.
.
.
.
header("Location: mypage.php");
ob_flush(); //flush the buffer

在这种情况下,所有输出都被缓冲。这意味着首先处理标题,然后输出结果......

答案 3 :(得分:1)

在发送一些内容后,您无法发送任何标头。将header()来电移至require()来电之前。

答案 4 :(得分:0)

在将任何数据发送到客户端后,您无法发送标头。

但是,使用require并不表示您输出了某些内容。如果我理解您的权利,您可以包含数据库文件,运行查询,然后重定向用户。这完全有效。

如果你需要发送一些输出(为什么你需要进行重定向?)另一种选择是使用输出缓冲。通过使用输出缓冲,当您回显它时,您不会将数据发送到浏览器,而是将其存储在缓冲区中。当您致电ob_end_flush或到达脚本末尾时,将发送数据。在ob_end_flush之后,您将无法发送任何新标头。您使用ob_start开始输出缓冲。

答案 5 :(得分:0)

当我使用输出缓冲时,可以将header()require()一起使用。这意味着整个脚本都被缓冲,并在脚本结束时首先发送。

我这样做了

ob_start("ob_gzhandler");  //begin buffering the output

require_once('/classes/mysql.php');

// Some code where I access the database.

header('/somepage.php');
exit;

ob_flush(); //output the data in the buffer