我对输出缓冲如何与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();
Run Code Online (Sandbox Code Playgroud)
这不起作用.我收到"已发送标头"错误.我知道在调用header命令之前我没有任何输出,但我想如果我使用ob_start()我可以在调用命令之前输出.显然我错了,但我不知道如何纠正这个代码,以便我可以将session_start()放在需要的地方,打开与我的数据库的连接,然后调用重定向.有人可以帮忙吗?谢谢.
删除呼叫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']));
Run Code Online (Sandbox Code Playgroud)
或者更好的是,使用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));
Run Code Online (Sandbox Code Playgroud)
编辑:
还有一件事.您没有在查询字符串中正确转义dealerID.该mysql_real_escape_string()函数仅对SQL字符串有用.它对数值无用.使用该ctype_digit()功能检查以确保dealerID参数是一个数字:
$dealerID = $_GET['dealerID'];
if (!ctype_digit($dealerID)){
die('Invalid value for "dealerID" parameter.');
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2227 次 |
| 最近记录: |