Php 如何防止用户滥用按钮?
我是一个PHP初学者,我试着在点击按钮时制作一些东西来获得xp。你只需要点击,它会给出xp,然后它会刷新页面,刷新玩家在屏幕上的状态Php 如何防止用户滥用按钮?,php,Php,我是一个PHP初学者,我试着在点击按钮时制作一些东西来获得xp。你只需要点击,它会给出xp,然后它会刷新页面,刷新玩家在屏幕上的状态 <form method="post"> <p><input type="submit" value="Kill the mob" name="add20xp" /></p> </form> <?php if (isset($_POST['add20xp'])) { $add20xp =
<form method="post">
<p><input type="submit" value="Kill the mob" name="add20xp" /></p>
</form>
<?php
if (isset($_POST['add20xp']))
{
$add20xp =("UPDATE users SET exp = (exp + 20)");
$execadd20xp = mysqli_query($connection, $add20xp);
echo '<meta http-equiv="refresh" content="0.1" />';
}
?>
问题是,我想防止用户砸按钮,以防止错误和类似的事情。。。我试着把睡眠(1)但我可以继续垃圾邮件,等待秒,它的工作,所以它不是很有用。
谢谢你的帮助 如果要在提交表单后禁用按钮3秒钟,可以使用以下命令:
if(sessionStogare.getItem('submitted') === true){
document.querySelector('input[type="submit"]').disabled = true;
setTimeout(function(){
document.querySelector('input[type="submit"]').disabled = false;
sessionStorage.removeItem("submitted");
}, 3000);
}
document.querySelector("body").onclick = function() {
sessionStorage.setItem("submitted", true);
};
我们将在sessionStorage中记录提交内容,并检查是否在每次加载页面时都提交了表单。然后,我们将禁用该按钮,并在3秒钟后启用它。保存上次在会话状态下完成更新的时间。然后,只允许在(最后一次+2秒)之后按下按钮(选择了2秒,因为这是原始问题中建议的时间间隔)
if(isset($\u POST['add20xp']){
如果(!isset($_SESSION['last_post']){
$_SESSION['last_post']=0;
}
$currtime=time();
如果($currtime>($_会话['last_post']+2)){
$\u SESSION['last\u post']=$currtime;
//…处理邮件。
$add20xp=(“更新用户集exp=(exp+20)”;//修复此行
$execadd20xp=mysqli_查询($connection,$add20xp);
回声';
}
}
正如@Martin在其评论中所指出的,您只想为按下按钮的用户进行更新,这就是评论“修复这一行”的含义。将您的
php
页面更改为:
// the beginning of the page:
<?php
// start a SESSION
session_start();
// setup a $_SESSION variable
if (!isset($_SESSION["timestamp"]))
$_SESSION["timestamp"] = 0;
//
// now put the $_POST part
if (isset($_POST['add20xp'])) {
// check the time
$now = time();
if ($now - $_SESSION["timestamp"] > 2) {
// more than 2 seconds have passed since last $_POST
// update the time
$_SESSION["timestamp"] = time();
//
$add20xp =("UPDATE users SET exp = (exp + 20)");
$execadd20xp = mysqli_query($connection, $add20xp);
//
echo '<meta http-equiv="refresh" content="0.1" />';
exit;
} else {
// nothing, just let the page load like it is.
}
}
?>
//页面的开头:
注意一些重要的变化:
- $\u会话变量的使用->这些变量是存储的,可以 在每次页面加载时检索->您可以使用它们存储最后一个页面 行动发生的时间
- $u POST部分应位于开头 在发送表单后,加载页面-> 检查post->然后重新加载。。。效率不高
- 如果将$\u POST部分放在开头,实际上不需要使用
tag>重新加载页面,因为数据已经存在 更新meta
用户
表中的每一行,即使是那些没有单击按钮的用户。哦,您是对的,谢谢Martin!但问题是,在用户单击按钮刷新统计数据后,页面会立即刷新。我需要一些东西,能够在单击按钮1或2秒钟后阻止该按钮。客户端验证很好,但决不会单独进行-始终验证服务器端,我明白。我修改了我的答案,应该可以解决你的问题。你能解释一下你改变了什么吗?只有代码的答案没有那么有用。嗨,这一个似乎有效。它只需要在第1个if和“;”at$_SESSION['last_post']=0时再做一次),但它工作得很好,谢谢!
// the beginning of the page:
<?php
// start a SESSION
session_start();
// setup a $_SESSION variable
if (!isset($_SESSION["timestamp"]))
$_SESSION["timestamp"] = 0;
//
// now put the $_POST part
if (isset($_POST['add20xp'])) {
// check the time
$now = time();
if ($now - $_SESSION["timestamp"] > 2) {
// more than 2 seconds have passed since last $_POST
// update the time
$_SESSION["timestamp"] = time();
//
$add20xp =("UPDATE users SET exp = (exp + 20)");
$execadd20xp = mysqli_query($connection, $add20xp);
//
echo '<meta http-equiv="refresh" content="0.1" />';
exit;
} else {
// nothing, just let the page load like it is.
}
}
?>