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