Class PDO session
- Szczegóły
- Kategoria: PDO
- Opublikowano: niedziela, 28, kwiecień 2013 13:39
- Super User
- Odsłony: 73916
Class PDO session
część 2
class Session userSesionClass.php 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
Na przykładzie klasy sesji pokaże jak chcę przekazywać dane pomiędzy klasami w samym konstruktorze, a nie przez dziedziczenie. Same dziedziczenie jest potrzebną rzeczą, lecz mnie interesuje czy takie połączenie jest szybsze. Klasę sesji postanowiłem zrobić właśnie w taki sposób. Sama klasa sesji nie powinna być skomplikowana przyjąłem, że powinna składać się z numeru, jakoś zakodowanego np. przez sha1(), plus sprawdzenie poprawności samej sesji i na koniec dla zwiększenia bezpieczeństwa, np. co godzinę zmiana id sesji plus kodowanie danych usera. Zwróćcie uwagę na sam konstruktor tam będę sprawdzał poprawność sesji i nawiązywał połączenie z bazą danych. Oczywiście jak w pierwszej części tak i w drugiej, będę używał biblioteki PDO.
Piszcie co o tym sądzicie czy to aby na pewno szybsze.
userSesionClass.php
include_once basename('databaseClass.php'); class Session { private $sesion_id; // id sesji private $isSesion = false; // czy jest sesja private $db; /// przypisanie połączenia z PDO przez konstruktor public function __construct() { $this->db = new DBBER(); ############################ Sprawdź Sesję ##################################### if($this->sprawdzsesje() == true) { $this->czas_sesji(); }else{ session_unset(); } } public function przypiszsesje($user) { $_SESSION['u_login'] = $this->koduj($user); $_SESSION['session_id'] = sha1(session_id()); $_SESSION['start_sesion'] = date("Y-m-d H:i:s"); return; } private function sesja() { try{ ############### SESJA ############################### if($this->idsesion() && isset($_SESSION['u_login'])) { $this->db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $stmt = $this->db->prepare('SELECT u_sesion FROM `'. $this->db->dbprefix().'user` WHERE u_login=:u_login and u_sesion=:u_sesion'); $stmt->bindValue(':u_login', $this->dekoduj($_SESSION['u_login']), PDO::PARAM_STR); $stmt->bindValue(':u_sesion', $this->idsesion(), PDO::PARAM_INT); $stmt->execute(); foreach($stmt as $row) { if($row['u_sesion'] != 1 && isset($row['u_sesion'])) { $this->isSesion = true; }else{ $this->isSesion = false; } } } }catch(PDOException $e){ echo 'Połączenie w sesji nie mogło zostać utw.<br />'.$e; $this->isSesion = false; } return $this->isSesion; } public function idsesion() { if(isset($_SESSION['session_id'])) { $this->sesion_id = $_SESSION['session_id']; } return $this->sesion_id; } protected function koduj($koduj) { return base64_encode($koduj); } protected function dekoduj($koduj) { return base64_decode($koduj); } public function sprawdzsesje() { return $this->sesja(); } private function czas_sesji() { try{ $cz = date($_SESSION['start_sesion']); $basedate = strtotime($cz); $date1 = strtotime("1 hours", $basedate); $this->czas_za_godzine = date("Y-m-d H:i:s", $date1); if(date("Y-m-d H:i:s") > $this->czas_za_godzine && $this->idsesion() != 1) { $_SESSION['start_sesion'] = date("Y-m-d H:i:s"); session_regenerate_id(); $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=:u_online, u_zalogowany=:u_zalogowany WHERE u_login=:u_login'); $stmt->bindValue(':u_online', $_SESSION['start_sesion'], PDO::PARAM_STR); $stmt->bindValue(':u_sesion', $this->idsesion(), PDO::PARAM_INT); $stmt->bindValue(':u_zalogowany', 1, PDO::PARAM_INT); $stmt->bindValue(':u_login', $this->dekoduj($_SESSION['u_login']), PDO::PARAM_STR); $stmt->execute(); $stmt->closeCursor(); } }catch(PDOException $e){ echo 'Połączenie w czas sesji nie mogło zostać utw.<br />'.$e; } return; }/* */ }