使用会话变量和cookie进行计数

时间:2017-05-24 13:57:03

标签: php session cookies count

可能是一个愚蠢的问题,但我刚开始学习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";
?>

3 个答案:

答案 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

Storage Inspector

你的cookie应该出现在那里。此外,网络监视器 Ctrl + Shift + Q )允许诊断是否正在接收cookie发送回(因为您从服务器端设置cookie,使用的传输机制是HTTP头)。

Network Monitor

您还应该根据需要经常查看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_errorsphp.ini指令。错误拇指规则:在开发中显示,登录生产。

这些工具应足以解决您的问题。