За последние 24 часа нас посетили 23173 программиста и 1692 робота. Сейчас ищут 1909 программистов ...

Нужна помощь PHP

Тема в разделе "PHP для новичков", создана пользователем skortes, 23 май 2017.

  1. skortes

    skortes Новичок

    С нами с:
    21 фев 2017
    Сообщения:
    36
    Симпатии:
    2
    Всем добрый день, нужна ваша помощь, в общем есть код который возобновляет энергию игроку. Все работает вроде шикарно, но есть проблема.
    Приведу пример: энергии максимум 5, когда ты потратил две или три к примеру у тебя осталось 2, вы выходите с сайта на минут +-10, заходите на сайт видно что таймер показывает к примеру что следующая энергия набирается за 2:04мин обновляешь страницу и таймер уже снова начинает отсчет по новой, и не плюсует +1 энергии вот код
    PHP:
    1. #восстановления энергии
    2. $currentDate = time();
    3. $dateDiff = $currentDate - $arr['fuel_time'];
    4. $newFuel = (int)$arr['energy'];
    5.  
    6. //3000 сек - время полного восстановления ...
    7. if ($dateDiff < $arr['full_recovery_time'] && $newFuel < $arr['max_energy'])
    8. {
    9.     while ($dateDiff > $arr['race_recovery_time'])
    10.     {
    11.         $newFuel++;
    12.         if ($newFuel >= $arr['max_energy'])
    13.         {
    14.             break;
    15.         }
    16.         $dateDiff = $dateDiff - $arr['race_recovery_time']; //600 сек == 10 мин
    17.     }
    18. }
    19. else
    20. {
    21.     $newFuel = $arr['max_energy'];
    22. }
    23.  
    24. if ($newFuel != $arr['energy'])
    25. {
    26.  
    27.     $sql->query("UPDATE `users` SET `energy`='$newFuel', `fuel_time`= '$currentDate' WHERE `id`='$arr[id]' LIMIT 1 ");
    28. }
    29.  
    30. #таймер обратного отсчета для востановления гонок
    31. $timerE=$arr['race_recovery_time'] - $dateDiff ;
    32.  
    33. if($timerE>0)
    34. {
    35.     $enersec=$timerE%60;$timerE=(int)($timerE/60);
    36.     $enermin=$timerE%60;$h=(int)($timerE/60);
    37.     $timeenergy = ($enermin<10?'0':'')."$enermin:".($enersec<10?'0':'')."$enersec";
    38. }else{
    39.     $timeenergy='';
    40. }
    Буду очень благодарен за помощь
     
    #1 skortes, 23 май 2017
    Последнее редактирование модератором: 24 май 2017
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.795
    Симпатии:
    1.331
    Адрес:
    Лень
    $arr[id] ыы - без кавычек
     
  3. skortes

    skortes Новичок

    С нами с:
    21 фев 2017
    Сообщения:
    36
    Симпатии:
    2
    да это не имеет значения
     
  4. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Выведите этот запрос и посмотрите как он выглядит:
    PHP:
    1. echo "UPDATE `users` SET `energy`='$newFuel', `fuel_time`= '$currentDate' WHERE `id`='$arr[id]' LIMIT 1 ";
     
  5. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    Время обновления(регенерации) энергии сохраняйте в таблице и от этого пляшите.
    Иначе, если обновлять, энергия никогда не восстановиться.

    Пример:
    Прошло 5 сек = +1 энергия, сохранить таймер.
    Прошло 20 сек = +4 энергии, сохранить таймер.
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.585
    Симпатии:
    1.762
    Ну так он там в строку подставляется, он и должен быть без кавычек.
     
  7. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.795
    Симпатии:
    1.331
    Адрес:
    Лень
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.585
    Симпатии:
    1.762
    @MouseZver, по ссылке на документацию, которую ты привёл:
    PHP:
    1. // Внутри строки это нормально. Внутри строк константы не
    2. // рассматриваются, так что ошибки E_NOTICE здесь не произойдет
    3. print "Hello $arr[fruit]"; // Hello apple
    У ТС ровно тоже самое:
     
  9. skortes

    skortes Новичок

    С нами с:
    21 фев 2017
    Сообщения:
    36
    Симпатии:
    2
    ничего не понял
     
    denis01 нравится это.
  10. skortes

    skortes Новичок

    С нами с:
    21 фев 2017
    Сообщения:
    36
    Симпатии:
    2
    ничего не понятно
     
  11. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.585
    Симпатии:
    1.762
    @skortes, не, это мы не про твою задачу с @MouseZver. Это он просто не обращал внимания на случаи, когда кавычки для текстовых индексов не нужны :)

    По твоей задаче. Лично я бы делал так:
    1. Скрипт записывает в базу время пополнения энергии. При заходе на страницу оставшееся время записывается куда-нибудь в переменную js, и таймер уже отчитывается через JS. Но само пополнение энергии происходит не здесь
    2. На сервере каждую минуту включается крон, который находит игроков, которым пора пополнить энергию, и пополняет её.

    Единственное, теоретически может быть рассинхрон, думаю, что стоит сделать, чтоб таймер на сайте слегка отставал, если это не критично
     
  12. skortes

    skortes Новичок

    С нами с:
    21 фев 2017
    Сообщения:
    36
    Симпатии:
    2
    я понял спасибо, попробую что-то такое сделать
     
    denis01 нравится это.