PHP setcookie () с обработкой на стороне сервера? - PullRequest
0 голосов
/ 10 октября 2011

У меня есть простой код подкачки.По сути, он проверяет, есть ли файл cookie VisitorID, если нет, он запрашивает мою базу данных, получает следующий доступный номер, а затем я хочу установить его в качестве файла cookie VisitorID.Проблема в том, что когда я пытаюсь запустить его, я получаю сообщение «Невозможно изменить информацию заголовка - заголовки уже отправлены ... бла ... бла ... бла".В 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 ]

1 голос
/ 10 октября 2011

Приведенный выше код должен работать, если нет вывода, отправленного из-за ошибки или предыдущего сценария. Кроме того, рекомендуется исключить закрывающий тег php?> Из конца вашего файла, чтобы исключить возможность появления пробела после тега. Это не повлияет на ваш скрипт PHP.

удачи

0 голосов
/ 10 октября 2011

Очевидно, что перед вызовом функции setcookie() есть некоторый вывод. Есть несколько возможностей, которые приходят мне в голову:

  1. Файл php вызывающего может иметь заголовок спецификации UTF8. Это 2 байта в начале файла, заявляющие, что файл имеет формат UTF8. Часто эти байты не отображаются в редакторе PHP.
  2. Убедитесь, что самым первым символом вызывающего php-файла является начало блока php <?, даже не должно быть пробела.
  3. Ваш код выдает где-то сообщение об ошибке. Вы можете проверить, что, комментируя функцию setcookie (), вы сможете увидеть это сообщение об ошибке.

Я бы искал проблему в вызывающем php-файле, а не в показанном вами коде.

0 голосов
/ 10 октября 2011

Вы можете включить буферизацию вывода.Это предотвратит сообщение и позволит запустить ваш код.

Используйте ob_start () для начала буферизации и ob_flush () для отправки буфера на выход.*

Меня беспокоит то, что ваш код не должен вызывать эту ошибку - вы ничего не выводите на страницу, когда проверяете и устанавливаете этот cookie, не так ли?У меня не было впечатления, что установка куки вызовет такую ​​ошибку.

...