PHP标头和输出缓冲无法正常工作

时间:2011-05-17 17:47:18

标签: php header

我对输出缓冲如何与PHP标头函数一起工作感到困惑。

这是我的代码:

session_start();

header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');

require_once ($_SERVER['DOCUMENT_ROOT'] . '/classes/database.php');
require_once ($_SERVER['DOCUMENT_ROOT'] . '/classes/functions.php');

$db = new Database();
$db->open_connection(); // to database
$query = 'SELECT * FROM english WHERE id = ' . mysql_real_escape_string($_GET['dealerID']);
$result = mysql_query($query) or die(mysql_error());
$row = mysql_fetch_array($result);
ob_start();
ob_flush();
header('http://www.domain.com/channel-partners/en/index.php?dealerID=' . $row['id'] . '&location=' . $row['location_url'] . '&name=' . $row['name_url']);   
ob_end_flush();

这不起作用。我收到“已发送标头”错误。我知道在调用header命令之前我没有任何输出,但我想如果我使用ob_start()我可以在调用命令之前输出。显然我错了,但我不知道如何纠正这个代码,这样我就可以将session_start()放在需要的地方,打开与我的数据库的连接,然后调用重定向。有人可以帮忙吗?谢谢。

4 个答案:

答案 0 :(得分:5)

取消对ob_flush()的通话。这会将输出发送到响应,并阻止您再设置标题。

此外,您应该对查询字符串参数进行编码:

header('http://www.domain.com/channel-partners/en/index.php?dealerID=' . urlencode($row['id']) . '&location=' . urlencode($row['location_url']) . '&name=' . urlencode($row['name_url']));

或者更好的是,使用http_build_query()功能:

$params = array("dealerID"=>$row['id'], "location"=>row['location_url'], "name"=>$row['name_url']);
header('http://www.domain.com/channel-partners/en/index.php?' . http_build_query($params));

修改

还有一件事。您没有在查询字符串中正确转义dealerID。 mysql_real_escape_string()函数仅对SQL字符串有用。它对数值无用。使用ctype_digit()功能检查以确保dealerID参数是一个数字:

$dealerID = $_GET['dealerID'];
if (!ctype_digit($dealerID)){
  die('Invalid value for "dealerID" parameter.');
}

答案 1 :(得分:0)

  

我知道在调用header命令之前我没有任何输出,但我想如果我使用了ob_start(),我可以在调用命令之前输出。

你可以,但是在你的标题调用之前调用ob_flush(),它会将输出发送到浏览器。为什么?取出ob_flush()电话,它应该完全符合预期。

答案 2 :(得分:0)

您可以找到标题的发送位置:

if (headers_sent($file, $line)) { 
   echo "Headers were sent at file=$file, line=$line";
}

这应该允许你调试问题

答案 3 :(得分:0)

尝试放入ob_start();就在你的剧本的顶部。