可能是一个愚蠢的问题,但我刚开始学习PHP,现在我必须做一个练习,一方面,会话变量必须计算你在关闭浏览器之前访问页面的频率。而另一方面,cookie应计算您访问网站的频率。 因此,如果您关闭了Web浏览器,则cookie应继续计数。 这是我的问题。 如果我关闭我的网络浏览器并再次启动它,那么cookie会重新开始计数。怎么解决这个问题?
PHP文件
<?php
session_start();
if (!isset($_SESSION['count'])) {
$_SESSION['count'] = 1;
} else {
$_SESSION['count']++;
}
echo "You have visited this page " . $_SESSION['count'] . " times before you closed your browser";
$count = $_SESSION['count'];
setcookie("count", "$count", time() + 3600);
if (!isset($_COOKIE['count'])) {
$_COOKIE['count'] = ($_COOKIE['count'] + $_SESSION['count']);
} else {
$_COOKIE['count']++;
}
echo "<br> In total you have visited this page " . $_COOKIE['count'] . " times";
?>
答案 0 :(得分:1)
您正在使用会话值覆盖cookie值。
而是检查cookie是否已设置,如果已设置,只需添加到它:
session_start();
if (!isset($_SESSION['count'])) {
$_SESSION['count'] = 1;
} else {
$_SESSION['count']++;
}
$count = $_SESSION['count'];
if (!isset($_COOKIE['count'])) {
setcookie("count", $count, time() + 3600);
$_COOKIE['count'] = $count; //setcookie does not update the superglobal $_COOKIE
} else {
setcookie("count", $count + $_COOKIE['count'], time() + 3600);
$_COOKIE['count'] += $count; //see above
}
//also headers (eg for setting cookies) can only be sent BEFORE the response body, so no echos
echo "You have visited this page " . $_SESSION['count'] . " times before you closed your browser";
echo "<br> In total you have visited this page " . $_COOKIE['count'] . " times";
答案 1 :(得分:0)
我认为你必须用路径设置cookie
setcookie("count", "$count", time() + 3600, "/");
答案 2 :(得分:0)
大多数主流浏览器都捆绑了包含Cookie检查器的开发人员工具。在Firefox中,它被称为 Storage Inspector 。它可以在程序菜单中找到,但default short-cut是 Shift + F9 :
你的cookie应该出现在那里。此外,网络监视器( Ctrl + Shift + Q )允许诊断是否正在接收cookie发送回(因为您从服务器端设置cookie,使用的传输机制是HTTP头)。
您还应该根据需要经常查看PHP手册。如果您的IDE无法通过代码生成链接,那么您可以使用一个小技巧:将函数名称附加到http://php.net/
,例如:http://php.net/setcookie。
最后但并非最不重要的一点是,当给定的数组键不存在时,您有条件要运行,但仍然使用该变量:
if (!isset($_COOKIE['count'])) {
$_COOKIE['count'] = ($_COOKIE['count'] + $_SESSION['count']);
^^^^^^^^^^^^^^^^^
如果PHP没有警告你,那是因为你的PHP设置被配置为隐藏它。您需要尽快修复它,因为编写时没有错误消息的帮助很难。作为快速入门,您可以在计算机的系统范围error_reporting
文件(details here)中设置display_errors
和php.ini
指令。错误拇指规则:在开发中显示,登录生产。
这些工具应足以解决您的问题。