2015-11-04 61 views
2

我有一個網站給用戶每個計時器1000分(30分鐘)。 當用戶點擊按鈕「開始計時器」時,計時器倒計時30分鐘,當計時器結束時按鈕出現,給用戶1000分。如何防止多個頁面?

我的問題是:用戶可以打開這個頁面了很多次,並得到很多分30分鐘,而不是1000

計時器腳本:

<script type="text/javascript"> 
var interval; 
var minutes = 30; 
var seconds = 0; 
var a; 
var audio = new Audio('timer.mp3'); 

function AutoRefresh(t) { 
    setTimeout("location.reload(true);", t); 
} 

function countdown(element) { 
    interval = setInterval(function() { 
     var el = document.getElementById(element); 
     if (seconds == 0) { 
      if (minutes == 0) { 
       el.innerHTML = '<h2>The Timer is over!</h2>'; 
       el.innerHTML += '<form action="timer.php" method="post" onsubmit="hide();" id="hide"><input type="submit" value="Get 1000 points" name="update" class="newslesubmit" style="width: 100%; font-size: 16px; box-shadow: inset 0px 1px 2px 0px rgba(238,238,238,1);" /></form>'; 
       audio.play(); 
       AutoRefresh(600000); 
       clearInterval(interval); 
       return; 
      } else { 
       minutes--; 
       seconds = 59; 
      } 
     } 
     if (minutes > 0) { 
      var minute_text = minutes + (minutes > 1 ? ' :' : ' :'); 
     } else { 
      var minute_text = ''; 
     } 
     if(minutes < 10) { 
      var minute_text = '0' + minutes + ' :';  
     } 
     var second_text = seconds > 1 ? '' : ''; 
     if(seconds < 10) { 
      var a = ' 0';  
     } else { 
      var a = ' ';  
     } 
     el.innerHTML = minute_text + a + seconds + ' ' + second_text + ''; 
     seconds--; 
    }, 1000); 
} 
function start() { 
    if (!interval) { 
     countdown('countdown'); 
    } 
}; 
function hide() { 
    var hide = document.getElementById('hide'); 
    hide.style.display='none'; 
} 
</script> 

的PHP和HTML:

<?php 
if(isset($_POST['update'])) { 
    $req = mysql_query('SELECT last_earn FROM users WHERE id="'.mysql_real_escape_string($_SESSION['userid']).'"'); 
    $dnn = mysql_fetch_array($req); 
    $a = $dnn['last_earn'] + 3000; 
    if($a <= time()){ 
     $date = date('Y-m-d H:i:s'); 
     mysql_query('UPDATE users SET last_earn="'.$date.'" WHERE id="'.mysql_real_escape_string($_SESSION['userid']).'"'); 
     mysql_query('UPDATE users SET earn=earn+1000 WHERE id="'.mysql_real_escape_string($_SESSION['userid']).'"'); 
     echo "<meta http-equiv='refresh' content='0;URL=index.php' />"; 
    } 
} 
?> 
<input type="button" value="Start timer" onclick="start(); this.style.display='none'" class="newslesubmit" style="width: 100%; font-size: 16px; box-shadow: inset 0px 1px 2px 0px rgba(238,238,238,1);" /> 
<div id="countdown" style="font-size: 40px; font-weight: bold;"></div> 

回答

1

無論何時您給用戶點在數據庫中設置了「最後收到的點數」列。只需將其保存爲時間戳或日期時間即可。然後,在使用積分進行更新時,只有在超過30分鐘前最後一次獲得積分時才進行更新:D沒有用戶可以作弊並獲得超過可能的積分。

+1

我怎麼能「超過30分鐘前」? – Eden

+0

@Eden首先,在users表中添加一個'points_last_received'列。這應該是一個MySQL日期時間字段。然後,在你的UPDATE語句中,你需要將points_last_received設置爲NOW()。這樣,你就會知道用戶何時最後得到了他們的分數。然後,在UPDATE語句之前,您需要首先爲該ID執行SELECT語句,並讓SELECT返回到points_last_received日期。如果points_last_received日期超過30分鐘前(php比較),請執行UPDATE,否則返回錯誤,他們是騙子而不是執行UPDATE。 –

+0

另外,歡迎來到SO!在您激勵公共援助時考慮投票。 ; D –