【问题标题】:Counting using session variables and cookies使用会话变量和 cookie 进行计数
【发布时间】:2017-05-24 13:57:02
【问题描述】:

可能是一个愚蠢的问题,但我刚开始学习 PHP,现在我必须做一个练习,一方面,会话变量必须计算您在关闭浏览器之前访问页面的频率。另一方面,cookie 应该计算您访问网站的总频率。 因此,如果您关闭了网络浏览器,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";
?>

【问题讨论】:

  • 在关闭之前访问了一个网站,或者网站上的页面请求总数?那么 cookie 计数器应该是会话计数器的聚合,还是该用户发生的会话计数器的总数?

标签: php session cookies count


【解决方案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";

【讨论】:

    【解决方案2】:

    我认为你必须用路径设置cookie

    setcookie("count", "$count", time() + 3600, "/");
    

    【讨论】:

    • 来自the manual默认值是设置cookie的当前目录。默认值应该适合当前用例。
    【解决方案3】:

    大多数主要浏览器都捆绑了包含 cookie 检查器的开发人员工具。在 Firefox 中,它被称为 Storage Inspector。它可以在程序菜单中找到,但 default short-cutShift+F9:

    您的 cookie 应该会显示在此处。此外,Network Monitor (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 设置被配置为对您隐藏它。您需要尽快修复它,因为在没有错误消息帮助的情况下进行编码是很困难的。作为快速入门,您可以在计算机的系统范围 php.ini 文件 (details here) 中设置 error_reportingdisplay_errors 指令。错误经验法则:在开发中显示,在生产中登录。

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

    【讨论】:

      猜你喜欢
      • 2011-05-09
      • 2012-07-23
      • 1970-01-01
      • 2012-12-07
      • 2011-04-03
      • 2013-08-21
      • 2011-09-23
      • 2012-10-29
      • 2014-10-14
      相关资源
      最近更新 更多