Wylogowuje po odświeżeniu w pasku adresu

0

Cześć, mam problem chyba z sesją, logowanie działa, gdy odświeżam f5 lub przyciskiem w przeglądarce to pozostaję zalogowany, ale gdy w pasku adresu odświeżę to muszę się logować jeszcze raz.

 <?php
                     
                    include_once 'klasy/Baza.php';
                    include_once 'klasy/User.php';
                    include_once 'klasy/UserManager.php';
                    $db = new Baza("localhost", "root", "", "kulinarnie");
                    $um = new UserManager();
                    //parametr z GET – akcja = wyloguj
                    if (filter_input(INPUT_GET, "akcja")=="wyloguj") {
                    $um->logout($db);
                    }
                    //kliknięto przycisk submit z name = zaloguj
                    if (filter_input(INPUT_POST, "zaloguj")) {
                        $userId=$um->login($db); //sprawdź parametry logowania
                        if ($userId > 0) {
                            echo "<p>Poprawne logowanie.<br />";
                            echo "Zalogowany użytkownik o id=$userId <br />";
                            //pokaż link wyloguj
                            //lub przekieruj użytkownika na inną stronę dla zalogowanych
                            echo "<a href='index.php?akcja=wyloguj' >Wyloguj</a> </p>";
                        } 
                        else if($userId==0){
                            echo "<p>Błędna nazwa użytkownika lub hasło</p>";
                            $um->loginForm(); //Pokaż formularz logowania
                        }
                        else { 
                            echo "<p>Brak takiego użytkownika</p>";
                            $um->loginForm(); //Pokaż formularz logowania
                        }

                    } 
                    else {
                    //pierwsze uruchomienie skryptu processLogin
                    $um->loginForm();
                    }
                    ?>
0

class UserManager {
 function loginForm() {
    ?>
    <form action="index.php" method="post">
                        <table>
                            
                            <tr>
                                <td><label for="login">login:</label></td>
                                <td><input type="text" name="login" id="login"></td>
                                <td><label for="passwdInput">hasło:</label></td>
                                <td><input type="password" name="passwd" id="passwdInput"/></td>
                                
                                <td><input type="submit" value="Zaloguj" name="zaloguj" /></td>
                            </tr>
                        </table>
                    </form>
    <?php
 }
 function login($db) {
    //funkcja sprawdza poprawność logowania
    //wynik - id użytkownika zalogowanego lub -1
    $args = [
    'login' => FILTER_SANITIZE_MAGIC_QUOTES,
    'passwd' => FILTER_SANITIZE_MAGIC_QUOTES
    ];
    //przefiltruj dane z GET (lub z POST) zgodnie z ustawionymi w $args filtrami:
    $dane = filter_input_array(INPUT_POST, $args);
    //sprawdź czy użytkownik o loginie istnieje w tabeli users
    //i czy podane hasło jest poprawne
    $login = $dane["login"];
    $passwd = $dane["passwd"];
    $userId = $db->selectUser($login, $passwd, "users");
    echo $userId;
    if ($userId >= 0) { //Poprawne dane
        
        session_start();
        
        $date = new DateTime();	
	$current_date = $date->format('Y-m-d H:i:s');
        
        $sqlDelete="delete from logged_in_users where userId=$userId";
        $db->delete($sqlDelete);
        $sqlInsert="insert into logged_in_users values('session_id()','$userId','$current_date')";
        $db->insert($sqlInsert);
        
        
    //rozpocznij sesję zalogowanego użytkownika
    //usuń wszystkie wpisy historyczne dla użytkownika o $userId
    //ustaw datę - format("Y-m-d H:i:s");
    //pobierz id sesji i dodaj wpis do tabeli logged_in_users
    }
    return $userId;
  }
  
  
 function logout($db) {
    //pobierz id bieżącej sesji (pamiętaj o session_start()
    //usuń sesję (łącznie z ciasteczkiem sesyjnym)
    //usuń wpis z id bieżącej sesji z tabeli logged_in_users
     
    session_start();
    $sessionId=session_id();
    $_SESSION=array();
    if (filter_input( INPUT_COOKIE,session_name() )) {
        setcookie(session_name(), '', time() - 42000, '/');
    }
    session_destroy();
    
    $sqlDelete="delete from logged_in_users where sessionId=$sessionId";
    $db->delete($sqlDelete);
 }
 
 
 function getLoggedInUser($db, $sessionId) { 
 //wynik $userId - znaleziono wpis z id sesji w tabeli logged_in_users
 //wynik -1 - nie ma wpisu dla tego id sesji w tabeli logged_in_users
     
     $sqlExist="select count(*) from logged_in_users where session_id=$sessionId";
    		
		if(($db->exist($sqlExist))>0)
		{
			return 1; 
		}
		
		return -1;
     
 }
}
class baza {
    private $mysqli;//uchwyt do BD
    function __construct($serwer,$user,$pass,$baza) {
        $this->mysqli = new mysqli($serwer,$user,$pass,$baza);
        /*sprawdź połączenie*/
        if($this->mysqli->connect_errno){
            printf("Nie udało się połączenie z serwerem:%s\n,",
                    $this->mysqli->connect_error); exit();
                    
        }
        /*zmień kodowanie na utf8 */
        if($this->mysqli->set_charset("utf8")){
            //udało się zmienić kodowanie
        }
    }//koniec funkcji konstruktora
function __destruct() {
 $this->mysqli->close();
 }
 public function select($sql, $pola) {
    //parametr $sql – łańcuch zapytania select
    //parametr $pola - tablica z nazwami pol w bazie
   //Wynik funkcji – kod HTML tabeli z rekordami (String)
     
    $tresc = "";
    if ($result = $this->mysqli->query($sql)) {
       $ilepol = count($pola); //ile pól
       $ile = $result->num_rows; //ile wierszy
       // pętla po wyniku zapytania $results
       $tresc.="<table><tbody>";
       while ($row = $result->fetch_object()) {
       $tresc.="<tr>";
       for ($i = 0; $i < $ilepol; $i++) {
       $p = $pola[$i];
      $tresc.="<td>" . $row->$p . "</td>";
       }
       $tresc.="</tr>";
       }
       $tresc.="</table></tbody>";
       $result->close(); /* zwolnij pamięć */
    }
 return $tresc;
 }
 
