根据本手册:http://us2.php.net/setcookie我必须在其他任何事情之前设置cookie。
这是我的cookie代码:
if (isset($_COOKIE['watched_ads'])){
$expir = time()+1728000; //20 days
$ad_arr = unserialize($_COOKIE['watched_ads']);
$arr_elem = count($ad_arr);
if (in_array($ad_id, $ad_arr) == FALSE){
if ($arr_elem>10){
array_shift($ad_arr);
}
$ad_arr[]=$ad_id;
setcookie('watched_ads', serialize($ad_arr), $expir, '/');
}
}
else {
$expir = time()+1728000; //20 days
$ad_arr[] = $ad_id;
setcookie('watched_ads', serialize($ad_arr), $expir, '/');
}
正如您所看到的,我在设置cookie时使用了变量。
变量来自mysql_query,我必须先进行查询。 但是,如果我这样做,我将收到一条错误消息:
Cannot modify header information - headers already sent by ...
错误指向我在上面设置cookie的行。
我该怎么办?
更新
我在setCookie部分之前执行此操作:
$ad_id=$_GET['ad_id'];
$query2 = "SELECT * FROM classified WHERE classified.ad_id = '$ad_id'";
$results2 = mysql_query($query2) or die(mysql_error());
$row2 = mysql_fetch_array($results2);
$cat = $row2['category'];
$action=$row2['action'];
$sql_table='';
$num_rows = mysql_num_rows($query_results);
if ($num_rows != 0){
HERE COMES THE SETCOOKIE PART
答案 0 :(得分:3)
正如其他人所建议的那样,请确保在设置Cookie之前没有输出任何html或空格。
这会失败,因为您在设置Cookie之前打印 html。
<p>
<?php
// your cookie code - note <p> tag before <?php tag
// ...
?>
这也会失败,因为您在设置Cookie之前打印空格。
<?php
// your cookie code - note the extra linebreak before <?php tag
// ...
?>
另外
<?php
// your cookie code - note the extra space before <?php tag
// ...
?>
如果您的php脚本使用UTF编码(如果您不在英语国家/地区,可能就是这样),请确保您的编辑器设置为不在每个文件的开头包括字节顺序标记(BOM)。有关BOM的详细信息,请参阅http://en.wikipedia.org/wiki/Byte_order_mark。
答案 1 :(得分:1)
限制不是您在设置Cookie之前不能做任何事情,只是在设置Cookie之前不得输出任何内容。
例如,假设我们想从数据库中获取一些数据,将其输出给用户并将其设置为cookie。
<?php
$data = getDbData();
echo $data['field'];
setcookie('field', $data['field'], time()+86400, '/');
这会失败,因为我们在设置cookie之前输出了数据。我们可以通过在设置cookie之后将输出移动到它来修复它。
<?php
$data = getDbData();
setcookie('field', $data['field'], time()+86400, '/');
echo $data['field'];
答案 2 :(得分:0)
确保在添加基于标头的信息之前不打印任何(如Cookie所示)。
答案 3 :(得分:0)
我看不到代码有任何问题,除非mysql输出错误,这可能会导致此错误。
这是在黑暗中拍摄的,但请确保在打开php标记之前没有任何空格(或其他任何内容)。还要确保在包含的文件中关闭php标记后没有任何尾随空格。
答案 4 :(得分:0)
您向我们展示的错误消息表明标题是在setcookie()
行发送的。因此,您可能会在代码中设置标题或Cookie 以后,这会导致错误。 (或者我相信,因为我无法一字不漏地回想起错误,你在关键时刻将其切断了)