PHP Cookie和访问计数器

时间:2016-08-09 21:13:04

标签: php html cookies header counter

我正在尝试学习php(全新),我正在尝试实现与此帖中发现的完全相同的内容,即使用Cookie作为计数器并最后访问网站:

PHP cookie visit counter not working

但与该帖子中的用户不同,我遇到了这个臭名昭着的错误:

“这是你第一次在服务器上!警告:无法修改标题信息 - 已经发送的标题(输出从第17行的(...)开始

这是第17行:setcookie('visitCount1');

现在我意识到这很常见并且搜索了SO并找到了这篇文章:

How to fix "Headers already sent" error in PHP

我彻底阅读并了解了为什么会出现这种情况的可能原因,包括空格和在任何HTML代码之前输入我的浏览器提到的注释php行,并删除结束标记“?>”我也尝试将ob_start()放在我的代码的开头,但仍然会出现相同的错误结果。

以下是我尝试运行的代码(取自上面的帖子):

<?php
$Month = 3600 + time();

date_default_timezone_set('EST');
setcookie('AboutVisit1', date("D M j G:i:s T Y"), $Month);
?>

 <?php
if(isset($_COOKIE['AboutVisit1']))
{
$last = $_COOKIE['AboutVisit1'];
echo "Welcome back! <br> You last visited on ". $last . "<br>";


}
if(isset($_COOKIE['visitCount1'])){


 $cookie = ++$_COOKIE['visitCount1'];


 echo ("You have viewed this page" . $cookie . "times.");
}
else
{
echo "It's your first time on the server!";
setcookie('visitCount1');
}
?>

我正在使用带有wamp服务器和chrome的netbeans 8.1作为我的浏览器。还有什么办法可以解决这个问题?

如果我只是在浏览器上或通过netbeans进行测试,是否真的可以看到Cookie和会话记录?

我是否必须包含一个html标题和正文或者我可以将它放在php正文中吗?

在PHP小提琴上它(有点)工作,我得到了这个(总是在同一时间):

欢迎回来! 您上次访问于2016年8月9日星期二15:43:00 这是你第一次在服务器上!

4 个答案:

答案 0 :(得分:1)

您发布的代码包含空白区域。看:

var conn      = mongoose.createConnection('mongodb://localhost/testA');

查看关闭和打开之间的空间?

答案 1 :(得分:1)

问题是您在发送最后一个cookie之前回显邮件:setcookie('AboutVisit1', date("D M j G:i:s T Y"), $Month); ?> <?php 已经运行setcookie('visitCount1');(或echo "It's your first time on the server!";)后发送到浏览器。确保在发送最后一个cookie之前不要使用echo函数。

编辑:正如其他人指出的那样,你的代码中也有一个空格。

答案 2 :(得分:1)

鉴于你是全新的,这里有一些提示

<?php

// if you are going to change the timezone, best to always make this first, so it effects everything in the script
date_default_timezone_set('EST');

// 3600 seconds = 1 hour not Month
// give your variables proper names it will help if you get into that habit from day one
$one_hour = 3600;
$expires = $one_hour + time();

// check if visit cookie exists and increment it, otherwise, this must be visit 1
$count = isset($_COOKIE['visitCount1']) ? ++$_COOKIE['visitCount1'] : 1;

// set cookies at the start, before outputting anything
// i would also recommend setting the path, as that can catch you out if you have a deep directory structure, / will mean the cookie works for the whole site
setcookie('AboutVisit1', date("D M j G:i:s T Y"), $expires, '/');
setcookie('visitCount1', $count, $expires, '/');

if(isset($_COOKIE['AboutVisit1']))
{
    $last_visit = $_COOKIE['AboutVisit1'];
    // you don't need to use . to concatenate variables if you use double "
    echo "Welcome back! <br> You last visited on $last_visit <br>";
}

if(isset($_COOKIE['visitCount1'])){
    // you dont' need () when you do echo
    // you don't need to use . to concatenate variables if you use double quotes "
    echo "You have viewed this page $count times.";
} else {
    echo "It's your first time on the server!";
}

// you don't need trailing ?>

答案 3 :(得分:0)

在输出任何其他内容之前,应调用setcookie()函数。因此,代码中有一些部分在调用setcookie之前输出了一些内容。