防止在PHP中过快地重新提交表单

时间:2015-02-02 15:17:25

标签: javascript php jquery forms

在reddit上,他们只允许新用户每十分钟发一个新帖子。我想做类似的事情。这就是我到目前为止所做的。

if (empty($_REQUEST['content']))
    $firsttime = time();

if (!empty($_REQUEST['content']))
    $secondtime = time();

if ($secondtime - $firsttime < 10*60*60)
    echo 'You are resubmitting too quickly.';

它第一次起作用。即使这样,也有一个问题,我不希望它第一次工作,但只有当用户提交第二次等等。有什么用PHP或JavaScript来做到这一点。我更喜欢PHP版本。 我不是在谈论页面刷新时的表单重新提交。

根据评论中的建议,我得出以下结果

 if(!isset($_SESSION['firsttime'])&&(form submission successful))
 $_SESSION['firsttime'] = time();
 else if(isset($_SESSION['firsttime']&&(time()-$_SESSION['firsttime'] > 60*10*10)
 submit form
 else if(isset($_SESSION['firsttime']&&(time()-$_SESSION['firsttime'] < 60*10*10)
 please wait for sometime.

这个伪代码是否正确?

2 个答案:

答案 0 :(得分:1)

你需要找出他们上次发布的时间,而不是两次使用时间()。 如果要将帖子保存到数据库,那么您可能正在使用它们保存时间戳。

因此,一个简单的方法是选择与此用户匹配的任何帖子,其时间戳不到10分钟前。如果查询返回任何内容,请不要让它们发布。您的查询可能类似于:

SELECT COUNT(id) FROM posts WHERE (poster = **userid**) AND (post_time >= NOW() - INTERVAL 10 MINUTE)

如果查询返回0,请保存帖子 - 及其时间戳。

当然,这只是一个粗略的概念,它将取决于你如何存储你的帖子。点是,因为根据定义,用户在这里保存帖子,你已经记录了他们上次保存的内容 - 所以你需要做的就是检查当前时间。

答案 1 :(得分:0)

您可以将访问时间存储到会话中,然后在调用脚本时检查当前访问时间是否超过10分钟。

session_start();
if(isset($_SESSION['last_time'])) 
{
  if($_SESSION['last_time']+10*60*60<now()) echo "too fast";
}
$_SESSION['last_time'] =  now();