ďťż
Podstrony
|
telcocafeWitamchciałbym prosić o ocenę mojej klasy do obsługi sesji, klasa do działania wymaga php5 i biblioteki pdo, jeszcze jest mało rozbudowana, hasło w bazie jest szyfrowane funkcją sha1. w przykładzie login i hasło to 'ppp' <?php class session { private $sessid; private $user_id; // id zalogowanego usera, 0 - niezalogowany, private $browser; private $ip; /* doLogin() sprawdza czy dane przesłane z formularza zgadzają się z tymi w bazie, jeśli tak to zwraca true jeśli nie to zwraca false */ public function doLogin($login, $pass) { global $pdo; $stmt = $pdo -> prepare ('SELECT * FROM users WHERE u_login=:u_login AND u_pass=:u_pass'); $stmt -> bindValue(':u_login', $login, PDO::PARAM_STR); $stmt -> bindValue(':u_pass', sha1($pass), PDO::PARAM_STR); if ($stmt -> execute()) { $row = $stmt -> fetch(); $this -> user_id = $row['u_id']; $stmt -> closeCursor(); unset($stmt); $this -> new_session(); return true; } else { $stmt -> closeCursor(); unset($stmt); return false; } } // end doLogin (); /* isLogget() sprawdza czy user jest zalogowany zwraca true lub false */ public function isLogget () { return $this -> user_id == 0 ? false : true; } // end isLogget (); /* new_session() tworzy nową sesje, przy pierwszym wejściu na stronę */ public function new_session() { global $pdo; $this -> sessid = sha1(time().mt_rand()); if (empty($this -> user_id))$this -> user_id = 0; setcookie(COOKIE_NAME, $this -> sessid, time() + SESSION_LIVE_TIME); $stmt = $pdo -> prepare ('INSERT INTO sessions (`s_id`, `s_time`, `s_ip`, `s_browser`, `s_user_id`) VALUES ( :s_id, :s_time, :s_ip, :s_browser, :s_user_id )'); $stmt -> bindValue(':s_id', $this -> sessid, PDO::PARAM_STR); $stmt -> bindValue(':s_time', time() + SESSION_LIVE_TIME, PDO::PARAM_INT); $stmt -> bindValue(':s_ip', $this -> ip, PDO::PARAM_STR); $stmt -> bindValue(':s_browser', $this -> browser, PDO::PARAM_STR); $stmt -> bindValue(':s_user_id', $this -> user_id, PDO::PARAM_INT); $stmt -> execute() || die ('błąd bazy danych'); $stmt -> closeCursor(); unset($stmt); } // end new_session(); /* get_session() pobiera dane sesji przy kolejnych odsłonach strony */ public function get_session() { global $pdo; $stmt = $pdo -> prepare('SELECT * FROM sessions WHERE s_id=:s_id'); $stmt -> bindValue(':s_id', $this -> sessid, PDO::PARAM_STR); if (!$stmt -> execute()) { $this -> new_session(); } else { $row = $stmt -> fetch(); $this -> user_id = $row['s_user_id']; } $stmt -> closeCursor(); unset ($stmt); $pdo -> exec('UPDATE sessions SET s_time = \''.(time() + SESSION_LIVE_TIME).'\' WHERE s_id=\''.$this -> sessid.'\''); } // end get_session(); /* __construct() sprawdza czy jest cookie, jeśli tak to pobiera dane sesji, jeśli nie to tworzy nową */ public function __construct() { global $pdo; $this -> browser = $_SERVER['HTTP_USER_AGENT']; $this -> ip = $_SERVER['REMOTE_ADDR']; if (isset($_COOKIE[COOKIE_NAME]) && strlen($_COOKIE[COOKIE_NAME]) == 40) { $this -> sessid = $_COOKIE[COOKIE_NAME]; $this -> get_session(); } else { $this -> new_session(); } $this -> delete_old(); } // end __construct(); /* logout() wylogowuje usera, tworzy nową sesje */ public function logout(){ $this -> user_id=0; $this -> new_session(); } // end logout(); /* delete_old() usuwa stare sesje z bazy */ private function delete_old() { // usuwanie starych sesji global $pdo; $pdo -> exec ('DELETE FROM sessions WHERE s_time<'.SESSION_LIVE_TIME); } // end delete_old(); } ?> struktura bazy danych CREATE TABLE `sessions` ( `s_id` varchar(40) NOT NULL, `s_time` int(10) NOT NULL, `s_ip` varchar(12) NOT NULL, `s_browser` varchar(64) NOT NULL, `s_user_id` int(6) NOT NULL default '0', PRIMARY KEY (`s_id`), UNIQUE KEY `s_id` (`s_id`), KEY `s_id_2` (`s_id`) ) ENGINE=MEMORY DEFAULT CHARSET=latin2; CREATE TABLE `users` ( `u_id` int(6) NOT NULL auto_increment, `u_login` varchar(40) NOT NULL, `u_pass` varchar(40) NOT NULL, `u_last_visit` int(10) NOT NULL, `u_last_ip` varchar(12) NOT NULL, PRIMARY KEY (`u_id`) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin2 AUTO_INCREMENT=2 ; INSERT INTO `users` (`u_id`, `u_login`, `u_pass`, `u_last_visit`, `u_last_ip`) VALUES (1, 'ppp', 'b3054ff0797ff0b2bbce03ec897fe63e0b6490e0', 0, ''); przykład użycia <? define ('COOKIE_NAME', 'cms'); define ('SESSION_LIVE_TIME', 3600); $pdo = new PDO('mysql:host=localhost;port=;dbname=test', 'root', ''); $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); include 'class/session.php'; $session = new session; // tworzenie sesji if ($_GET['cmd'] == 'logout') { $session -> logout(); } if ($session -> isLogget()) { // jeśli zalogowany to wyświetlamy komunikat i link do wylogowania echo 'zalogowany<br><br> <a href="index.php?cmd=logout">wyloguj</a>'; } else { // jeśli nie zalogowany to formularz logowania lub logowanie if ($_SERVER['REQUEST_METHOD'] == 'POST') { if ($session -> doLogin($_POST['login'], $_POST['pass'])) { header('location:index.php'); } else { echo 'niepoprawne haslo'; } } else { echo '<form action="test.php" method="post"> <input type="text" name="login" /> <input type="password" name="pass" /> <input type="submit"> </form>'; } } ?> Użytkownik pgrzelka edytował ten post 04 październik 2008, 16:08
llNie molestuj tak bazy danych. Wystarczy jeden klucz - podstawowy. llBrakuje odświżania danych. Sesja powinna być odnawialna w bazie. Użytkownik będąc aktywnym przez 5 minut, gdy czas jest ustawiony na 6 minut zostanie uznany (przynajmniej tak by mogło być, gdyby nie błąd) za nieaktywnego po minucie od czasu ostatniego ruchu. Chyba rozumiesz? :-) llPoducz się angielskiego.l Użytkownik andrzej_aa edytował ten post 04 październik 2008, 17:09 |
|||
Sitedesign by AltusUmbrae. |