Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Przechowywanie czasu online
Forum PHP.pl > Forum > Przedszkole
piotrek442
Nie moge sobie poradzić z przechowywaniem czasu online ; /

W bazie mam takie rekordy jak czas_wejscia (np, 1385116379 ) i czas_online ( tutaj ma być przechowywany czas online )

I przy wyjściu chciałem odjąć aktualny czas od czasu wejścia i ten czas dodac do czasu online


i później przerobić na : byłeś online 4 dni 5 godzin 20 min i 20 s . ale totalnie mi to nie wychodzi prosze o pomoc! ; /
nospor
A co jesli user nie klinknie wyjscia tylko zamknie poprostu okno? Bedzie caly czas online?

No i pokaz co zrobiles do tej pory i co ci nie wychodzi. Wrozyc mamy?
piotrek442
  1. $q = $db->query("select `entry_time` from `userinfo` where `numer`='{$from}'");
  2. if($q->num_rows != 0){
  3.  
  4. while($n = $q->fetch_assoc())
  5. {
  6. $entry_time = $n['entry_time'];
  7. }
  8. }
  9.  
  10. $exit_time=time();
  11.  
  12.  
  13. $entry_time = date("d.m.Y h:i:s",$entry_time);
  14. $exit_time = date("d.m.Y h:i:s",$exit_time);
  15.  
  16.  
  17. $godziny = floor(( strtotime( $exit_time ) - strtotime( $entry_time ) ) / 3600);
  18. $minuty = floor((( strtotime( $exit_time ) - strtotime( $entry_time ) ) / 60) % 60);
  19. $sekundy = (strtotime( $exit_time ) - strtotime( $entry_time )) % 60;
  20.  
  21.  
  22. echo "byłeś online : $godziny godzin, $minuty minut , $sekundy sekund";




no to jeszcze działa! ale jak to zapisać do bazy?
nospor
Do modyfikacji rekordy w badzie sluzy UPDATE - zajrzyj do manuala.
piotrek442
ja wiem jak się robi update... tylko nie wiem jak odjąć te daty i dodać do ogólnego czasu online..
nospor
Nie wiesz jak odjac questionmark.gif Toc juz zrobiles odejmowanie :/

strtotime( $exit_time ) - strtotime( $entry_time )

zapisujesz se to do zmiennej:
$aktonline = strtotime( $exit_time ) - strtotime( $entry_time ) ;

A potem normalnie robissz zapytanie UPDATE
$sql = 'update tabela set czas_online=czas_online+'.$aktonline.' where JAKIS WARUNEK NA TWOJE REKORD';

Naprawde tu nie ma zadnej filozofii.
piotrek442
no dobra zrobiłem jak mówisz !

  1. $exit_time=time();
  2.  
  3. $entry_time = date("d.m.Y h:i:s",$entry_time);
  4.  
  5. $exit_time = date("d.m.Y h:i:s",$exit_time);
  6.  
  7. $aktonline = strtotime( $exit_time ) - strtotime( $entry_time ) ;
  8.  
  9. $q = $db->query("update `userinfo` set `online_time` = online_time+'.$aktonline.' where `...`='...' ");



byłem zalogowany trochę a do bazy wpisało "1" ohno-smiley.gif






nospor
Skoror czas w bazie trzymasz w timestamp to nie:

$exit_time=time();



$entry_time = date("d.m.Y h:i:s",$entry_time);



$exit_time = date("d.m.Y h:i:s",$exit_time);



$aktonline = strtotime( $exit_time ) - strtotime( $entry_time ) ;




a:
$exit_time=time();
$aktonline = $exit_time -$entry_time ;

piotrek442
czyli tak?

  1. $exit_time=time();
  2. $aktonline = $exit_time -$entry_time ;
  3. $q = $db->query("update `userinfo` set `online_time` = online_time+'.$aktonline.' where `numer`='{$from}' ");



