【问题标题】:Do not increment on page reload不要在页面重新加载时增加
【发布时间】:2014-10-03 00:56:46
【问题描述】:

我在我的页面上放置了一个命中计数器。它读取一个文本文件,增加文件中的数字,然后在页面的后面,我输出增加的值。

$hitsFile   = "hits/exps/stats.txt";
$hits       = file($hitsFile);
$hits[0]++;
$fp = fopen($hitsFile , "w");
flock($fh, LOCK_EX);
fwrite($fp , $hits[0]);
fclose($fp);

我的问题是,如果我重新加载页面,代码会增加点击次数。我不想要那个。我想过使用会话来解决这个问题,但是使用会话,为了再次增加点击次数,我需要退出站点并再次访问。我也不想要。

我希望它不是在我重新加载页面时而是在我重新访问页面时增加。

例如,假设我有两个页面的网站,主页和联系人,并且在联系人页面上我有一个计数器。如果我重新加载(刷新)联系页面,我不希望点击计数器增加,但是如果我离开联系页面并访问主页,然后重新访问联系页面,我希望它增加。

简而言之,我不希望它在页面重新加载时增加。有没有办法做到这一点?

【问题讨论】:

    标签: php hitcounter


    【解决方案1】:

    在您的每个页面中,您需要在会话中写入页面名称。
    做这样的事情:

    $_SESSION['page'] = 'contact';
    

    在您需要计算点击次数的页面上,您需要检查此会话密钥。
    例如,如果您在“联系人”页面上,则为 $_SESSION['page'] == 'contact'
    现在,当您访问“主页”时:

    $page = $_SESSION['page'];
    if($page != 'homepage')
    {
        //increment your hits counter
        $_SESSION['page'] = 'homepage';
    }
    

    【讨论】:

    • 如果我在所有页面中都使用点击计数器来存储每个页面的点击,该怎么办?
    • @akinuri 所以你需要在每个页面的顶部添加我提供的第二个代码(它会检查是否重新加载)。 请注意,您需要更改评论 //increment your hits counter 代码,实际上会增加您的计数器。您还需要更改页面名称(在我使用的示例中主页名称)
    【解决方案2】:

    我建议这种方法,是我的首选,在根目录下创建这些文件夹:cntlog... 然后放入 cnt 文件夹以下文件cnt.phpshowcnt.php...

    cnt.php

    <?php
      ##############################################################################
      # Php Counter With Advanced Technology For The Prevention Of Reloading Pages #
      # Version: 1.4 - Date: 13.11.2014 - Created By Alessandro Marinuzzi [Alecos] #
      ##############################################################################
      function cnt($file) {
        session_start();
        global $pagecnt;
        $reloaded = isset($_SERVER['HTTP_CACHE_CONTROL']) && $_SERVER['HTTP_CACHE_CONTROL'] === 'max-age=0';
        $thispage = basename($_SERVER['SCRIPT_FILENAME']);
        if (!isset($_SESSION['first_go'])) {
          $_SESSION['first_go'] = 1;
          $first_go = TRUE;
        } else {
          $first_go = FALSE;
        }
        if (!isset($_SESSION['thispage'])) {
          $_SESSION['thispage'] = $thispage;
        }
        if ($_SESSION['thispage'] != $thispage) {
          $_SESSION['thispage'] = $thispage;
          $new_page = TRUE;
        } else {
          $new_page = FALSE;
        }
        $pagecnt = rtrim(file_get_contents($file));
        if ((!$reloaded) && ($new_page == TRUE) || ($first_go == TRUE)) {
          $fd = fopen($file, 'w+');
          flock($fd, LOCK_EX);
          fwrite($fd, ++$pagecnt);
          flock($fd, LOCK_UN);
          fclose($fd);
        }
      }
    ?>
    

    showcnt.php

    <?php
      ##############################################################################
      # Show Counter Results - v.1.4 - 13.11.2014 By Alessandro Marinuzzi [Alecos] #
      ##############################################################################
      function gfxcnt($file) {
        global $number;
        $number = rtrim(file_get_contents($file));
        $lenght = strlen($number);
        $gfxcnt = "";
        for ($i = 0; $i < $lenght; $i++) {
          $gfxcnt .= $number[$i];
        }
        $gfxind = "<span class=\"counter\"><span class=\"number\">$gfxcnt</span></span>";
        echo $gfxind;
      }
    ?>
    

    那么,编辑你的 index.php 或其他 php 页面...并把这段代码放在开头:

    <?php session_start(); include("cnt/cnt.php"); cnt("log/index.txt"); include("cnt/showcnt.php"); ?>
    

    那么,编辑 index.php 或其他 php 页面...并使用这段代码来读取计数器文件:

    <?php gfxcnt("log/index.txt"); ?>
    

    就是这样,我希望你会发现我的回答很有用:) 我的计数器可以写入/读取多个 php 页面...

    来源:我的博客(https://www.alecos.it/new/101/101.php

    【讨论】:

      【解决方案3】:

      在顶部添加session_start();

      现在将您的 if 更改为:

      if (!isset($_SESSION['lastpage']) || $_SESSION['lastpage'] != $_SERVER['QUERY_STRING') {
         $hits[0]++;
      }
      
      $_SESSION['lastpage'] = $_SERVER['QUERY_STRING'];
      

      如果他们想增加计数器,这基本上会迫使某人移动到另一个页面。

      【讨论】:

        【解决方案4】:
        1. 仅当当前 URL 未存储在 $_SESSION['url'] 中时才更新命中计数。
        2. 更新点击计数后,将当前 URL 存储在$_SESSION['url']

        【讨论】:

          猜你喜欢
          • 2019-05-17
          • 1970-01-01
          • 2014-01-08
          • 1970-01-01
          • 2014-09-20
          • 1970-01-01
          • 1970-01-01
          • 2021-05-15
          • 1970-01-01
          相关资源
          最近更新 更多