Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: odliczanie czasu i wykonanie instrukcji
Forum PHP.pl > Forum > PHP
pain3hp
Chcę zrobić spotykane w grach przeglądarkowych budowanie jakiś budynków, czyli klikamy buduj i jest np czas budowy 3 minut. Na potrzeby nauki zrobiłem to tak:

baza:
id, nazwa_budynku, koniec

"koniec" jest typem datetime

mam formularz i sobie dodaję mniej więcej tak:

  1. $budynek = $_POST['budynek'];
  2. $teraz = date('Y-m-d H:i:s');
  3. $minuta= 180;
  4. $teraz = strtotime($teraz);
  5. $_tmp_dataZakonczenia = $teraz + $minuta;
  6. $dataZakonczenia = date('Y-m-d H:i:s',$_tmp_dataZakonczenia);
  7. $db = Database::instance();
  8. $wynik = $db->query("INSERT INTO budowa (budynek, koniec) VALUES ('$budynek', '$dataZakonczenia')");
  9. echo 'dodałem i czas zakonczenia to: ' .$dataZakonczenia;

dodaje mi czasy w formacie "2011-06-24 19:50:36", o trzy minuty wiecej niz data z serwera czyli jest OK. Teraz chciałbym mieć licznik ile czasu pozostało do końca budowy a potem oczywiście żeby w bazie ta budowa się zaznaczyła, z samą operacja w bazie dam radę tylko jak to zrobić żeby to się zrobiło samo z siebie po przejściu tego licznika? Do tego jest chyba CRON ale czy można z poziomu PHP dawać mu zadania, mogę korzystać tylko z directadmina.

I czy w ogóle mam na to dobry pomysł? może (raczej tak) da się to zrobić lepiej... proszę o pomoc....
mat-bi
auu, jeszcze mi powiedz, że datę trzymasz w varchar puke.gif

Daty nie trzyma się normalnie, unix_timestamp jest łatwy w obróbce, a przy gotowej dacie bawisz się w funkcje i tracisz moc serwa...

Równie dobrze, jak nie masz dostępu do crona, przy każdym requeście robić zapytanie, które zaznacza budynki mające więcej niż te 3 minuty, że są wybudowane. Jeżeli zaś masz crona, odpalaj plik przez nieggo co jakiś czas.
pain3hp
datę trzymam w DATETIME, to jest źle?
Rochu
sam tez jestem w trakcie tworzenia autorskiej gry via www i jesli jakakolwiek date trzymasz w bazie to trzymaj ja w surowej postaci samych liczb, czyli najlepiej takiemu polu tabeli nadac typ int(11), a w zapytaniu dajesz
... set data_cos_tam = ".time()."...

mniej wiecej poprawiony ten twoj kod:

  1. $budynek = $_POST['budynek'];
  2. $db = Database::instance();
  3. $wynik = $db->query("INSERT INTO budowa (budynek, koniec) VALUES ('$budynek', ".time()." + 180);
  4. echo 'dodałem i czas zakonczenia to: ' .$dataZakonczenia;

i sam widzisz o ile mniej niepotrzebnych linijek kodu, co do licznika to wklejasz ponizszy kod na stronie:

  1. <script type="text/javascript">
  2. //timer by Rochu
  3. function czasBudowania(id, czas_bud) {
  4.  
  5. var id_timer = document.getElementById(id);
  6. var hou = Math.floor(czas_bud / 3600);
  7. var min = Math.floor((czas_bud - hou * 3600) / 60);
  8. var sec = czas_bud - min * 60 - hou * 3600;
  9.  
  10. if (czas_bud > 0) {
  11. czas_bud--;
  12. id_timer.innerHTML = hou + ' godz ' + min + ' min ' + sec + ' sek';
  13. setTimeout("czasBudowania('"+id+"',"+czas_bud+" )", 1000);
  14. } else id_timer.innerHTML = "Gotowe";
  15.  
  16. }
  17. </script>


a czas do zakonczenia budowy wyswietlasz banalanie jak ponizej:

  1. $koniec_bud = czas_zakonczenia_budowy - time();
  2. czas do konca: <span id='id_odliczania'></span>
  3. <script type='text/javascript'>czasBudowania('id_odliczania', $koniec_bud);</script>


jezeli na jednej stronie jest potrzebne odliczanie czasu dla kilku elementow to po prostu dla kazdego dajesz inne id_odliczania
pain3hp
DZIEKI!!!
tehaha
Cytat
to trzymaj ja w surowej postaci samych liczb, czyli najlepiej takiemu polu tabeli nadac typ int(11)

Cytat
i sam widzisz o ile mniej niepotrzebnych linijek kodu

A Ty sam zobaczysz jak bardzo będziesz tego żałował jak tylko przyjdzie Ci wykonać jakieś operacje na dacie i będziesz musiał cały silnik przerabiać. Datę trzyma się w jednym z formatów daty, jeżeli trzymasz ją jako INT() to przekreślasz sobie możliwość korzystania z tych funkcji http://dev.mysql.com/doc/refman/5.5/en/dat...-functions.html

I w tym wypadku zaoszczędzenie 1 dodatkowej linijki kodu to nie jest optymalizacja tylko zły nawyk
Rochu
jak to napisales "mam ten zly nawyk" i poki co chyba tak jeszcze bede go mial, jednak mam jedno pytanie, ktore nie wiem czy jest prawda, jesli sobie pobiore ta date z bazy z pola int to czy jesli ja sobie sformatuje do takiego samego stanu jak powinna wygladac, gdy typ pola to datetime to czy bede mogl wtedy uzywac tych funkcji? chyba tak... chodz wlasnie pewien nie jestem wiec wyjasnij
tehaha
chodzi o to, że do póki nie potrzebujesz z tą datą nic więcej robić to jest ok, ale załóżmy, że będziesz chciał zrobić użytkownikowi jakieś statystyki co będzie wymagało zliczania, sumowa, grupowania wyników z różnych podziałów czasu to wtedy pojawi Ci się problem i będziesz zmuszony tworzyć jakieś bardzo nie wydajne kombinacje, jest to zwłaszcza istotne w przypadku gier gdzie bazy danych bardzo szybko rosną i wydajność jest kluczowym elementem
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.