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

时间:2011-10-10 19:07:33

标签: php cookies setcookie

我有一个简单的页面日志代码。基本上,它检查是否有VisitorID cookie,如果没有查询我的数据库,获取下一个可用的数字,然后我想将其设置为VisitorID cookie。 问题是,当我尝试运行它时,我得到“无法修改标题信息 - 标题已经由...发送... 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);                    .

?>

3 个答案:

答案 0 :(得分:1)

除非错误或以前的脚本发送了输出,否则上述代码应该有效。此外,最好排除关闭的php标记?&gt;从文件的末尾开始,消除标签后空白的可能性。这不会影响您的PHP脚本。

祝你好运

答案 1 :(得分:0)

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

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

我担心的是你的代码不应该触发这个错误 - 当你检查并设置这个cookie时,你没有向页面输出任何内容,是吗?我并不认为设置cookie会触发这样的错误。

答案 2 :(得分:0)

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

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