Class PDO login user
- Szczegóły
- Kategoria: PDO
- Opublikowano: wtorek, 30, kwiecień 2013 13:24
- Super User
- Odsłony: 76459
Class PDO
userClass część 3
userClass.php, prk_user.sql by Adam Berger is licensed under a Creative Commons Uznanie autorstwa-Użycie niekomercyjne-Bez utworów zależnych 3.0 Unported License.
W oparciu o utwór dostępny pod adresem www.joomla-cms.com.pl
Klasę użytkownika postanowiłem zrobić tak jak session, przypisanie połączenia z PDO przez konstruktor. Do tego trzeba było się zastanowić co będzie potrzebne do działania całości. Doszedłem do wniosku, że na początek, zrobię metodę odpowiedzialną za sam proces logowania, do której potem będę się odwoływał w pliku index.php w głównym katalogu. Następnie wykonam mniej istotne rzeczy z mojego punktu widzenia. Do metody trzeba zaimportować id sesji z klasy userSesionClass. Do logowanie jeszcze będę potrzebował ip, datę. Do pobrania ip posłużyłem się metodą, która dodatkowo sprawdza, czy user łączy się przy pomocy proksy (teoretycznie). Do czyszczenia danych przychodzących z post, też najlepiej było zrobić osobną metodę, która efektywnie będzie wykonywać powierzone zadanie. Następną sprawą to wylogowanie. To na sam początek powinno wystarczyć do prawidłowego działania.
userClass.php
include_once basename('databaseClass.php'); require_once basename('userSesionClass.php'); class User { private $name; // dane z tablicy $_POST private $password; // dane z tablicy $_POST private $name_user; /// kto zalogowany private $sesion; /// przypisanie classy sesji public $error; // czy poprawna private $post; // czyść post private $post1 = array(); // czyść post private $db; /// przypisanie połączenia z PDO przez konstruktor public function __construct() { //parent::__construct(); $this->db = new DBBER(); // połączenie z bazą $this->sesion = new Session(); // session }
############################ Zaloguj ##################################### public function zaloguj($name, $password) { $this->name = $this->czyscpost($name); $this->password = $this->czyscpost(md5($password)); try{ if(isset($this->name)) { $this->db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $stmt = $this->db->prepare('SELECT u_login, u_haslo, u_email FROM `'.$this->db->dbprefix().'user` WHERE `u_login`=:username && `u_haslo`=:password && `u_aktywny`=:u_aktywny && u_zalogowany=:u_zalogowany');
$stmt->bindValue(':username', $this->name, PDO::PARAM_STR); $stmt->bindValue(':password', $this->password, PDO::PARAM_STR); $stmt->bindValue(':u_aktywny', '1', PDO::PARAM_INT); $stmt->bindValue(':u_zalogowany', '0', PDO::PARAM_INT); $stmt->execute(); if($de = $stmt->fetch()) { $this->sesion->przypiszsesje($this->name); /// przypisanie sesji $this->db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $stmt = $this->db->prepare('UPDATE `'.$this->db->dbprefix().'user` SET u_sesion=:u_sesion, u_online=NOW(), u_ip=:u_ip, u_zalogowany=:u_zalogowany WHERE `u_login`=:username and `u_haslo`=:password'); $stmt->bindValue(':username', $this->name, PDO::PARAM_STR); $stmt->bindValue(':password', $this->password, PDO::PARAM_STR); $stmt->bindValue(':u_sesion', $this->sesion->idsesion(), PDO::PARAM_STR); /// przypisanie sesji do bazy danych $stmt->bindValue(':u_ip', $this->ip(), PDO::PARAM_STR); $stmt->bindValue(':u_zalogowany', 1, PDO::PARAM_INT); $stmt->execute(); }elseif($this->name != $de['u_login'] and $this->password != $de['u_haslo']){ echo $this->error = '<hr/><div align="center"><p>Błędne Login lub hasło!</p></div><hr/>'; }else{ $this->wyloguj(); echo $this->error = '<hr/><div align="center"><p>Przepraszamy, podany rekord nie istnieje lub został zablokowany!</p></div><hr/>'; /// } $stmt->closeCursor(); } }catch(PDOException $e){ echo 'Połączenie loguj nie mogło zostać utw.<br />'.$e; } return $this->error; } ############################ Sprawdź Admin ##################################### public function admin() { try{ $ad = false; $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $this->db->prepare('SELECT u_admin FROM `'.$this->db->dbprefix().'user` WHERE `u_login`=:username && `u_admin`=:u_admin'); @$stmt->bindValue(':username', $this->user(), PDO::PARAM_STR); $stmt->bindValue(':u_admin', 1, PDO::PARAM_INT); $stmt->execute(); foreach($stmt as $row) { if($row['u_admin'] == 1) {$ad = true;}else{$ad = false;} } $stmt->closeCursor(); }catch(PDOException $e){ echo 'Połączenie nie mogło zostać utw.<br />'.$e; } return $ad; }
############################ Sprawdź User ##################################### public function user() { try{
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $this->db->prepare('SELECT u_login FROM `'.$this->db->dbprefix().'user` WHERE `u_sesion`=:u_sesion'); @$stmt->bindValue(':u_sesion', $this->sesion->idsesion(), PDO::PARAM_STR); $stmt->execute(); foreach($stmt as $row) { if(isset($row['u_login'])) {$this->name_user = $row['u_login'];} } $stmt->closeCursor(); }catch(PDOException $e){ echo 'Połączenie nie mogło zostać utw.<br />'.$e; } return $this->name_user; } ############################ Czy proxy ip ##################################### public function ip() { if(isset($_SERVER["HTTP_X_FORWARDED_FOR"])) // wartość superglobalnych { $ip = $_SERVER["HTTP_X_FORWARDED_FOR"]; /// ip potencjalnie niebezpieczny $tt = $_SERVER["REMOTE_ADDR"]." proksy"; /// ip proxy }else{ $tt = $_SERVER['REMOTE_ADDR']; } return $tt; // ." ".$tt_g } ############################# czyść post ################################ public function czyscpost($post) { $this->post = $post; $this->post = trim($this->post); $this->post = strip_tags($this->post); $this->post = htmlspecialchars($this->post); $this->post = htmlentities($this->post, ENT_QUOTES,'UTF-8'); $this->post = stripslashes($this->post); $this->post = stripcslashes($this->post); preg_match('/^[a-zA-ZąęćłńóśźżĄĆĘŁŃÓŚŹŻ0-9\@\_\-\.]+$/', $this->post, $this->post1); return $this->post1[0]; } public function wyloguj() { try{ $this->db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $stmt = $this->db->prepare('UPDATE `'.$this->db->dbprefix().'user` SET `u_sesion`=:u_sesion, u_ip=:u_ip, u_zalogowany=:u_zalogowany WHERE `u_login`=:username'); $stmt->bindValue(':username', $this->user(), PDO::PARAM_STR); $stmt->bindValue(':u_ip', $this->ip(), PDO::PARAM_STR); $stmt->bindValue(':u_sesion', 1, PDO::PARAM_INT); $stmt->bindValue(':u_zalogowany', 0, PDO::PARAM_INT); $stmt->execute(); echo $this->error = '<hr/><div align="center"><p>Zostałeś Wylogowany!</p></div><hr/>';; session_unset(); }catch(PDOException $e){ echo 'Połączenie wyloguj nie mogło zostać utw.<br />'.$e; } return $this->error; }
}
Tabela do bazy danych
prk_user.sql
CREATE TABLE IF NOT EXISTS `(tutaj nasz prefiks)user` ( `u_id` int(11) NOT NULL AUTO_INCREMENT, `u_login` varchar(55) NOT NULL, `u_email` varchar(120) NOT NULL, `u_haslo` varchar(255) NOT NULL, `u_aktywny` int(11) NOT NULL DEFAULT '1', `u_data` varchar(20) NOT NULL, `u_referer` varchar(255) NOT NULL, `u_sesion` varchar(255) NOT NULL, `u_online` varchar(25) NOT NULL, `u_ip` varchar(255) NOT NULL, `u_protokul` varchar(55) NOT NULL, `u_admin` int(11) NOT NULL DEFAULT '0', `u_zalogowany` int(11) NOT NULL DEFAULT '0', `u_agent` varchar(255) NOT NULL, PRIMARY KEY (`u_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;