JS / php добавить за каждую минуту - PullRequest
4 голосов
/ 14 февраля 2010

Что я хочу сделать, так это чтобы каждый пользователь получал 1 очко каждую минуту. Теперь у меня есть php-код в addpoints.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 минуты, а затем выдать ошибку point else.

Мне просто интересно, есть ли какая-нибудь лучшая идея / вещь, которую можно сделать, чтобы предотвратить эту маленькую проблему?

Ответы [ 4 ]

3 голосов
/ 14 февраля 2010

Сохранение даты + времени (с использованием, например, отметки времени) последнего увеличения значения счетчика, рядом с этим результатом (будь то $_SESSION или в базе данных) действительно будет решением:

  • при поступлении запроса на увеличение оценки проверьте отметку времени
    • если это более 60 секунд назад, то увеличить счет и обновить отметку времени
    • иначе, не обновляйте ни оценку, ни отметку времени
0 голосов
/ 14 февраля 2010

Вам действительно нужно хранить только временную метку в $ _SESSIONS и не беспокоиться о том, что находится в базе данных. Еще одна полезная вещь, которую вы можете сделать, чтобы предотвратить автоматические сценарии, - это разрешить некоторую аутентификацию для доступа к странице, желательно с логином и сильной капчей. Также убедитесь, что защищены от подделки форм и сохраните несколько запросов на один и тот же IP и заблокируйте их. Это предотвратит повторное обновление вашего сервера DOS. Вы можете использовать другие вещи, чтобы определить, автоматизирован ли bieng, например, IP, проверка реферера и т. Д.

0 голосов
/ 14 февраля 2010

Я бы предложил добавить столбец 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, чтобы убедиться, что правильный пользователь вызывает скрипт, или даже убедиться, что пользователь вошел в систему.;)

0 голосов
/ 14 февраля 2010

на основе ответа @Pascal MARTIN, если решение хорошо, вы выбираете @Pascal MARTIN 'response

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);
  });
})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...