Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> odliczanie czasu i wykonanie instrukcji
pain3hp
post
Post #1





Grupa: Zarejestrowani
Postów: 87
Pomógł: 2
Dołączył: 23.01.2010

Ostrzeżenie: (0%)
-----


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....


Ten post edytował pain3hp 24.06.2011, 19:29:16
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
mat-bi
post
Post #2





Grupa: Zarejestrowani
Postów: 690
Pomógł: 92
Dołączył: 6.02.2011

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
pain3hp
post
Post #3





Grupa: Zarejestrowani
Postów: 87
Pomógł: 2
Dołączył: 23.01.2010

Ostrzeżenie: (0%)
-----


datę trzymam w DATETIME, to jest źle?
Go to the top of the page
+Quote Post
Rochu
post
Post #4





Grupa: Zarejestrowani
Postów: 64
Pomógł: 14
Dołączył: 25.09.2010

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
pain3hp
post
Post #5





Grupa: Zarejestrowani
Postów: 87
Pomógł: 2
Dołączył: 23.01.2010

Ostrzeżenie: (0%)
-----


DZIEKI!!!
Go to the top of the page
+Quote Post
tehaha
post
Post #6





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Rochu
post
Post #7





Grupa: Zarejestrowani
Postów: 64
Pomógł: 14
Dołączył: 25.09.2010

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
tehaha
post
Post #8





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 05:25