Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]Problem z odejmowaniem dat
Forum PHP.pl > Forum > Przedszkole
Marr
Witam,
Mój problem polega na tym: chcę sobie zrobić liczenie łącznego czasu zalogowania użytkownika i na razie jestem na etapie liczenia czasu od logowania do wylogowania. Skrypt wygląda tak:
  1. <?php
  2. $baza=mysql_connect("localhost", "root", "");
  3. mysql_select_db("systen");
  4. mysql_query("SET NAMES utf8");
  5. ?>
  6. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  7. <html xmlns="ht://www.w3.org/1999/xhtml">
  8. <meta http-equiv="refresh" content="180; url=index.php?auth_admin=logout">
  9.                            
  10. <?php
  11. if ($_GET['auth_admin']=='logout'){
  12. $active = 0;
  13. $logouttime = date("U");
  14. $zapytanie_t= mysql_query ("SELECT * FROM pracownicy WHERE id='$_SESSION[logged_admin]';");
  15. $login_time = $zapytanie_t['login_t'];
  16. $staryczas = $zapytanie_t['czas'];
  17. $roznica = $logouttime - $login_time ;
  18.  
  19. $logout = "UPDATE pracownicy SET aktywny = '" . $active . "', logout_t = '" . $logouttime . "', czas = '".$roznica."' WHERE id = '" .$_SESSION['logged_admin'] . "'";
  20. mysql_query($logout);
  21. unset($_SESSION['logged_admin']);
  22. }
  23. //
  24. // dalsza czesc skryptu ....
  25. //
  26. else{
  27.                        session_start();
  28.                        $_SESSION['logged_admin']=$id;
  29.                        zalogowany_admin();
  30.                        $active = true;
  31.                        $logintime = date("U");
  32.                        $aktywny = "UPDATE pracownicy SET aktywny = '" . $active . "', login_t = '".$logintime."' WHERE id = '" .$_SESSION['logged_admin'] . "'";
  33.                        mysql_query($aktywny);
  34.                    }
  35.                }
  36.            }
  37.        }else{
  38.        logowanie_admin();
  39.        }
  40.    }
  41. }
  42. function zalogowany_admin(){
  43.    
  44.    }
  45.    
  46.  
  47. ?>

tylko problem polega na tym ze na poczatku skryptu, gdzie liczę różnicę czasu to zmienna $róznica jest równa $logouttime a przecież odejmuje od niej $login_time :/ co jest nie tak? Moze ktoś podpowie jak rozwiązać problem liczenia czasu gdy ktos jest nieaktywny ale się nie wylogował - np. zamknął przeglądarkę, lub odszedł od komputera.

EDIT: ojejku juz widze, przeciez nie zapisalem drugiej daty do tablicy w ogole ;/ ale pozostale pytania nadal jak najbardziej aktualne
robos85
  1. <?php
  2. $zapytanie_t= mysql_query ....
  3. ?>

a czy nie powinieneś np z tego zrobić tablicy asocjacyjnej zanim będziesz się odwoływał do poszczególnych jej elementów?
Marr
Robert, przecież napisałem swojego EDIT'a o 15 z kawałkiem. Aktualnie nie mogę się uporać z poprawnym liczeniem czasu gdy ktoś zamknie przeglądarkę zamiast się wylogować ;/ O a może automatycznie wylogowywać użytkownika po określonym czasie ? tylko z kolei jak sie za to zabrać ;/
b4x
Ajax + window.onclose smile.gif

Albo taki mały przykład w PHP tongue.gif
  1. $ilosc_min = 60;
  2. <?php
  3. mysql_query('UPDATE `users` SET `action` = "0", `czas_total` = `czas_total` + "'.$ilosc_min.'" WHERE `action_time`<SUBDATE(DATE_FORMAT(NOW(), "%Y-%m-%d&nbsp::%s"), INTERVAL 10 MINUTE)');
  4. ?>
