【问题标题】:PHP setcookie() with pre-server side processing?PHP setcookie() 与服务器前处理?
【发布时间】:2012-12-11 23:43:12
【问题描述】:

我有一个简单的页面日志代码。基本上,它会检查是否有 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 cookies setcookie


    【解决方案1】:

    上面的代码应该可以工作,除非有错误发送的输出,或者以前的脚本。此外,最好从文件末尾排除关闭 php 标记 ?> 以消除标记后出现空格的可能性。这不会影响您的 PHP 脚本。

    祝你好运

    【讨论】:

    • 不知道结束标签的问题,谢谢。我发现了一个关于这个主题的有趣讨论here。就我个人而言,我会坚持使用结束标签,但我会注意尾随空格以及前面的空格。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 如果是这种情况,某些文件中的前导空格可能是问题所在。尾随空格也可以做到这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-03
      • 2018-08-17
      • 2011-05-04
      • 2012-03-11
      • 2013-04-10
      • 2011-01-01
      • 2017-01-04
      相关资源
      最近更新 更多