4

我想要做的是每个用户每分钟获得 1 分。现在我在 addpoints.php 中有 php 代码,然后我尝试使用 jQuery javascript:

function addpoints()  { 
  var userid = document.getElementById('user_id_points');
  var postFile = 'addpoints.php?userid='+ userid.value;
  $.post(postFile, function(data){  
    $("#points").html(data); 
    setTimeout(addpoints, 60000);
  });
}    

这工作得很好,每 1 分钟给出一个点。但一个问题是,如果你只是刷新脚本所在的页面,那么你会收到一个点。所以你可能只是刷新页面几次然后你提高你的分数..

我在想也许在 addpoints.php 中做一个 if() 检查最后一个日期戳是否超过 1 分钟然后给出点 else 错误..

我只是想知道是否有更好的想法/事情可以做,以防止这个小问题?

4

4 回答 4

3

存储上次分数增加的日期+时间(例如使用时间戳) ,在该分数旁边(无论是在数据库中$_SESSION还是在数据库中)确实是一个解决方案:

  • 当增加分数的请求到达时,检查时间戳
    • 如果超过 60 秒,则增加分数,并更新时间戳
    • 否则,不要更新分数和时间戳
于 2010-02-13T22:06:02.857 回答
0

您实际上应该只将时间戳存储在 $_SESSIONS 中,而不必担心数据库中的内容。您可以做的另一件防止自动化脚本的好事情是启用某种身份验证来访问页面,最好使用登录名和强大的验证码。还要确保防止表单欺骗并存储相同 IP 的多个请求并禁止它们。这将防止有人通过多次刷新对您的服务器进行 DOS 攻击。您可以使用其他东西来确定它是否是 bieng 自动化的,例如 IP、推荐人检查等。

于 2010-02-13T23:39:02.130 回答
0

根据@Pascal MARTIN 的响应,如果解决方案很好,您选择@Pascal MARTIN 的响应

function addpoints()  { 
  var userid = document.getElementById('user_id_points');
  var postFile = 'addpoints.php?userid='+ userid.value;
  $.post(postFile, function(data){  

    $("#points").html(data.html); 
    setTimeout(addpoints, data.ts);
  });

}   

仅在“addpoints_get_ts”中获取时间戳

(function(){
  var userid = document.getElementById('user_id_points');
  var postFile = 'addpoints_get_ts.php?userid='+ userid.value;
  $.get(postFile, function(data){  
      setTimeout(addpoints, data.ts);
  });
})();
于 2010-02-13T22:11:34.827 回答
0

我建议last在您的 MYSQL 表中添加一列。这样,您可以确保他们不会作弊。

mysql_query('UPDATE `users` SET `points` = `points`+1, `last`='.time().' WHERE `last` < '.(time()-60).' AND `user_id` = '.intval($_GET['userid']).' LIMIT 1);

此外,您可以使用 SESSION 变量来确保正确的用户调用脚本,甚至确保用户已登录。;)

于 2010-02-13T22:11:35.670 回答