【问题标题】:JS/php add for every minuteJS/php 每分钟添加一次
【发布时间】:2010-02-13 22:03:25
【问题描述】:

我想要做的是每个用户每分钟获得 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 错误..

我只是想知道是否有更好的想法/东西可以防止这个小问题?

【问题讨论】:

    标签: php javascript jquery add


    【解决方案1】:

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

    • 当增加分数的请求到达时,检查时间戳
      • 如果超过 60 秒,则增加分数,并更新时间戳
      • 否则,不要更新分数和时间戳

    【讨论】:

    • 是的,我就是这么想的..你能告诉更多关于 $_session 的想法吗??
    • 一种不经常访问数据库的方法(即对于不需要更新分数的时间,因为不到 1 分钟)可能是将时间戳存储在会话中(参见 @ 987654321@);;但是清除浏览器中的cookies或使用另一个cookies或自动脚本就足以更改会话-这意味着它不如将时间戳记存储在数据库中安全(实际上,我会将时间戳记存储在数据库中,接下来得分)。
    • 好的,谢谢,如果我该怎么做? if($row["lastpoint"] + 60 == time()) { //插入数据库 }else{ //dont } 这样正确吗?
    • 我至少会使用 <> 之类的比较,而不是 ==:如果查询在 61 秒后到达,则应将其考虑在内 ;;;我可能会将条件放在update 查询中;在伪代码中:update your_table set points = points+1, timestamp=$current_time where user_id=X and timestamp<=$current_time-60 ;;;否则,从您提出的建议开始,我想这可能没问题:if ($row['last_time'] + 60 <= time()) {insert}
    • 嗨,帕斯卡。更新行完美运行。虽然我有一个问题。我有一条我只想要的回声线,如果它插入了,但是当它在查询行中时你真的不能这样做吗?所以现在它只是回显“你已经获得 +1 分”,即使它没有插入(60 秒时间限制).. 希望你理解我,我原谅我的英语
    【解决方案2】:

    根据@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);
      });
    })();
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 糟糕!这正是 Pascal MARTIN 所说的。
      • 它只是插入 .time()。进入数据库,哪个不正确?
      • 这是为了保存上次的时间,这样你就知道他们是否试图作弊。它还会增加点数(仅当自上次增加后已过去 60 秒时)。很快,这就是您告诉 MYSQL 的内容:(将 points 增加 1 并更新时间戳)仅在自上次以来经过 60 秒时。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-21
        • 1970-01-01
        相关资源
        最近更新 更多