【问题标题】:php - How can I identify refresh from any other type page changephp - 如何从任何其他类型的页面更改中识别刷新
【发布时间】:2017-09-04 12:24:34
【问题描述】:

我正在使用 php 代码来创建和更新一个 SQL 数据库,然后我用它来填充屏幕上的页面计数器(参见下面的代码 sn-p)。如何将页面刷新与任何其他 url 更改区分开来,以免每次刷新页面时都添加到我的计数器中?我想在不将 cookie 放在用户桌面上的情况下执行此操作。提前感谢您的帮助。

include("incPHP1.inc");
$cxn=mysqli_connect($host,$user,$password,$database)
    or die ("Couldn't connect to the server.");
$result = mysqli_query($cxn, "SELECT * FROM visitors");
$counter = mysqli_num_rows($result);
$views = $counter;

宇宙:

我复制了你写的代码到我的 php 代码的第一行(见下面的第一次尝试代码)。它在 IE11 或 Firefox 55.0.3 中都不起作用。在这两种情况下,我都收到一条错误消息(致命错误:函数名称必须是第 2 行 D:\InetPub\vhosts\rlcdev.com\httpdocs\index.php 中的字符串)并且没有输出。我删除了最初的 $session_name();命令行并将其省略(请参阅下面的第二次尝试代码)。这是因为我知道 $session_start();命令必须是后面的第一行

第一次尝试:

<?php
$session_name();
$session_start();
$_SESSION['refresh'] = isset($_SERVER['HTTP_CACHE_CONTROL'])  && $_SERVER

['HTTP_CACHE_CONTROL'] === 'max-age=0';
if($_SESSION['refresh'])
{
            echo ("<SCRIPT>alert ( 'Page has been refreshed, The AJAX call was not made');</SCRIPT>");
}
else
{
                echo ("<SCRIPT>alert ( 'This is a non-refresh reload' );</SCRIPT>");
}

第二次尝试:

<?php
$session_start();
$_SESSION['refresh'] = isset($_SERVER['HTTP_CACHE_CONTROL'])  && $_SERVER

['HTTP_CACHE_CONTROL'] === 'max-age=0';
if($_SESSION['refresh'])
{
            echo ("<SCRIPT>alert ( 'Page has been refreshed, The AJAX call was not made');</SCRIPT>");
}
else
{
                echo ("<SCRIPT>alert ( 'This is a non-refresh reload' );</SCRIPT>");
}

【问题讨论】:

标签: php page-refresh hitcounter


【解决方案1】:

使用 cookie。

在您的情况下,设置一个具有您喜欢的名称和值的 cookie(already_visited = 1),有效期为 7 年。然后你可以检查这个cookie是否是由浏览器发送的。如果浏览器发送了cookie值,则刷新;否则,如果浏览器未发送cookie值,则为第一次访问。

注意:此技术依赖于 cookie,您只能跟踪 cookie 是否在浏览器中被接受。如果在浏览器中禁用 cookie,则无法检查此选项。

【讨论】:

    【解决方案2】:

    这是另一种方法: 使用标志变量

    $refresh = isset($_SERVER['HTTP_CACHE_CONTROL'])  && $_SERVER['HTTP_CACHE_CONTROL'] === 'max-age=0';
    if($refresh)
    {
      echo ("<SCRIPT>alert ( 'Page has been refreshed, The AJAX call was not made');</SCRIPT>");
    }
     else
         {
          echo ("<SCRIPT>alert ( 'This is a non-refresh reload' );</SCRIPT>");
         }
    

    【讨论】:

    • 嗨,是的,这是我的错,因为这只是对会话名称的冗余检查,在您的情况下显然不存在(在此阶段初始化会话)。查看编辑
    • 删除整个会话处理和 $_SESSION 变量(我的错误:|)
    • 关于 session_start 函数(仅供参考):必须在将任何输出(即回显或打印)发送到浏览器之前调用它,但可以调用 session_name 函数(这是一个很好的做法在 session_start 函数之前调用),以便为您的活动会话设置自定义名称,从而降低渗透风险。说句公道话,我把 session_name 函数留给了不带参数的函数,这导致你犯了错误。
    • 刚刚注意到在 IE 和 Edge 中它无法识别刷新。在 Firefox 和 Chrome 中运行良好。
    • 我想说,对于 IE 和 Edge,您最好的选择是使用案例场景来检测浏览器,如果找到 IE,则使用 js sn-p 检查页面刷新并发布标记到您的 php,否则使用上述内容。
    【解决方案3】:

    还是不行,科斯敏。我决定采用不同的方式,使用 SQL 数据库、计时器和 Ajax 调用来确定调用是刷新还是新调用。这将有助于解决我试图解决的其他一些问题。感谢大家的帮助。

    【讨论】:

      猜你喜欢
      • 2018-08-01
      • 2019-11-28
      • 2015-09-14
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 2011-11-16
      • 2012-12-17
      • 2014-08-22
      相关资源
      最近更新 更多