Pilsener
Na moje oko to jest zbyt skomplikowane. Nie prościej po prostu śledzić usera i zapisywać w statach każdą akcję, typu pobranie pliku etc - i tak każdy z jakiś tam statystyk korzysta, więc można to przerobić/dostosować etc. Gdy użytkownik nie wykona żadnej akcji to zakładasz, że był na stronie tyle, ile wynosi czas ważności sesji - a czy zamknął wtedy przeglądarke czy nie to nie ma znaczenia.
Marr
@b4x
Mógłbyś podać jakiś przykład z użyciem ajax'a i window.onclose?

EDIT - dobra, znalazłem coś w sieci. Jak nadal bede mial problemy napewno napisze
Pilsener
A jak ktoś ma JS OFF albo nie zamyka okna, tylko wpisze xlaski.pl? Przemyśl dobrze, co chcesz osiągnąć.
Marr
A czy złotym środkiem nie byłoby użycie window.onclose dodatkowo ustawienie czasu php na powiedzmy 5min i jezeli ktos nie przejdzie na inna strone przez 5min to zapisywac czas do bazy?
b4x
Ja na twoim miejscu bym zapisywał ostatnią akcję smile.gif

np.

  1. <?php
  2.  
  3. function ZapiszAkcje($user) {
  4.  
  5. mysql_query('UPDATE `users` SET `ostatnia_akcja` = NOW() WHERE `id` = "'.$user.'"');
  6.  
  7. }
  8.  
  9.  
  10. ?>


I np. w kodzie strony ustawiasz (jeśli user jest zalogowany.)

  1. <?php
  2. if(isset($_SESSION['userid'])) {
  3. ZapiszAkcje($_SESSION['userid']);
  4. }
  5. ?>



Później bym sprawdzał czy np. jeśli user nie był aktywny np. 10 min to sumował mu czas (pobierając czas ostatniej akcji - czas zalogowania ). winksmiley.jpg
Marr
Więc tak, kombinowałem kombinowałem i coś nie liczy mi to poprawnie czasu chyba. Coś nie mogę się połapać gdzie robie błąd. Może ktoś wychwyci:

