2010-02-13 7 views
4

Что я хочу сделать, так это то, что каждый пользователь получает по 1 балла каждую минуту. Теперь у меня есть код PHP в addpoints.php, а затем я попробовал себя с JQuery JavaScript:JS/php добавить за каждую минуту

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 make a if(), который проверяет последнюю датуту, больше 1 минуты, а затем выдавать ошибку в противном случае.

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

ответ

3

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

  • , когда запрос, чтобы увеличить разрыв в счете приходит, проверьте метку времени
    • , если это более 60 секунд назад, затем увеличить разрыв в счете, и обновлять метку времени
    • еще, не обновляют счет, ни метки
+0

Да, это то, о чем я думал .. вы можете рассказать больше о идее $ _session? – Karem

+0

Способ слишком часто удаляться из базы данных (то есть в те моменты, когда нет необходимости обновлять счет, так как прошло менее 1 минуты), возможно, следует сохранить временную метку в сеансе (см. Http: //www.php. net/manual/en/book.session.php) ;; но очистить файлы cookie в браузере или с помощью другого или автоматизированного сценария было бы достаточно, чтобы изменить сеанс - это означает, что он не так безопасен, как сохранение метки времени в базе данных (я бы сохранил временную метку в базе данных, на самом деле, следующий к партитуре). –

+0

ладно спасибо, как я должен делать, если? if ($ row ["lastpoint"] + 60 == time()) {// вставить в базу данных} else {// dont} это правильно? – Karem

0

на основе реакции @Pascal MARTIN, если решение хорошо, вы выбираете ответ @Pascal Мартина

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

+0

К сожалению, это именно то, что сказал Паскаль МАРТИН. – Daan

+0

это как раз inserts .time(). в базу данных, что неверно? – Karem

+0

Это, чтобы сохранить предыдущее время, чтобы вы знали, пытаются ли они обмануть или нет. Он также увеличивает точки (только когда прошло 60 секунд с момента последнего приращения). Вкратце, вот что вы скажете MYSQL: (увеличивайте «очки» на 1 и обновляйте метку времени), только если прошло 60 секунд с момента последнего. – Daan

0

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