Po wprowadzeniu zmiany zaproponowanej przez
Python_000 pojawił się inny problem:
Fatal error: Call to a member function setLogin() on a non-object in C:\wamp\www\sklep\sessions.php on line 56 <?php
class session{
private $id;
private $ip;
private $browser;
private $time;
private $user;
private $salt;
public function __construct(){
if(!isset($_COOKIE[SESSION_COOKIE
])){ $_COOKIE[SESSION_COOKIE] = ''; //sprawdzenie czy istnieje plik cookie. Jeśli nie ma, tworzone jest puste
}
else{
if(strlen($_COOKIE[SESSION_COOKIE
]) != SESSION_ID_LENGHT
){ $this->newSession(); //Jeśli istnieje cookie sprawdzana jest jego długość i pochodzenie
}
}
$stmt = $pdo->prepare('SELECT session_id, updated_at, salt_token, user_id, uniq_info, ip, browser FROM sessions WHERE session_id = :sid AND uniq_info = :info AND updated_at > :updated AND ip = :ip AND browser = :browser');
//pobieranie z bazy danych informacji o sesji np. id
$stmt->bindValue(':sid', $_COOKIE[SESSION_COOKIE], PDO::PARAM_STR);
$stmt->bindValue(':updated', time() - SESSION_COOKIE_EXPIRE
, PDO
::PARAM_INT); // porównanie czasu wygaśnięcia $stmt->bindValue(':info', $request->getInfo(), PDO::PARAM_STR); //porównanie wygenerowanego hash'a
$stmt->bindValue(':ip', $request->getIp(), PDO::PARAM_STR); //porównanie danych z request
$stmt->bindValue(':browser', $request->getBrowser(), PDO::PARAM_STR);
$stmt->execute();
if($session = $stmt -> fetch(PDO::FETCH_ASSOC)){ //sprawdzenie, czy sesja została odnaleziona w bazie
$stmt -> closeCursor();
$this->id = $_COOKIE[SESSION_COOKIE];
$this->salt = $session['salt_token']; //Jeśli sesja została odnaleziona przypisywane są parametry sesji PHP z bazy danych.
$this->ip = $session['ip'];
$this->browser = $session['browser'];
$this->time = $session['updated_at'];
setcookie(SESSION_COOKIE
, $this->id, time() + SESSION_COOKIE_EXPIRE
); //Aktualizowanie cookie w przypadku znalezienia istniejącego. Wstawiane jest id sesji i czas wygaśniecia.
$stmt = $pdo->prepare('UPDATE sessions SET updated_at = :time WHERE session_id = :sid');
$stmt->bindValue(':sid', $_COOKIE[SESSION_COOKIE], PDO::PARAM_STR);
$stmt->bindValue(':time', time(), PDO
::PARAM_INT); $stmt->execute();
if($session['user_id'] != 0){
// dla zalogowanego użytkownika
$stmt = $pdo->prepare("SELECT login FROM users WHERE id = :uid");
$stmt->bindValue(":uid", $session['user_id'], PDO::PARAM_INT);
$stmt->execute();
$row = $stmt->fetchAll(PDO::FETCH_ASSOC);
$this->user = new user; //zmiana 1
$user->setLogin($row[0]['login']);
}
else{
$this->user = new user(true);
}
}
else{ // Jeśli nie ma sesji w bazie, tworzona jest nowa.
$stmt->closeCursor();
$this->newSession();
}
}
function newSession(){ //funkcja tworzaca nową sesję
//tworzenie losowego identyfikatora sesji
$this->id = random_session_id();
$this->salt = random_salt(10);
setcookie(SESSION_COOKIE
, $this->id, time() + SESSION_COOKIE_EXPIRE
);
//Wstawianie informacji o sesji do bazy danych:
$stmt = $pdo->prepare('REPLACE INTO sessions (session_id, updated_at, salt_token, user_id, uniq_info, browser, ip)
VALUES (:session_id, :time, :salt, :user_id, :info, :browser, :ip)');
$stmt->bindValue(':session_id', $this->id, PDO::PARAM_STR);
$stmt->bindValue(':time', time(), PDO
::PARAM_INT); $stmt->bindValue(':salt', $this->salt, PDO::PARAM_STR);
$stmt->bindValue(':user_id', 0, PDO::PARAM_INT);
$stmt->bindValue(':info', $request->getInfo(), PDO::PARAM_STR);
$stmt->bindValue(':browser', $request->getBrowser(), PDO::PARAM_STR);
$stmt->bindValue(':ip', $request->getIp(), PDO::PARAM_STR);
$stmt->execute();
$this->user = new user(true);
}
function updateSession(user $user){
//TWORZENIE NOWEGO SESJI DLA UŻYTKOWNIKA ZALOGOWANEGO
$newId = random_session_id();
$newSalt = random_salt(10);
setcookie(SESSION_COOKIE
, $newId, time() + SESSION_COOKIE_EXPIRE
);
$stmt = $pdo->prepare("UPDATE sessions SET salt_token = :salt, updated_at = :time, session_id = :newId, user_id = :uid WHERE session_id = :sid");
//dla właściciela danej sesji użytkownika
$stmt->bindValue(':salt', $newSalt, PDO::PARAM_STR);
$stmt->bindValue(':time', time(), PDO
::PARAM_INT); $stmt->bindValue(':newId', $newId, PDO::PARAM_INT);
$stmt->bindValue(':uid', $user->getId(), PDO::PARAM_INT);
$stmt->bindValue('sid', $this->id, PDO::PARAM_STR);
$stmt->execute();
$this->id = $newId;
$this->user = $user;
}
public function getSessionId(){
return $this->id;
}
public function getUser(){
return $this->user;
}
}
?>
Funkcja
setLogin została stworzona w innym pliku:
<?php
class user{
private $id;
private $login;
private $construct;
public function __construct($anonymous = true){
if($anonymous == true) {
$this->id = 0;
$this->login = '';
}
$this->construct = true;
}
public function setLogin($login){
$this->login = $login;
}
public function getLogin(){
return $this->login;
}
public function getId(){
return $this->id;
}
public function setId($id){
$this->id = $id;
}
public function isAnonymus(){
return ($this->id == 0);
}
public static function checkPasswords
($login, $password){
$stmt = $pdo->prepare("SELECT id, login FROM users WHERE login=:login AND password=:password");
$stmt->bindValue(":login", $login, PDO::PARAM_STR);
$stmt->bindValue(":password", $password, PDO::PARAM_STR);
$stmt->execute();
if($row = $stmt->fetchAll(PDO::FETCH_ASSOC)){
//Jeżeli logowanie prawidłowe, zwracana jest wartość użytkownik
$newUser = new user;
$newUser->setId($row[0]['id']);
$newUser->login = $row[0]['login'];
return $newUser;
}
else{
return 0; //jeżeli logowanie nieprawidłowe, zwracana jest wartość 0
}
}
}
?>
Ten post edytował kris01 5.06.2015, 18:49:37