Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pola klasy są puste - dlaczego?
Forum PHP.pl > Forum > PHP
tomlis20
Witam serdecznie,

Jestem w trakcie tworzenia projektu ktory wymaga logowania uzytkownika, lecz napotkalem sie na pewien problem.

Moja strona opiera sie na krótkim kodzie zawartym w index.php:

  1. <?php
  2.  
  3. include('<config file>');
  4. include('<file with classes>');
  5.  
  6. $curUser = new logIn();
  7.  
  8. if(!isset($_SESSION['logged']) || $_SESSION['logged'] != 1)
  9. {
  10. $_SESSION['logged'] = 0;
  11. $page = "login.inc.php";
  12. }
  13. elseif(isset($_SESSION['logged']) && $_SESSION['logged'] == 1)
  14. {
  15. if(isset($_GET['p'])) {
  16. $p = $_GET['p'];
  17. } elseif(isset($_POST['p'])) {
  18. $p = $_POST['p'];
  19. } else {
  20. $p = NULL;
  21. }
  22.  
  23. switch($p) {
  24. case 'home':
  25. $page = 'home.inc.php';
  26. $page_title = 'Home Page - Admin Panel';
  27. break;
  28. case 'manage_pages':
  29. $page = 'manage_pages.inc.php';
  30. $page_title = 'Content Management Area - Admin Panel';
  31. break;
  32. case 'manage_files':
  33. $page = 'manage_files.inc.php';
  34. $page_title = 'Files Management Area - Admin Panel';
  35. break;
  36. case 'manage_menus':
  37. $page = 'manage_menus.inc.php';
  38. $page_title = 'Menus Management Area - Admin Panel';
  39. break;
  40. case 'manage_news':
  41. $page = 'manage_news.inc.php';
  42. $page_title = 'News Management Area - Admin Panel';
  43. break;
  44. case 'inactive_pages':
  45. $page = 'inactive_pages.inc.php';
  46. $page_title = 'Inactive Pages Management Area - Admin Panel';
  47. break;
  48. case 'site_settings':
  49. $page = 'site_settings.inc.php';
  50. $page_title = 'Site Settings Area - Admin Panel';
  51. break;
  52. case 'edit_page':
  53. $page = 'edit_page.inc.php';
  54. $page_title = 'Edit Page Area - Admin Panel';
  55. break;
  56. case 'add_page':
  57. $page = 'add_page.inc.php';
  58. $page_title = 'Add Page Area - Admin Panel';
  59. break;
  60. case 'logout':
  61. $page = 'logout.inc.php';
  62. break;
  63. case 'edit':
  64. $page = 'edit.inc.php';
  65. break;
  66. default:
  67. $page = 'home.inc.php';
  68. $page_title = 'Home Page - Pierhouse';
  69. break;
  70. }
  71. }
  72.  
  73. include('modules/header.php');
  74. include('includes/'.$page);
  75. include('modules/footer.php');
  76.  
  77. ?>

Tutaj tworze rowniez wskaznik na obiekt klasy logIn (o ktorej za moment) - $curUser, ktory posiada takie metody jak walidacja formularza, walidacja uzytkownika i prywatne pola.
W momencie kiedy uzytkownik poprawnie wypelni formularz logowania zaladowany przez zmienna $page dane wchodza do metody getPostData($u,$p), ona przepuszcza wartosci przez real_escape_string() i zapisuje w polach klasy

  1. // Gets data from form and checks it
  2. public function getPostData($u,$p)
  3. {
  4. global $mysqli;
  5. if(!isset($u) || empty($u))
  6. {
  7. $this->error = true;
  8. }
  9.  
  10. if(!isset($p) || empty($p))
  11. {
  12. $this->error = true;
  13. }
  14.  
  15. if($this->error != true)
  16. {
  17. $this->username = $mysqli->real_escape_string($u);
  18. $this->password = md5($mysqli->real_escape_string($p));
  19. }
  20. }


Nastepnie metoda validateUser() sprawdza czy taki uzytkownik istnieje i ... ogolnie mowiac przeprowadza proces logowania, ktorego wynikiem jest:
  1. // Sets session to 'logged'
  2. public function setSession()
  3. {
  4. $_SESSION['logged'] = 1;
  5. $_SESSION['user'] = $this->username;
  6. $_SESSION['admin'] = 1;
  7. }


oraz uzupelnienie pozostalych informacji o uzytkowniku:
  1. $this->sessionHash = md5(session_id());
  2. $this->userIp = $_SERVER['REMOTE_ADDR'];
  3. $this->userBrow = $_SERVER['HTTP_USER_AGENT'];
  4. $this->curData = time();


Proces logowanie w metodzie validateUser() opiera sie na wartosci pol klasy takie jak wlasnie $this->username, $this->userBrow etc. Metoda ta otrzymuje te wartosci prawidlowo (nie sa puste).

To teraz pyatnie za 100 punktów:
Dlaczego metoda logOut() - i nie tylko ona - kiedy probuje pobrac wartosci z pol klasy otrzymuje w zamian pusta zmienna? Przeciez to jest wszystko w obrebie tej samej klasy logIn, jedna metoda czyta wartosci prawidlowo a druga nie?