w bazie zapisuje "0" a wartość początkowa jest też "0"
nospor
jak uzywasz " do tekstu to i laczyc masz przez ".." a nie przez '..'. Zmieniaj z glowa moj kod a nie sobie zmienisz jedno, inne zostawisz bez mian i zadowolny ....
piotrek442
teraz to już wogóle nie rozumiem...
nospor
Ja ci napisalem tak:
$sql = 'blabla '.$zmienna.' blabla';

Ty to radosnie zamieniles na:
$sql = "blabla '.$zmienna.' blabla";

Jesli naprawde nadal nie widzisz bledu w swojej zamianie to zapraszam do manuala i zapoznanie sie z podstawami obslugi tekstow.
zegarek84
Cytat(piotrek442 @ 22.11.2013, 12:47:57 ) *
...
byłem zalogowany trochę a do bazy wpisało "1" ohno-smiley.gif
Cytat(nospor @ 22.11.2013, 12:50:37 ) *
Skoror czas w bazie trzymasz w timestamp to nie:
...

@nospor chyba za długo w pracy ;]... ochłoń i luknij na temat z boku, bo jak Cię znam wiesz o co chodzi ^^... http jest bez stanowe... więc w tym samym żądaniu nie ma sensu nawet próbować zapisywać czas nie połączenia a czas otwartej strony ;p (no można i jak jest błąd połączenia od razu to jakby nie było połączenia ale to co wspomniałem nie ma sensu nawet zwracać uwagi bo musiałbym dogłębniej opisać)... połączenie http jest bezstanowe - tzn. symuluje się ciągłość połączenia na wiele sposobów, najprostszy i ogólnie stosowany to sesja...

sposobem na rozwiązanie tego problemu to np. założyć minimalny czas na stronie i go updatować co jakiś czas w zapytaniu ajax + zdarzenie onuload... inny sposób to skorzystanie z "wiszącego połączenia" gdzie nie zwracamy odpowiedzi, połączenie zostanie zerwane to ten ktoś zamknął połączenie (tu do poczytania hasła w stylu "ajax push", jsonp itd. bo to można zrobić np. na wczytującym się obrazku...), no i akurat przy tym drugim tricku idąc dalej początek i koniec połączenia można by wykonać w jednym skrypcie ale opisywanie to ociera się o daemon wywoływany online więc to też nie ma sensu... najprostsze rozwiązanie jak wspomniałem zapisać start i updatować czas opuszczenie na zasadzie powtarzającego się zapytania ajax lub na zasadzie ajax push...
piotrek442
tylko że to jest skrypt gg z bot api . Mam specjalną komendę która dokładnie określa końcowy czas . tylko nie mam pojęcia jak to zapisać zeby działało.
nospor
@zegarek zegarek.... i kto tutaj ma ochlonac? wink.gif

Cytat
tylko nie mam pojęcia jak to zapisać zeby działało.
Przeciez ci napisalem.... jeszcze tego nie poprawiles?
piotrek442
zrobiłem troche inaczej

  1. $czas=$exit_time-$entry_time;


gdzie czas wychodzi już w sekundach.

i teraz moje pytanie, w jaki sposób przechowywać w bazie ?
nospor
Jak zrobiles inaczej? Przeciez napisales dokladnie to samo co ja ci wczesniej pisalem:
Cytat
a:
$exit_time=time();
$aktonline = $exit_time -$entry_time ;

I tak, to jest wlasnie czas w sekundach. Jak zapisac w bazie? Przeciez tez ci to podalem :/
piotrek442
przepraszam , pogubilem się... facepalmxd.gif

więc jak to np zwraca mi wartość w sekundach to jak zapisze to do bazy i ktoś będzie rok zalogowany to wartość będzie 31536000 ?
i jaki typ danych użyć? nie obciąży to bazy?
nospor
A czemu ma obciazyc baze? Jest to zwykly INT UNSIGNED - normalna wartosc dla bazy.
piotrek442
Ostatnie pytanie bo już wszystko prawie wiem Lkingsmiley.png

Jak dam
  1. ALTER TABLE userinfo ADD online_time int(11) DEFAULT 0;

to będzie dobrze?
nospor
Sprawdz, w najgorszym wypadku wybuchnie komputer i pol bloku... wink.gif
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.