Michał Łukasik

Michał Łukasik Tworze projekty
banerów (animowanych
i statycznych),
ulot...

Temat: Problem z zalogowaniem do prostego panelu admina (błąd z...

Witam,
to mój pierwszy post na tym forum i liczę, że żadnej chłosty nie dostanę za niego. Jestem początkujący w pisaniu w PHP. Próbuję napisać prosty sklep internetowy, do tego jakiś panel administratora. Wszystko niby już zrobiłem lecz problem pojawia się gdy chcę zalogować się do owego panelu. :cry: :cry: Problem polega na tym, że nie mogę znaleźć błędu odpowiedzialnego za to, że gdy klikam zaloguj i podaje prawidłowe pasy to tworzona jest nowa sesja lecz tak jakby cały czas używam starej, a powinno aktualizować ją (Sprawdzałem to w bazie danych).
Problem nie występuje, gdy wchodzę na stronę z telefonu, z niego logowanie przechodzi normalnie.
Proszę o pomoc w rozwiązaniu tego błędu. Link do strony.

Po kliknięciu w link Panel administratora wykonuje się kod:

<?php
require('header.php');
?>

<?php
if($session->getUser()->isAnonym()){
require('login.php');
}
else{
if($session->getUser()->isAdmin()){
echo "Witaj, adminie";
echo "<br><br>";
echo "<a href='addProduct.php'>Dodaj produkt</a><br>";
}
}

?>

<?php
require('footer.php');
?>

sprawdza on czy użytkownika jest Anonimowy czyli jego id=0, jesli tak przechodzimy do kodu:

<?php
require('header.php');
?>

<form action='doLog.php' method='post'>
Login: <input type='text' name='login'><br>
Hasło: <input type='password' name='password'><br>
<input type='submit' value='Zaloguj'>

<?php
require('footer.php');
?>

jest to formularz, w kórym wpisujemy nasz pasy i po kliknięciu na zaloguj wykonuje się to:

<?php
require('header.php');

if ($session -> getUser() ->isAnonym()){
$result = user::checkPass($_POST['login'], $_POST['password']);

if($result instanceof user){
//zalogowany
$session->updateSession($result);
}
else{
header('Location: nimda.php');
}
}

require('footer.php');
?>

jeśli użytkownik jest anonimowy wykonuje się funkcja, która sprawdza czy login i hasło podane są prawidłowe


public function checkPass($login, $password){
global $pdo;

$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)){
$newUser = new user;
$newUser->setId($row[0]['id']);
$newUser->setLogin($row[0]['login']);

return $newUser;
}
else{
return 0;
}
}

Kod odpowiedzialny za to, następnie jeśli tak to powinno updatować sesję użytkownika, a tak się nie dzieje :cry: :cry:
Kod z pliku session.php

<?php

class session{

private $id;
private $ip;
private $browser;
private $time;
private $user;
private $salt;

public function __construct(){
global $pdo, $request;

if(!isset($_COOKIE[SESSION_COOKIE])){
$_COOKIE[SESSION_COOKIE] = '';
}
else{
if(strlen($_COOKIE[SESSION_COOKIE]) != SESSION_ID_LENGHT){
$this->newSession();
}
}

$stmt = $pdo->prepare('Select session_id, updated_at, salt_token, user_id, uniq_info, ip, browser
From session Where session_id = :sid and uniq_info = :info and updated_at > :updated and ip = :ip and browser = :browser ');

$stmt->bindValue(':sid', $_COOKIE[SESSION_COOKIE], PDO::PARAM_STR);
$stmt->bindValue(':updated', time() - SESSION_COOKIE_EXPIRED, PDO::PARAM_INT);
$stmt->bindValue(':info', $request->getInfo(), PDO::PARAM_STR);
$stmt->bindValue(':ip', $request->getIp(), PDO::PARAM_STR);
$stmt->bindValue(':browser', $request->getBrowser(), PDO::PARAM_STR);
$stmt->execute();

if($session = $stmt -> fetch(PDO::FETCH_ASSOC)){
$stmt -> closeCursor();
$this->id = $_COOKIE[SESSION_COOKIE];
$this->salt = $session['salt_token'];
$this->ip = $session['ip'];
$this->browser = $session['browser'];
$this->time = $session['updated_at'];

setcookie(SESSION_COOKIE, $this->id, time() + SESSION_COOKIE_EXPIRED);

$stmt = $pdo->prepare('Update session 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){
$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;
$this->user->setLogin($row[0]['login']);
$this->user->setId($session['user_id']);
}
else{
$this->user = new user(true);
}
}
else{
$stmt->closeCursor();
$this->newSession();
}
}

function newSession(){
global $pdo, $request;

$this->id = random_session_id();
$this->salt = random_salt(10);
setcookie(SESSION_COOKIE, $this->id,time() + SESSION_COOKIE_EXPIRED);


$stmt = $pdo->prepare('INSERT INTO session (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){
global $pdo, $request;

$newId = random_session_id();
$newSalt = random_salt(10);
setcookie(SESSION_COOKIE, $newId, time() + SESSION_COOKIE_EXPIRE);

$stmt = $pdo->prepare("Update session Set salt_token = :salt, updated_at = :time, session_id = :newId, user_id = :uid Where session_id = :sid");
$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;
}
}
?>


Mam nadzieję, że opisałem wszystko wystarczająco. Proszę Was o pomoc.
Pozdrawiam.