Dodam ze na calej stronie uzywam jednego obiektu klasy logIn.

metoda logout i pusta zmienna $this->sessionHash.
  1. // Log outs user
  2. public function logOut()
  3. {
  4. global $mysqli;
  5.  
  6. // It deletes all previous sessions added by user
  7. $mysqli->query(sprintf("DELETE FROM sessions WHERE username = '%s'",$this->sessionHash));
  8.  
  9. unset($_SESSION['logged'],$_SESSION['admin']);
  10. }


Probowalem wyswietlic kazde pole klasy i kazde jest zwracane puste. Nie mam pojecia gdzie lezy problem.

Dla przejrzystosci fragment klasy logIn:
  1. /* CLASS THAT HELPS TO MANAGE USER */
  2. class logIn extends general{
  3.  
  4. private $username,
  5. $password,
  6. $sessionHash,
  7. $userIp,
  8. $userBrow,
  9. $curData,
  10. $logError;
  11.  
  12. // Sets session to 'logged'
  13. public function setSession()
  14. {
  15. $_SESSION['logged'] = 1;
  16. $_SESSION['user'] = $this->username;
  17. $_SESSION['admin'] = 1;
  18. }
  19.  
  20. // Log outs user
  21. public function logOut()
  22. {
  23. global $mysqli;
  24.  
  25. // It deletes all previous sessions added by user
  26. $mysqli->query(sprintf("DELETE FROM sessions WHERE username = '%s'",$_SESSION['user']));
  27.  
  28. unset($_SESSION['logged'],$_SESSION['admin']);
  29. }
  30.  
  31. // Gets data from form and checks it
  32. public function getPostData($u,$p)
  33. {
  34. global $mysqli;
  35. if(!isset($u) || empty($u))
  36. {
  37. $this->error = true;
  38. }
  39.  
  40. if(!isset($p) || empty($p))
  41. {
  42. $this->error = true;
  43. }
  44.  
  45. if($this->error != true)
  46. {
  47. $this->username = $mysqli->real_escape_string($u);
  48. $this->password = md5($mysqli->real_escape_string($p));
  49. }
  50. }
  51.  
  52. // checks if user exists, if he is, it creates session for him and logs him in
  53. public function validateUser()
  54. {
  55. global $mysqli;
  56.  
  57.  
  58. // Search for user in database, if he exists
  59. $mysqli->query(sprintf("SELECT * FROM users WHERE username = '%s' AND password = '%s'",$this->username,$this->password));
  60.  
  61. if($mysqli->affected_rows)
  62. {
  63. $this->sessionHash = md5(session_id());
  64. $this->userIp = $_SERVER['REMOTE_ADDR'];
  65. $this->userBrow = $_SERVER['HTTP_USER_AGENT'];
  66. $this->curData = time();
  67.  
  68. // It deletes all previous sessions added by user
  69. $mysqli->query(sprintf("DELETE FROM sessions WHERE username = '%s'",$this->username));
  70.  
  71.  
  72. // It adds fresh, the only one, session to database which user will use to surf website
  73. $mysqli->query(sprintf("INSERT INTO sessions VALUES ('%s','%s','%s','%s','%d')",$this->sessionHash,$this->username,$this->userIp,$this->userBrow,$this->curData));
  74. if($mysqli->affected_rows)
  75. {
  76. // Sets session as logged
  77. $this->setSession();
  78. $this->redirect('add_page/');
  79. }
  80. }
  81. else
  82. {
  83. // Error message, wrong credentials given!
  84. echo 'Wrong username and/or password';
  85. }
  86. }



Jezeli cos nie jest jasne, prosze o pytania - chetnie zalacze inne fragmenty kodu lub cos objasnie, bo moglem to wytlumaczyc zbyt zawile.

Przepraszam za brak polskich znakow, lecz nie mam polskiej klawiatury na komputerze.

Dziekuje.


nospor
No ale przecież logowania i wylogowania zapewne nie robisz w czasie tego samego jednego żądania? Logiczne więc, że skoro podczas jednego żądania ustawisz wartość jakiejś zmiennej to podczas drugiego żądania zmienna ta nie jest ustawiona dopóki ponownie tego nie zrobisz.

Jak chcesz przenosić dane między żądaniami to musisz używać sesji.

Przenosze, bo problem z obiektówką nie ma związku.
tomlis20
To nie powinno dzialac w ten sposob, ze dany obiekt w momencie przypisania wartosci do pol ma je caly czas? Nie zmieniam obiektu, nie tworze nowego wskaznika, ktory na nowo by wymagal przypisania wartosci, tylko uzywam caly czas tego samego.
Dlaczego maja sie one wyzerowac?
nospor
Ale przeczytałeś co napisałem?
Zmienna/obiekt między kolejnymi żądaniami traci swoją wartość. Jak nie ustawisz to nie ma. Jak chcesz przenosić wartości zmiennych/obiektów między żądaniami to masz używać sesji. Koniec kropka
tomlis20
Świetnie. Po malych przerobkach kodu na sesje wszystko smiga. Dziekuje za klarowne objasnienie.

Pozdrawiam ze slonecznej Anglii
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.