根据变量包含不同的内容

时间:2012-09-15 15:00:18

标签: php

我使用此方法根据从上一页传递的变量显示不同的内容。

    <?php
    if (isset($_GET['click'])) {
        if($_GET['click'] == 'person'){
          file_put_contents('person.txt', ((int) file_get_contents('person.txt')) + 1);
          include 'resultperson.php';
        } elseif ($_GET['click'] == 'text'){
          file_put_contents('text.txt', ((int) file_get_contents('text.txt')) + 1);
          include 'resulttext.php';
        } elseif ($_GET['click'] == 'online'){
          file_put_contents('online.txt', ((int) file_get_contents('online.txt')) + 1);
          include 'resultonline.php';
        }
    } else {
        include 'resulttext.php';
    } 
    ?>  

问题是,当我点击刷新时,file_put_contents()功能将再次执行。这只是我用来跟踪用户点击该按钮的次数的一种方式。

如何在刷新页面时阻止注入整数的增量?

或者,如果有一个更简单的方法来完成这一切?

6 个答案:

答案 0 :(得分:1)

使用会话可能是您最好的选择,除非您不介意当用户关闭浏览器并再次访问该页面时它将被触发。

// This will be set to true if the user has the session variable set
$clicked = isset($_SESSION['clicked']);

// Check if get variable 'click' is set, and that $clicked is false. 
// If 'click is set and $clicked if false, the variable $click is set to the 
// value of $_GET['click'] (for example 'person'). Other wise it will be set to false.
$click = (isset($_GET['click']) && !$clicked) ? $_GET['click'] : false;   

// Set the session variable 'clicked' if it isn't set so that the next time 
// the user visits, we'll know
if (!$clicked) {
    $_SESSION['clicked'] = 1;
}

if($click == 'person'){
    file_put_contents('person.txt', ((int) file_get_contents('person.txt')) + 1);
    include 'resultperson.php';
} elseif ($click == 'text'){
    file_put_contents('text.txt', ((int) file_get_contents('text.txt')) + 1);
    include 'resulttext.php';
} elseif ($click == 'online'){
    file_put_contents('online.txt', ((int) file_get_contents('online.txt')) + 1);
    include 'resultonline.php';
} else {
    include 'resulttext.php';
}

答案 1 :(得分:0)

要在用户访问您上一页的页面时进行区分,而不是点击刷新,请查看$_SERVER["HTTP_REFERER"]变量。该变量将包含用户来自上一页的URL,但是在刷新的情况下,该变量将不存在,因为用户没有来自任何页面(他没有&#39; t单击链接以转到您的页面)而不是发送请求的浏览器

如果您的上一页被调用了,那么mypage.php&#39;为此,请更换以下行:

if (isset($_GET['click'])) {

这个:

if (isset($_GET['click']) && isset($_SERVER["HTTP_REFERER"]) && strpos($_SERVER["HTTP_REFERER"],'mypage.php')) {

应该做你想做的事。

<强>更新

上述解决方案无效,因为在浏览器上点击“刷新”时页面将保持相同的Referer值。

答案 2 :(得分:0)

  1. 您可以使用ajax调用来触发该操作。这样,url在不重新加载内容的情况下被称为“幕后”。我推荐这个选项;使用JQuery ajax它就像编写像function clicked(){$.ajax("yourClickCounter.php");}这样的onClick函数,然后将<button ... onClick="clicked()">...</button>添加到html一样简单。当然,您必须在单独的PHP文件中完成clickCounting,但它的优点是每次单击按钮时都不会重新加载所有内容。

  2. 您可以使用$_SESSION['has_clicked']之类的会话变量。这要求您首先使用session_start()

  3. 开始会话

答案 3 :(得分:0)

如果要跟踪用户的来源,可以使用http标头的referer字段。

如果这不是一个选项,您可以点击链接到注册点击的php页面,然后header("Location: x.php");到显示内容的页面。

答案 4 :(得分:0)

使用实际代码,无法阻止页面刷新时整数的增量。

问题是:这有关系吗?您希望自己的智能设备有多重要和准确?

有一种方法可以将增量附加到按钮单击,即使用AJAX。您可以将处理程序附加到按钮单击事件,该事件对PHP脚本进行适当的AJAX调用。

这并不简单,但很简单。

此解决方案和您的实际解决方案都无法阻止恶意用户发出HTTP请求来调用您的PHP脚本,随意增加您的计数器...

答案 5 :(得分:0)

这应该可行,并且更简单,更容易扩展:

<?php
if (isset($_GET['click']) && isset($_SERVER["HTTP_REFERER"])) {
    $click = $_GET['click'];
    if (in_array($click, array('person', 'text', 'online')) {
      file_put_contents($click . '.txt', ((int) file_get_contents($click . '.txt')) + 1);
      include 'result' . $click . '.php';
    }
} else {
    include 'resulttext.php';
} 
?>