PHP setcookie()与服务器前端处理


PHP setcookie() with pre-server side processing?

我有一个简单的页面日志代码。它会检查是否有VisitorID cookie,如果没有,它会查询我的数据库,获取下一个可用的数字然后我想把它设为VisitorID cookie。问题是当我尝试运行它时,我得到"无法修改头信息-头已经由…bla . .bla . .bla。"在PHP中,如果我不知道我想要设置什么,我如何设置cookie ?

下面是我的代码,我在向浏览器写入任何内容之前包含在页面上:

<?php
$Browser = $_SERVER["HTTP_USER_AGENT"];
$TheTable = "PageVisits";
if (strripos($Browser,"mozilla") < 0||
strripos($Browser,"search") > 0 ||
strripos($Browser,"bot")  > 0  ||
strripos($Browser,"scoutjet")  > 0  ||
strripos($Browser,"ask jeeves/teoma") > 0  ||
strripos($Browser,"slurp")  > 0 )
{
$TheTable = "BotVisits";
}
$IPAddress = $_SERVER["REMOTE_ADDR"];
$AcceptedTypes = $_SERVER["HTTP_ACCEPT"];
$Referer = $_SERVER["HTTP_REFERER"];
$VisitorID = $_COOKIE["VisitorID"];
//Get VisitorID
if (strlen($VisitorID) == 0)
    {
    $SqlStr = "SELECT IF(IsNull(MAX(VisitorID)), 1, MAX(VisitorID) + 1) AS NewVistorID " .
    "FROM " . $TheTable . " ";
    $con = mysql_connect("DBServer","DBUserName","DBPassword");
    mysql_select_db("ratpackc_ratpack", $con);
    $result = mysql_query($SqlStr);
    $VisitorID = mysql_result($result, 0);
    mysql_close($con);
    }
//Update page log
$SqlStr = "INSERT INTO " . $TheTable . " " .
"(VisitorID, IPAddress, ThePage, Referer, Browser, AcceptedTypes) " .
"VALUES (" . $VisitorID . ",'" . $IPAddress . "','" . $ThisPage . "','" . $Referer . "','" . $Browser . "','" . $AcceptedTypes . "')" ;
$con = mysql_connect("DBServer","DBUserName","DBPassword");
mysql_select_db("ratpackc_ratpack", $con);
mysql_query($SqlStr);
mysql_close($con);
$CookieExpire = time()+31536000;
setcookie("VisitorID", $VisitorID, $CookieExpire);                    .
?>

上面的代码应该可以工作,除非有错误或以前的脚本发送的输出。此外,从文件末尾排除结束php标记?>是一种很好的做法,以消除标记后出现空白的可能性。这不会影响PHP脚本。

祝你好运

显然在调用setcookie()函数之前有一些输出。我想到了一些可能性:

  1. 调用的php文件可能有UTF8 BOM报头。这是文件开头的2个字节,声明文件是UTF8。通常这些字节不会显示在PHP编辑器中。
  2. 确保调用php文件的第一个字符是php块<?的开始,甚至不应该有空白。
  3. 你的代码在某处给出了一个错误消息。你可以检查一下,通过注释setcookie()函数,你应该能够看到这个错误消息。

我会在调用php文件中寻找问题,而不是在您所显示的代码中。

可以打开输出缓冲。这将阻止该消息并允许您的代码运行。

使用ob_start()开始缓冲,ob_flush()发送缓冲区到输出。

我这里担心的是,你的代码不应该触发这个错误-你没有输出任何东西到页面,当你检查和设置这个cookie,是吗?我没想到设置cookie会触发这样的错误