Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Работа с временем
 
 автор: Равечка   (01.07.2007 в 03:47)   письмо автору
 
 

Передо мной встала задача которую никак не могу решить....
прошу помощи :)

Итак. есть пользователь которому каждый час прибавляются очки (поинты, деньги, статы, как угдно)
Например каждый час пользователь получает по 36 очков, а в данный момент у него 100.

Пользователь зашел на сайт через 30 минут (после своего последнего захода) и увидел что очков у него 118. Как это реализовать?

Причем интервал хотелось бы не стандартный (30 минут), а чтобы высчитывалось даже если он айдет через 2 секунды. (но при этом прибыл не привышала бы установленную в час)

   
 
 автор: Unkind   (01.07.2007 в 04:24)   письмо автору
 
   для: Равечка   (01.07.2007 в 03:47)
 

Что-то вроде этого

<?php
$points 
36//Очков в час
$ts time();
$interval ceil(3600 $points);

session_start();

$_SESSION["usr_points"] = isset($_SESSION["usr_points"]) ? $_SESSION["usr_points"] : 0;
$_SESSION["points_add"] = isset($_SESSION["points_add"]) ? $_SESSION["points_add"] : $ts;

    if(
time() - $_SESSION["points_add"] > $interval)
    {
        
$_SESSION["usr_points"] += intval(($ts $_SESSION["points_add"]) / $interval);
        
$_SESSION["points_add"] = $ts - (($ts $_SESSION["points_add"]) % $interval);
    }

echo(
"You have " $_SESSION["usr_points"] . " points.");
?>

   
 
 автор: Trianon   (01.07.2007 в 09:49)   письмо автору
 
   для: Равечка   (01.07.2007 в 03:47)
 


SELECT 
    username, 
    starttime,  
    startrate, 
    (UNIX_TIMESTAMP()-UNIX_TIMESTAMP(starttime)) AS delta, 
    rate, 
    startrate+(UNIX_TIMESTAMP()-UNIX_TIMESTAMP(starttime))*rate/3600) AS score 
FROM users

   
 
 автор: Unkind   (01.07.2007 в 14:30)   письмо автору
 
   для: Trianon   (01.07.2007 в 09:49)
 

Тогда я бы добавил FLOOR():


SELECT  
    `username`,  
    `starttime`,   
    `startrate`,  
    (UNIX_TIMESTAMP() - UNIX_TIMESTAMP(`starttime`)) AS `delta`,  
    `rate`,  
    `startrate` + FLOOR((UNIX_TIMESTAMP() - UNIX_TIMESTAMP(`starttime`)) * `rate` / 3600) AS `score`  
FROM `users`;


Чтобы очки были целым числом.

   
 
 автор: Trianon   (02.07.2007 в 01:58)   письмо автору
 
   для: Unkind   (01.07.2007 в 14:30)
 

Это уже вопрос отображения... На прикладном уровне информацию имеет смысл держать точной. По возможности.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования