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:
<?php include('<config file>'); include('<file with classes>'); $curUser = new logIn(); { $_SESSION['logged'] = 0; $page = "login.inc.php"; } { $p = $_GET['p']; $p = $_POST['p']; } else { $p = NULL; } switch($p) { case 'home': $page = 'home.inc.php'; $page_title = 'Home Page - Admin Panel'; break; case 'manage_pages': $page = 'manage_pages.inc.php'; $page_title = 'Content Management Area - Admin Panel'; break; case 'manage_files': $page = 'manage_files.inc.php'; $page_title = 'Files Management Area - Admin Panel'; break; case 'manage_menus': $page = 'manage_menus.inc.php'; $page_title = 'Menus Management Area - Admin Panel'; break; case 'manage_news': $page = 'manage_news.inc.php'; $page_title = 'News Management Area - Admin Panel'; break; case 'inactive_pages': $page = 'inactive_pages.inc.php'; $page_title = 'Inactive Pages Management Area - Admin Panel'; break; case 'site_settings': $page = 'site_settings.inc.php'; $page_title = 'Site Settings Area - Admin Panel'; break; case 'edit_page': $page = 'edit_page.inc.php'; $page_title = 'Edit Page Area - Admin Panel'; break; case 'add_page': $page = 'add_page.inc.php'; $page_title = 'Add Page Area - Admin Panel'; break; case 'logout': $page = 'logout.inc.php'; break; case 'edit': $page = 'edit.inc.php'; break; default: $page = 'home.inc.php'; $page_title = 'Home Page - Pierhouse'; break; } } include('modules/header.php'); include('includes/'.$page); include('modules/footer.php'); ?>
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
// Gets data from form and checks it public function getPostData($u,$p) { { $this->error = true; } { $this->error = true; } if($this->error != true) { $this->username = $mysqli->real_escape_string($u); } }
Nastepnie metoda validateUser() sprawdza czy taki uzytkownik istnieje i ... ogolnie mowiac przeprowadza proces logowania, ktorego wynikiem jest:
// Sets session to 'logged' public function setSession() { $_SESSION['logged'] = 1; $_SESSION['user'] = $this->username; $_SESSION['admin'] = 1; }
oraz uzupelnienie pozostalych informacji o uzytkowniku:
$this->userIp = $_SERVER['REMOTE_ADDR']; $this->userBrow = $_SERVER['HTTP_USER_AGENT'];
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.
// Log outs user public function logOut() { // It deletes all previous sessions added by user }
Probowalem wyswietlic kazde pole klasy i kazde jest zwracane puste. Nie mam pojecia gdzie lezy problem.
Dla przejrzystosci fragment klasy logIn:
/* CLASS THAT HELPS TO MANAGE USER */ class logIn extends general{ private $username, $password, $sessionHash, $userIp, $userBrow, $curData, $logError; // Sets session to 'logged' public function setSession() { $_SESSION['logged'] = 1; $_SESSION['user'] = $this->username; $_SESSION['admin'] = 1; } // Log outs user public function logOut() { // It deletes all previous sessions added by user } // Gets data from form and checks it public function getPostData($u,$p) { { $this->error = true; } { $this->error = true; } if($this->error != true) { $this->username = $mysqli->real_escape_string($u); } } // checks if user exists, if he is, it creates session for him and logs him in public function validateUser() { // Search for user in database, if he exists $mysqli->query(sprintf("SELECT * FROM users WHERE username = '%s' AND password = '%s'",$this->username,$this->password)); if($mysqli->affected_rows) { $this->userIp = $_SERVER['REMOTE_ADDR']; $this->userBrow = $_SERVER['HTTP_USER_AGENT']; // It deletes all previous sessions added by user // It adds fresh, the only one, session to database which user will use to surf website $mysqli->query(sprintf("INSERT INTO sessions VALUES ('%s','%s','%s','%s','%d')",$this->sessionHash,$this->username,$this->userIp,$this->userBrow,$this->curData)); if($mysqli->affected_rows) { // Sets session as logged $this->setSession(); $this->redirect('add_page/'); } } else { // Error message, wrong credentials given! } }
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.