to wykonuje jak loguje użytkownika:
  1. <?php
  2.                        $_SESSION['logged_admin']=$id;
  3.                        zalogowany_admin();
  4.                        $active = true;
  5.                        $logintime = date(&#092;"U\");
  6.                        $aktywny = &#092;"UPDATE pracownicy SET aktywny = '\" . $active . \"', login_t = '\".$logintime.\"' WHERE id = '\" .$_SESSION['logged_admin'] . \"'\";
  7.                        mysql_query($aktywny);
  8. ?>


to wykonuje w przypadku gdy ktoś kliknie wyloguj:

  1. <?php
  2. $active = 0;
  3. $logouttime = date(&#092;"U\");
  4. $zapytanie_t = mysql_query (&#092;"SELECT * FROM pracownicy WHERE id='$_SESSION[logged_admin]';\");
  5. $rekordzik = mysql_fetch_assoc ($zapytanie_t);
  6. $login_time = $rekordzik['login_t'];
  7. $staryczas = $rekordzik['czas'];
  8. $roznica = $logouttime - $login_time + staryczas ;
  9.  
  10. $logout = &#092;"UPDATE pracownicy SET aktywny = '\" . $active . \"', logout_t = '\" . $logouttime . \"', czas = '\".$roznica.\"' WHERE id = '\" .$_SESSION['logged_admin'] . \"'\";
  11. mysql_query($logout);
  12. unset($_SESSION['logged_admin']);
  13. }
  14. ?>


a to z kolei na początku strony mam wciśnięte:
  1. <?php
  2. if (isset($_SESSION['logged_admin'])){
  3. $loggedid = $_SESSION['logged_admin'];
  4. $pobranieakcji = mysql_query (&#092;"SELECT * FROM pracownicy WHERE id='$_SESSION[logged_admin]';\");
  5. $rekordakcja = mysql_fetch_assoc ($pobranieakcji);
  6. $ostatino = $rekordakcja['ostatnia_akcja'];
  7. $login_t = $rekordakcja['login_t'];
  8. $old = $rekordakcja['czas'];
  9. if ($ostatnio+300 < date(&#092;"U\")){
  10. $obliczony = $ostatnio - $login_t + $old;
  11. $aktualizacja = &#092;"UPDATE pracownicy SET czas = '\".$obliczony.\"' WHERE id = '\" .$_SESSION['logged_admin'] . \"'\";
  12. $logintime = date(&#092;"U\");
  13. }
  14. ZapiszAkcje($loggedid);
  15. ?>


funkcja ZapiszAkcje jest to funkcja, którą napisał @b4x
  1. <?php
  2. function ZapiszAkcje($user) {
  3.  
  4. mysql_query('UPDATE `pracownicy` SET `ostatnia_akcja` = date(\"U\") WHERE `id` = \"'.$user.'\"');
  5.  
  6. }
  7. ?>



Już za długo się chyba z tym męcze i nie potrafie sam wylapac bledu, widzi ktoś coś? Zdarza mi się tak, że czas raz jest mniejszy a raz większy ;/

Bożesz Ty mój! Teraz to czas zalogowania wychodzi mi ujemny a ja nie potrafie znaleźć błędu, proszę o pomoc. To akcje które wykonuje:
podczas logowania
  1. <?php
  2.                        $_SESSION['logged_admin']=$id;
  3.                        zalogowany_admin();
  4.                        $active = true;
  5.                        $logintime = date(&#092;"U\");
  6.                        $aktywny = &#092;"UPDATE pracownicy SET aktywny = '\" . $active . \"', login_t = '\".$logintime.\"' WHERE id = '\" .$_SESSION['logged_admin'] . \"'\";
  7.                        mysql_query($aktywny);
  8. ?>


podczas wylogowania
  1. <?php
  2. if ($_GET['auth_admin']=='logout'){
  3. $active = 0;
  4. $logouttime = date(&#092;"U\");
  5. $zapytanie_t = mysql_query (&#092;"SELECT * FROM pracownicy WHERE id='$_SESSION[logged_admin]';\");
  6. $rekordzik = mysql_fetch_assoc ($zapytanie_t);
  7. $login_time = $rekordzik['login_t'];
  8. $staryczas = $rekordzik['czas'];
  9. $roznica = $logouttime-$login_time + $staryczas;
  10.  
  11. $logout = &#092;"UPDATE pracownicy SET aktywny = '\" . $active . \"', logout_t = '\" . $logouttime . \"', czas = '\".$roznica.\"' WHERE id = '\" .$_SESSION['logged_admin'] . \"'\";
  12. mysql_query($logout);
  13. unset($_SESSION['logged_admin']);
  14. }
  15. ?>


a to na początku index'a
  1. <?php
  2. if (isset($_SESSION['logged_admin'])){
  3. $loggedid = $_SESSION['logged_admin'];
  4. $pobranieakcji = mysql_query (&#092;"SELECT * FROM pracownicy WHERE id='$_SESSION[logged_admin]';\");
  5. $rekordakcja = mysql_fetch_assoc ($pobranieakcji);
  6. $ostatino = $rekordakcja['ostatnia_akcja'];
  7. $login_tajm = $rekordakcja['login_t'];
  8. $old = $rekordakcja['czas'];
  9.  
  10. if (($ostatnio+300) < date(&#092;"U\")){
  11. $obliczony = $ostatnio - $login_tajm + $old;
  12. $logintime = date(&#092;"U\");
  13. $aktualizacja = &#092;"UPDATE pracownicy SET czas = '\".$obliczony.\"', login_t = '\" . $logintime . \"' WHERE id = '\" .$_SESSION['logged_admin'] . \"'\";
  14. $wykonanie = mysql_query($aktualizacja);
  15. }
  16.  
  17. $dataakcji = date(&#092;"U\");
  18. $zapiszakcjeq = mysql_query('UPDATE `pracownicy` SET `ostatnia_akcja` = \"'.$dataakcji.'\" WHERE `id` = \"'.$loggedid.'\"');
  19.  
  20. include('modules/descriptions.php');
  21. }
  22. ?>


O rany naprawde nie widzę tu błędu, zaczyna mieszać mi się to wszystko...
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.