Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] Blokada robienia czegoś na X godzin
Forum PHP.pl > Forum > Przedszkole
grzegosh
Witam. Bawię się w tworzenie minigierki. Chodzi mi o to, że po wybraniu żeby nasza postać szła na X godzin do pracy, gdzie po X godzinach zarobi X*10 exp'a, następowała blokada robienia czegokolwiek do czasu minięcia tych X godzin, a po tym czasie, aby zwiększył się exp postaci o X*10...

Zrobiłem tak, że w bazie mam tabele work, w której przechowuje id użytkownika, oraz date końca pracy w datetime.
Potem php sprawdzam po odświeżeniu strony czy już jest owa godzina i wszystko chodzi ładnie, do czasu, aż nie zbliżam się do godziny północnej... czyli jak jest już 23, wyśle postać na 2 godz do pracy, to pisze mi od razu, że misja została zakonczona. Po prostu sprawdzam datę, ale nie sprawdza mi dni chyba, tylko samą godzinę... Jak zrobić, by to zabezpieczyć? Oraz jak zrobić, by wypisać ile jeszcze czasu zostało, aby postać znów była odblokowana, kiedy wróci z "pracy"? W tej chwili zapisuje czas do pola Time i wypisuje po prostu o której wróci, a nie za ile.
Dziękuję za pomoc.

Wysyłanie postaci do pracy:
  1. <?php
  2. $dodaj = 3600*2;
  3.        $data = gmdate("H:i:s,", time() + $dodaj);
  4.        $godzina= gmdate("H",time() + $dodaj)+$_POST['ilosc_godzin'];
  5.        if($godzina >= 24)
  6.        {
  7.            $godzina = $godzina - 24;
  8.        }
  9.        $end = gmdate("Y.m.d.".$godzina.".i.s", time() + $dodaj);
  10.        $end_h = gmdate($godzina.":i:s", time() + $dodaj);
  11.            
  12.        $query = mysql_query("INSERT INTO work VALUES (NULL,".$_SESSION['id'].", ".$_POST['ilosc_godzin'].", '".$end."', '".$end_h."')");
  13.  
  14.        echo "Wysłałeś postać do pracy na ".$_POST['ilosc_godzin']." godzin/y by pracował.";
  15. ?>


Sprawdzenie czy postać już wróciła.
  1. <?php
  2. $dodaj = 3600*2;
  3.  
  4.    $obecny_czas = gmdate("H:i:s", time() + $dodaj);
  5.    $q = mysql_query("SELECT * FROM work WHERE user_id=".$_SESSION['id']);
  6.    $row = mysql_fetch_array($q);
  7.    
  8.    echo "obecny czas: ".$obecny_czas;
  9.    if($row['end_h']<$obecny_czas)
  10.    {
  11.        $exp = $row['hours']*10;
  12.        echo "Misja zakończona! Zdobyłeś ".$exp." punktów doświadczenia.";
  13.        $query = mysql_query("DELETE FROM work WHERE user_id=".$_SESSION['id']);
  14.    }
  15.    else
  16.    {
  17.        echo "Wysłałeś postać na ".$row['hours']." godzin pracy.<br />Wróci o godzinie ".$row['end_h']."<br/>";
  18.    }
  19. ?>
Pawel_W
wpisz do bazy datę w formacie date('U');, wtedy zadziała
grzegosh
Tzn, wpisać uniksową datę do bazy, ale w takiej formie, że do niej dodać 60*60*X? I potem sprawdzać czy obecna unixowa data jest mniejsza?
Ok, a powiedz mi proszę jeszcze jak zrobić, aby mieć ile godzin i minut zostało do końca? Odjąć te daty od siebie i podzielić na sekundy, minuty, godziny?
Wicepsik
Masz tutaj prosty skrypt zamieniania czasu z sekund.
Odejmujesz od wiekszej daty mniejszą.

  1. <?php
  2. function _getTime($time)
  3.    {
  4.  
  5.            $czas = $time;
  6.  
  7.            $minut = sprintf("%02d", floor($czas / 60) % 60);
  8.            $sekund = sprintf("%02d", floor($czas) % 60);
  9.            $godzin = sprintf("%02d", floor($czas / (60 * 60) % 24));
  10.  
  11.  
  12.            return $godzin . ':' . $minut . ':' . $sekund;
  13.            //mozesz dodac tygodnie, dni, miesiace lub lata
  14.    }
  15. ?>
grzegosh
Ok, dzięki wielkie.
Mam jeszcze jedno pytanie, jak widać wyżej, używam gmdate i dodaje do niego 2 godziny. Co zrobić, by automatycznie kiedy zmieni się czas na zimowy, dodawało mi 1 godzinę? Bo domniemam, że jak będzie czas zimowy, to to sie zmienia? Czy będzie dobrze?
Wicepsik
http://pl.php.net/manual/pl/function.date.php
Duża litera i
grzegosh
Zrobiłem tak:
$strefa = gmdate("I");
$dodaj = 3600+(3600*$strefa)+(60*60*$_POST['ilosc_godzin']);
$end = gmdate("U", time()+$dodaj);

Chyba działa, choć zbytnio nie mam jak sprawdzić smile.gif
Jeszcze raz dziękuję, pozdrawiam, można zamknąć.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.