Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]zmienna w klasie się gubi
Forum PHP.pl > Forum > Przedszkole
BugsBunny
oto kawałek klasy:
  1. <?php
  2. class login extends database
  3. {
  4. private $timeout;
  5.  
  6. private $starttime;
  7.  
  8. private $rank;
  9.  
  10. private $user;
  11.  
  12. private $login = false;
  13.  
  14. function __construct()
  15. {
  16. require('./config.php');
  17. $this->timeout = $cfg['page']['SessionDuration'];
  18. $this->rank = 0;
  19.  
  20. }
  21.  
  22. function logIn($user1,$md5pass)
  23. {
  24. $this->connect();
  25. $Validate = $this->select('SELECT id,rank FROM user WHERE login=''.$user1.'' and pass=''.$md5pass.'' LIMIT 1;' );
  26.  
  27. if($Validate)
  28. {
  29.  $_SESSION['id'] = md5(microtime);
  30. $tmptime = time();
  31. $this->insert('INSERT INTO session(id,start,user,rank) VALUES (''.$_SESSION['id'].'',''.$tmptime.'','.$Validate[0]['id'].','.$Validate[0]['rank'].' )');
  32. $this->starttime = $tmptime;
  33. $this->rank = $Validate[0]['rank'];
  34. $this->login = true;
  35. $this->user = $user1;
  36.  
  37. return true;
  38. }
  39. else
  40. return false;
  41.  
  42. }
  43.  
  44. function logOut()
  45. {
  46.  $this -> remove('DELETE FROM session WHERE id =''.$_SESSION['id'].'' LIMIT 1;');
  47.  $this->login = false;
  48. }
  49.  
  50. function isTimeOut()
  51. {
  52. if($this->starttime+$this->timeout < time())
  53. {
  54.  
  55. $this->logOut();
  56. return true;
  57. }
  58. else
  59. {
  60. $this -> update('UPDATE session SET start = ''.time().'' WHERE id =''.$_SESSION['id'].'' LIMIT 1;');
  61. $this->starttime = time() ;
  62.  
  63. return false;
  64. }
  65.  
  66. }
  67. ?>


chodzi o to, że w funkcji logIn wartość $this->starttime jest prawidłowa tzn przyjmuje time();

natomiast już w funkcji isTimeOut() nic się nie wyświetla tak jakby zmienna nie istniała. blinksmiley.gif
webdice
Proszę zmienić tytuł tematu, na taki który opisuje problem.
nospor
Cytat
natomiast już w funkcji isTimeOut() nic się nie wyświetla

Nie wiem czy zauwazyles, ale w isTimeOut nie masz zadnego kodu odpowiedzialnego za wyswietlanie to i nic sie nie wyswietla.

pozatyym:
$this->starttime+$this->timeout < time()
skoto $starttime to time() to kazda warttosc dodana do time() bedzie wieksza od time(), wiec warunek nigdy sie nie spelni - pomijam fakt liczb ujemnych.

Moze napisz po ludzku co to ma robic, jak to uzywasz a nie strzelasz tekstami ktore tylko ty rozumiesz smile.gif

lektura obowiązkowa:
http://rtfm.killfile.pl/
BugsBunny
Cytat
Nie wiem czy zauwazyles, ale w isTimeOut nie masz zadnego kodu odpowiedzialnego za wyswietlanie to i nic sie nie wyswietla.


Nigdzie nie ma kodu odpowiedzialnego za wyświetlanie. DODAJE SOBIE GO w celu sprawdzenia
  1. <?php
  2. echo $this->starttime;
  3. die();
  4. ?>


filozofia jest taka, że po zalogowaniu mamy czas ostniego działania w zmiennej starttime i w bazie danych.
IsTimeOut sprawdza czy tamten czas plus zdefiniowany TimeOut nie przekroczył aktualnego czasu, jeżeli tak wylogowuje i wyświetlam stosowny komunikat, jeżeli nie ustawiam starttime na aktualny czas.

Ale chyba nie ma to nic wspólnego z tematem bo jeżeli w LogIn wklepie podany wyżej kod to mi wyśiwetli liczbę, w isTimeOut już nie(PUSTO)
nospor
rety... co rozumiesz pod pojęciem
Cytat
jak to uzywasz a nie strzelasz tekstami ktore tylko ty rozumiesz

Bo ja rozumiem, ze nalezy pokazac kod i powiedziec jak uzywasz tego obiektu. Bo dalej tego nie zrobiles.

Zgaduje wiec ze:
w jednym request masz LOGIN a nastepnym request masz sprawdzanie isTimeOut. No ale moj drogi, przeciez jesli tego gdziesz nie przechowasz, to w nastepnym request obiekt bedzie mial wyzerowane swoje wartosci. Musisz to gdziesz zapamietac, np. sesja - robisz tak?
BugsBunny
na poczatku to jest w index.php tworze obiekt
  1. <?php
  2. $ologin = new login();
  3. ?>


tutaj go obsługuje:
  1. <?php 
  2.  
  3.  
  4. if(!empty($_SESSION['id']))
  5. { 
  6. if($_GET['logout'] == 'true')
  7. {
  8.  
  9.  $ologin->logOut();
  10.  $tpl->assign('login',$ologin->isLogIn());
  11. }
  12. else
  13. { 
  14. if($ologin->isTimeOut())
  15. {
  16.  
  17. $tpl->assign('error','Automatycznie wylogowano - brak reakcji użytkownika');
  18. $tpl->assign('login',$ologin->isLogIn());
  19. }
  20. else
  21. {
  22.  
  23. $tpl->assign('login',$ologin->isLogIn());
  24. }
  25. }
  26. }
  27. else
  28. {
  29. $tpl->assign('login',false);
  30. }
  31.  
  32. if(!empty($_POST['login']) && !empty($_POST['pass']))
  33. {
  34. $login = $_POST['login'];
  35. $pass = md5($_POST['pass']);
  36.  
  37. if($ologin->logIn($login,$pass))
  38. {
  39. $tpl->assign('rank', $ologin->getRank());
  40. $tpl->assign('login', $ologin->isLogIn());
  41. }
  42. }
  43. ?>
nospor
no to robisz tak jak ci napisalem (czyli źle): w oddzielnych requestach sprawdzasz rzeczy z innych requestow. Tlumacze ci przeciez ze to sie samo z siebie nie zapamietuje. Musisz uzyc np. sesji do zapamietania starttime. No juz prosciej nie da sie tego napisac winksmiley.jpg
BugsBunny
w sensie, że przy przeładowaniu strony obiekt jest tworzony jeszcze raz?

Mam w sesji trzymać obiekt ?

Może bardziej optymalne będzie pobieranie w konstrukutorze z bazy tych danych ( bo tam też je mam)
nospor
Cytat
w sensie, że przy przeładowaniu strony obiekt jest tworzony jeszcze raz
bingo. Przy przeladowaniu strony wykonuje sie jeszcze raz kod, ktory napiszesz, z uwzględnieniem rzecz jasnych nowych warunkow jesli wystapią. Jesli wiec za kazdym razie w kodzie tworzysz nowy obiekt, to on za kazdym razem sie tworzy.

Cytat
Mam w sesji trzymać obiekt
mozesz obiekt, a mozesz tylko wybrane dane. zalezy od ciebie
BugsBunny
Wielkie dzięki za pomoc. Jako, że w bazie trzymam wszystko związane z sesją to w konstruktorze pobieram dane i przywracam stan obiektu.
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.