在PHP代码中首先发送“SetCookie”的问题

时间:2010-05-30 14:38:26

标签: php javascript sql mysql html

根据本手册: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

5 个答案:

答案 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 以后,这会导致错误。 (或者我相信,因为我无法一字不漏地回想起错误,你在关键时刻将其切断了)