 public function insert($sql) {
     // pobrać dane z formularza i utworzyć zapytanie 
                if ($this->mysqli->query($sql)) {
                    return true;
                } else
                    return false;
    }
 
 public function delete($sql) {
  if ($this->mysqli->query($sql)) {
                    return true;
                } else
                    return false;
 }
 public function exist($sql) {
  if ($this->mysqli->query($sql)) {
                    return true;
                } else
                    return false;
 }
 
public function selectUser($login, $passwd, $tabela) {
 //parametry $login, $passwd , $tabela – nazwa tabeli z użytkownikami
 //wynik – id użytkownika lub -1 jeśli dane logowania nie są poprawne
 $id = -1;//gdy brak takiego uzytkownika
 $sql = "SELECT * FROM $tabela WHERE userName='$login'";
 if ($result = $this->mysqli->query($sql)) {
     
    $ile = $result->num_rows;
    
    if ($ile == 1) {
        $row = $result->fetch_object(); //pobierz rekord z użytkownikiem
        $hash = $row->passwd; //pobierz zahaszowane hasło użytkownika
        //sprawdź czy pobrane hasło pasuje do tego z tabeli bazy danych:
        if (password_verify($passwd, $hash))
            $id = $row->id; //jeśli hasła się zgadzają - pobierz id użytkownika
        else{
            $id=0;//jeśli jest użytkownik ale błędne hasło
        }
    }
 }
 return $id; //id zalogowanego użytkownika(>0) lub -1
}
 
} //koniec klasy Baza
?>

0

Masz trochę (o ile nie nazwać tego sporo) do zmiany w tym swoim skrypcie. Nie wiem w jaki sposób Ci się to loguje bo w funkcji login masz:

echo $userId;
    if ($userId >= 0) { //Poprawne dane
 
        session_start();

Pierwszy błąd, przed rozpoczęciem sesji. Po co robisz echo tego $userId?

0

Część kodu jest z zajęć ze studiów z php a część trzeba było samemu uzupełnić, echo tylko chciałem sprawdzić czy działa mi jakaś funkcja, oczywiście jest tu nie potrzebne. Usunąłem cały kod, zrobiłem trochę inaczej i działa. Błędy to wynik kopiuj wklej i nie sprawdzenia tego co pisałem np. brak apostrofów w zapytaniu sql.

1 użytkowników online, w tym zalogowanych: 0, gości: 1