Php 如何防止用户滥用按钮?

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 =

我是一个PHP初学者,我试着在点击按钮时制作一些东西来获得xp。你只需要点击,它会给出xp,然后它会刷新页面,刷新玩家在屏幕上的状态

<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部分放在开头,实际上不需要使用
    meta
    tag>重新加载页面,因为数据已经存在 更新

听起来不是一个很有趣的游戏…当用户获得xp时,设置一个时间戳列,并检查是否经过了一定的时间,然后允许它再次更新。您意识到您的SQL将更新
用户
表中的每一行,即使是那些没有单击按钮的用户。哦,您是对的,谢谢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.
    }
}
?>