<?php
 $over_time=time()+3600;
 $nowtime=time();
 $query=$db->query("select down_time from members where uid='1'");
 $down_time=$query->fect_assoc(); if($down_time['down_time']<$nowtime){
   $db->query("update members set down_time=$over_time where uid='1'");
   die('你成功得奖励!');
 }else{
   $latime=$down_time['down_time']-$nowtime;
   die("你已经领过奖励了,请等$latime分钟后再试!");
 }?>
这个判断有个问题,就是点得快一点后呢,可能就会给他两次以上的奖励。。主要看他的网络有多卡,我最多看到有给
8次奖励。有什么办法可以解决这个问题呢?

解决方案 »

  1.   

    這個是因為數據庫的查詢和系統時間之間的差異造成的。不要直接用PHP取nowtime,而是應該從數據庫中查詢nowtime和downtime,這樣會減少誤差
      

  2.   

    update members set down_time=$over_time where uid='1' AND down_time<".$nowtime //加上时间限制是否成功执行,用语句影响列数,判断
      

  3.   

    意思是还是要用锁,不能用这种?意思是SELECT 语句比UPDATE快了。
    所以当几个select 后,他还没有update完。。所以才造就了这个结果?那用锁的话,如果我并发比较高,对性能比影响比较大。有没有好的办法?我一直认为SQL语句是按照顺序执行的郁闷了。。
      

  4.   

    解决方法有很多种,一种是使用数据库的行级锁,锁定这一行,语句就用3楼的SQL语句。
    还有一种是写PHP逻辑,在MENCACHED等内存缓存中增加一个标志,必须等你执行完后才能执行下次操作。
    还有一种是在前端JS判断,也是增加一个标记,就是全局变量记录上次点击该按钮时间,和本次时间比较,小于你要求的时间就不提交到后端。
      

  5.   

    用事务, 尽量不要自己去锁表, 交给mysql完成还有一个简单点的方法
    update members set down_time=$over_time where uid='1'  
       and down_time<date_sub(now(),interval 1 hour )
    这样重复的提交就不会发生实际的数据更改
      

  6.   

    告诉你哥最简单,最常用的,但可能防不住恶意刷的办法,点完按钮后用js让按钮disable即可