0

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

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

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

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

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

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

4

4 回答 4

2

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

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

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

$page = $_SESSION['page'];
if($page != 'homepage')
{
    //increment your hits counter
    $_SESSION['page'] = 'homepage';
}
于 2014-08-09T19:31:28.777 回答
1

我建议这种方法,是我的首选,在根目录中创建这些文件夹:cntlog ...然后将以下文件放入cntcnt.php文件夹并showcnt.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

于 2015-03-17T10:23:35.410 回答
0
  1. 仅当当前 URL 未存储在$_SESSION['url'].
  2. 更新命中计数后,将当前 URL 存储在$_SESSION['url'].
于 2014-08-09T19:30:54.153 回答
0

添加session_start();到顶部。

现在将您的 if 更改为:

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

$_SESSION['lastpage'] = $_SERVER['QUERY_STRING'];

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

于 2014-08-09T19:31:09.720 回答