Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Pola klasy są puste - dlaczego?
tomlis20
post 16.09.2011, 09:54:03
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 12.03.2011

Ostrzeżenie: (0%)
-----


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.


Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
nospor
post 16.09.2011, 09:59:07
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
tomlis20
post 16.09.2011, 10:05:33
Post #3





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 12.03.2011

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
nospor
post 16.09.2011, 10:06:52
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
tomlis20
post 16.09.2011, 10:16:22
Post #5





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 12.03.2011

Ostrzeżenie: (0%)
-----


Świetnie. Po malych przerobkach kodu na sesje wszystko smiga. Dziekuje za klarowne objasnienie.

Pozdrawiam ze slonecznej Anglii
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 05:08