我使用此方法根据从上一页传递的变量显示不同的内容。
<?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()
功能将再次执行。这只是我用来跟踪用户点击该按钮的次数的一种方式。
如何在刷新页面时阻止注入整数的增量?
或者,如果有一个更简单的方法来完成这一切?
答案 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)
您可以使用ajax调用来触发该操作。这样,url在不重新加载内容的情况下被称为“幕后”。我推荐这个选项;使用JQuery ajax它就像编写像function clicked(){$.ajax("yourClickCounter.php");}
这样的onClick函数,然后将<button ... onClick="clicked()">...</button>
添加到html一样简单。当然,您必须在单独的PHP文件中完成clickCounting,但它的优点是每次单击按钮时都不会重新加载所有内容。
您可以使用$_SESSION['has_clicked']
之类的会话变量。这要求您首先使用session_start()
答案 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';
}
?>