Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript][PHP]Odliczanie czasu misji
Forum PHP.pl > Forum > Przedszkole
P4nch0
Witam, Panowie i Panie mam problem ze zrobieniem skryptu odliczającego czas misji. Wiem, że takich skryptów było dużo i próbowałem dopasować jakieś, ale nie wszystko mi gra.

Może przybliżę sprawę:

Mam wyświetlane na stronie misje z przyciskami, po kliknięciu przycisku do bazy danych zapisuje mi czas rozpoczęcia mjisji i wyswietla jaka misja jest obecnie wykonywana oraz przycisk do zakonczenia misji. Po zakonczeniu misji sprawdza czy różnica czasu obecnego i czasu rozpoczęcia misji jest wieksza niz czas wykonywania misji (zakładany przy kazdej misji).

Doszedłęm do takiej formy skryptu:

  1. <?php
  2.  
  3. $time=time();
  4.  
  5. $gracz=mysql_query("SELECT * FROM statystyki WHERE id=$_SESSION[id] LIMIT 1");
  6. $gracz=mysql_fetch_assoc($gracz);
  7.  
  8.  
  9.  
  10. if ($_GET['pts'] !=''){
  11. if ($_GET['pts']==1 ){
  12.  
  13. $id=1;
  14. mysql_query("UPDATE statystyki SET wyprawa_start=$time, aktywna_wyprawa=$id WHERE id=$_SESSION[id]");
  15. header("Location: /index.php?action=wyprawy");
  16.  
  17. }
  18. if ($_GET['pts']==2 ){
  19.  
  20. $id=2;
  21. mysql_query("UPDATE statystyki SET wyprawa_start=$time, aktywna_wyprawa=$id WHERE id=$_SESSION[id]");
  22. header("Location: /index.php?action=wyprawy");
  23.  
  24. }
  25.  
  26. if ($_GET['pts']==3 ){
  27.  
  28. $id=3;
  29. mysql_query("UPDATE statystyki SET wyprawa_start=$time, aktywna_wyprawa=$id WHERE id=$_SESSION[id]");
  30. header("Location: /index.php?action=wyprawy");
  31.  
  32. }
  33. }
  34. if($_GET ['param1']=='stop'){
  35. $roznica=$time-$gracz['wyprawa_start'];
  36. $minuty_wykonane=floor($roznica/60);
  37. $czas_trwania=$wyprawy['czas_trwania'];
  38.  
  39.  
  40. if ($minuty_wykonane>$czas_trwania) {
  41. mysql_query("UPDATE statystyki SET wyprawa_start=0, aktywna_wyprawa=0 , zloto=zloto+100 WHERE id=$_SESSION[id]");
  42. echo"ukonczyles wyprawę!";
  43. }
  44. else{
  45.  
  46. echo "wyprawę przerwano!";
  47. mysql_query("UPDATE statystyki SET wyprawa_start=0, aktywna_wyprawa=0 WHERE id=$_SESSION[id]");
  48. header("Refresh: 5; url=http://www.lifetime.cba.pl./index.php?action=wyprawy");
  49.  
  50.  
  51. }
  52. die();
  53. }
  54. $aktywna_wyprawa=$gracz['aktywna_wyprawa'];
  55. $wyprawy=mysql_query("SELECT * FROM wyprawy WHERE id=$aktywna_wyprawa ");
  56. $wyprawy=mysql_fetch_assoc($wyprawy);
  57.  
  58. if ($gracz['wyprawa_start']!=0){
  59.  
  60. echo 'jestes na wyprawie '.$wyprawy['nazwa'];
  61.  
  62. $przycisk='<a href="index.php?action=wyprawy&param1=stop" ">Przerwij wyprawe!</a>';
  63. echo $przycisk;
  64.  
  65. $wyprawa_koniec= $gracz['wyprawa_start']+$wyprawy['czas_trwania']*60;
  66.  
  67.  
  68. echo "<span id=odliczanie></span>
  69. <script type=text/javascript>
  70. k=+new Date($rok,$miesiac,$dzien,$godzina,$minuta,$sekunda);
  71. (function(){sec=(k-new Date())/1000;
  72. document.getElementById('odliczanie').innerHTML=~~(sec/(3600*24))+' dni '+~~(sec/3600)%24+' godzin '+~~(sec/60)%60+' minut '+~~sec%60+' sekund';
  73. setTimeout(arguments.callee,1000)})()
  74. </script>" ;
  75.  
  76. }
  77.  
  78. else{
  79. echo '<a href="index.php?action=wyprawy&pts=1">Smocza dolina<br></a>Wymagania:<br>Sila=5,<br>Szybkosc=5,<br>Inteligencja=5,<br><br>Nagroda:<br>-300 zlota<br>-0,25 % doswiadczenia. <br><hr>
  80. <a href="index.php?action=wyprawy&pts=2">Jaskinia Drakana<br></a>Wymagania:Lvl=10,<br><br>Sila=15,<br>Szybkosc=15,<br>Inteligencja=15,<br><br>Nagroda:<br>-600 zlota<br>-0,30 % doswiadczenia. <br><hr>
  81. <a href="index.php?action=wyprawy&pts=3">Pustynie Gallarda<br></a>Wymagania:Lvl=15,<br><br>Sila=20,<br>Szybkosc=20,<br>Inteligencja=20,<br><br>Nagroda:<br>-1000 zlota<br>-0,35 % doswiadczenia. <br><hr>';}
  82. die();
  83.  
  84.  
  85.  
  86. ?>




JS wyświetla mi czas i odlicza go ładnie ale tylko do wpisanych ręcznie wartości, jednak nie wiem jak wstawić za zmienne $rok, $miesiac, $ dzien... zmienne z aktualnym czasem z serwera.
Wiem, że można to zrobić za pomocą date, jednak nie urządza mnie to ponieważ nie może być to data pobierana z komputeraz użytkownika.
W bazie danych date mam zapisaną z funkcji time(), jednak jest ona w formacie unixowym i nie mam pojęcia jak ją przekształcic na lata, miesiac dni i tak dalej.
Drugim sposobem jest może przypisanie do funkcji date() czas serwerowy, ale też nie wiem jak to zrobić.

Ma ktoś pomysł?

A tak przy okazji jeśli ktoś ma uwagi co do "stylu" napisania skryptu, prosze mówić jak pisać/ nie pisać bo to mój jeden z pierwszych kryptów napisanych samodzielnie bez poradników smile.gif

Działanie skryptu można zobaczyć na stronie lifetime.cba.pl po zalogowaniu na konto login: test haslo : test pod linkiem "wyprawy".
Z góry dziękuję za pomoc. Pozdrawiam.
Greg0
Funkcja date() w PHP pobiera zawsze czas z serwera, a nie od użytkownika. Użyj do komunikacji JS - PHP Ajaxa.
P4nch0
tak mowisz? to dziwne, gdy wstawilem tam zmienne z date to przy zmianie godziny na komputerze zmienialo sie rowniez na stronie..
motyl-pl
bo pewnie pracujesz na localhoście i Twój komputer jest serwerem biggrin.gif
Kshyhoo
Zapisuj koniec zdarzenia a potem:
  1. $pozostało = $event['koniec'] - time();
P4nch0
Dziękuję za zainteresowanie.

Motyl - jakbym robił to na localhoscie to bym nie podawał Wam linku żeby wejść ;p
Kshychoo - to mi nie dużo da bo odda mi tylku różnicę, a ja potrzebuje w zmiennych mieć konkretnę dane, chyba że źle Cię zrozumiałem.


Być może źle date używam, gdy wstawiłęm ją tak jak poniżej to echo $date pokazuje dobrą godzinę oraz java script pokazuje dobrą godzinę. Po zmianie godziny na komputerze, echo $date się nie zmienia bo jest zablokowane funkcją time() a w odliczaniu z Javyscript się już zmienia, czyli tak jakby pobierało z komputera, oraz przy każdym odświeżeniu przypisuje ponownie zmienne, więc to chyba też nie ten kierunek.

Wg mnie dobrą opcją byłoby zapisać czas koncowy w bazie danych i później powyciągać z niego do poszczególnych zmiennych wartości, jednak nie wiem jak można te wartości wyciągnąć ze zmienne unixowej?

Wygląda ona w ten sposób zapisana w bazie "1398268918".
Ma ktoś pomysł?


  1. if ($gracz['wyprawa_start']!=0){
  2.  
  3. echo 'jestes na wyprawie '.$wyprawy['nazwa'];
  4.  
  5. $przycisk='<a href="index.php?action=wyprawy&param1=stop" ">Przerwij wyprawe!</a>';
  6. echo $przycisk;
  7. echo '<br>';
  8. $wyprawa_koniec= $gracz['wyprawa_start']+$wyprawy['czas_trwania']*60;
  9.  
  10. $timestamp = time();
  11. $data = date("Y-m-d H:i:s",$timestamp);
  12.  
  13. echo $data;
  14.  
  15. echo '<br>';
  16. $rok= date("Y");
  17. $miesiac= date("m");
  18. $dzien=date("d");
  19. $godzina=date("H");
  20. $minuta=date("i");
  21. $sekunda=date("s");
  22.  
  23. echo "<span id=odliczanie></span>
  24. <script type=text/javascript>
  25. k=+new Date($rok,$miesiac,$dzien,$godzina,$minuta,$sekunda);
  26. (function(){sec=(k-new Date())/1000;
  27. document.getElementById('odliczanie').innerHTML=~~(sec/(3600*24))+' dni '+~~(sec/3600)%24+' godzin '+~~(sec/60)%60+' minut '+~~sec%60+' sekund';
  28. setTimeout(arguments.callee,1000)})()
  29. </script>" ;
  30.  
  31. }
Kshyhoo
Dlatego pisałem i końcu zdarzenia. W bazie zapisujesz koniec a w JS tylko wyświetlasz userowi czas i ew. po końcu zdarzenia robisz przeładowanie stony. To, czy gracz zmieni sobie czas, to jego broszka, a Ty jesteś pewny, że nie zaingeruje on w mechanikę skryptu...
P4nch0
a jest jakas metoda zeby przekonwertowac unixowa date i wyciagnac z niej wartosc? tzn godziny, dni itp. albo czy jest mozliwosc napisania scryptu w javie zeby odliczal np 2hlub 3h a nie ze musi odliczac od konkretnej daty? wolalbym zeby nie bylo jakiej kolwiek zmiany jak gracz zmieni godzine na kompie? jesli tak oczywiscie mozna.



edit

Witam, poczytałem trochę o date i doszedłem do wniosku, że wg tego muszę to zrobić.

Tylko moje pytanie brzmi, dlaczego to:
  1. $timestamp = time();
  2. $data = date("Y-m-d H:i:s",$timestamp);


nie zmienia się gdy zmieniam czas na komputerze, a to:
  1. $rok= date("Y");
  2. $miesiac= date("m");
  3. $dzien=date("d");
  4. $godzina=date("H");
  5. $minuta=date("i");
  6. $sekunda=date("s");


wyświetlane w JS już zmienia się gdy zmienię czas na komputerze? Mógłby ktoś pomóc poprawnie sformatować tą datę by nie zmieniała się podczas zmiany godziny na komputerze? Wertuję Manuala ale nie potrafię tego zrobić.
Turson
PHP pobiera czas serwera, a JS czas klienta (czyli komputera użytkownika).
P4nch0
I co mogę z tym zrobic? inaczej napisać skrypt JS?

Znalazłem na to rozwiązanie, ale niebardzo wiem jak to zastosować w moim skrypcie.

http://www.forumweb.pl/porady-i-tutoriale-...na-stronie,6329
Kshyhoo
Skoro się upierasz, to zobacz ten wątek.
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.