Zmienna globalna $_SESSION nie jest współdzielona

0

Klepię sobie jakiś prosty system logowania do projektu zaliczeniowego.
Rozwiązałem to tak, że wysyłam po prostu 'POSTEM' dane z formularza reactowego do skryptu php, który - jeżeli użytkownik istnieje w bazie i zgadza się hasło - ustawia $_SESSION['username'] na podany przez użytkownika username.

W drugim skrypcie, chcę wyświetlić dane informacje specyficzne dla tego zalogowanego użytkownika, więc chcę uzyskać w nim dostęp do $_SESSION['username'] z tym, że w tym skrypcie ta zmienna jest już pusta. Nie wiem o co biega.

Logowanie:

<?php
    session_start();

    include "db_conn.php";  

    header("Access-Control-Allow-Origin: *");

    if($_SERVER['REQUEST_METHOD'] === 'POST')
    {
        $response = array('loggedIn' => false, 'message' => '');

        if($conn)
        {
            $username = $_POST['username'];
            $password = $_POST['password'];

            $query = "SELECT * FROM users WHERE username='${username}' AND password='${password}'";
            $result = pg_query($conn, $query);

            if(pg_num_rows($result) === 1)
            {
                $user = pg_fetch_assoc($result);

                $_SESSION['username'] = $user['username'];
                $_SESSION['user_id'] = $user['user_id'];

                $response['loggedIn'] = true;
                $response['message'] = 'Logged in';
            }
            else
                $response['message'] = 'Username or password is incorrect';
        }
        else
            $response['message'] = 'Cannot connect to database';
        
        echo(json_encode($response));
    }   
?>

Ten drugi skrypt:


<?php
    session_start();

    include "db_conn.php";

    header("Access-Control-Allow-Origin: *");

    $query = "SELECT * FROM available_cars WHERE username='${$_SESSION['username']}'";
    $results = pg_query($conn, $query);
    $cars_data = pg_fetch_all($results);
?>

2

Jesteś pewien, że sesja jest pusta?
W zapytaniu w drugim skrypcie chyba źle bindujesz zmienną.

1

Po pierwsze to używaj PDO i PreparedStatements: https://www.php.net/manual/en/book.pdo.php

Po drugie tak jak wyżej pisał jurek - prawdopodobnie zmienna sesyjna nie jest pusta, tylko masz źle napisany tekst SQL.

$stmt = $PDO->prepare("SELECT * FROM available_cars WHERE username= :username");
$stmt->execute(['username' => $_SESSION['username']]);
while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {

... kod który coś robi z danymi...

}

gdzie $PDO to obiekt PDO podłączony do Twojej bazy danych:

https://www.php.net/manual/en/pdo.construct.php

0

Jest pusta, jak w tym drugim skrypcie wywołuję 'var_dump($_SESSION);' to na ekranie wypluwa mi: array(0) { }

Po pierwsze to używaj PDO

Ok, zmieniłem

0

Może jednak to logowanie Ci nie działa?
Jak to testujesz?
Pokaż poprawiony kod.
Najprostszy przykład Ci działa?

<?php
session_start();
$_SESSION['username'] = 'abcd';
var_dump($_SESSION);

Drugi plik sprawdzający sesję

<?php
session_start();
var_dump($_SESSION);

A i nie powinno się używać tagu kończącego ?> jeśli w pliku nie masz nic poza PHP.

0

co to za linijka jest ?

$query = "SELECT * FROM available_cars WHERE username='${$_SESSION['username']}'";

jesli w session username masz np Michal to znaczy ze ma wyszukac zmienna $Michal

username='$Michal'

? co ty tam kombinujesz ?

0

@jurek1980:

jurek1980 napisał(a):

Może jednak to logowanie Ci nie działa?

Jak to testujesz?
Pokaż poprawiony kod.
Najprostszy przykład Ci działa?

<?php
session_start();
$_SESSION['username'] = 'abcd';
var_dump($_SESSION);

Drugi plik sprawdzający sesję

<?php
session_start();
var_dump($_SESSION);

A i nie powinno się używać tagu kończącego ?> jeśli w pliku nie masz nic poza PHP.

Sprawa wygląda tak, że kiedy używam w obu przypadkach żądania "GET" wszystko ładnie działa, jednakże kiedy przy logowaniu używam żądania "POST" i ustawiam nową wartość dla $_SESSION['username'] to w skrypcie logowania poprzednia wartość się nadpisuje, ale w drugim skrypcie nic się nie zmienia, wartość zostaje nadal 'abcd'.

<?php
    session_start();

    include "db_conn.php";  

    header("Access-Control-Allow-Origin: *");

    if($_SERVER['REQUEST_METHOD'] === 'POST')
    {
        $response = ['loggedIn' => false, 'message' => ''];

        if($pdo)
        {
            $username = $_POST['username'];
            $password = $_POST['password'];

            $stmt = $pdo->prepare("SELECT * FROM users WHERE username=:username AND password=:password");
            $stmt->execute(['username' => $username, 'password' => $password]);

            if($stmt->rowCount() === 1)
            {
                $user = $stmt->fetch(PDO::FETCH_ASSOC);

                $_SESSION['username'] = $user['username'];

                $response['loggedIn'] = true;
                $response['message'] = 'Logged in';
            }
            else
            {
                $response['message'] = 'Username or password is incorrect';
            }
                
        }
        else
        {
            $response['message'] = 'Cannot connect to database';
        }           
        
        echo(json_encode($response));
    }   
?>
0

Metoda przesłania nic nie ma do sesji.
Zrób tak:

if($_SERVER['REQUEST_METHOD'] === 'POST'){
// To co tam masz
}
else {
 echo "Te dane nie są przesłane postem!";
}

I sprawdź czy w ogóle wchodzi Ci w ten warunek.

0

@jurek1980: Warunek działa.
Jedną rzecz dziwną zauważyłem.
Kiedy jestem na stronie z reactowym formularzem, to przy każdym poście do skryptu logowania zmienia się id sesji w "ciasteczku", a kiedy wywołuję ten skrypt "GETem" to sesja ma ciągle takie samo id.
Nie wiem, może jakiś głupi błąd gdzieś popełniam, z php mam do czynienia parę godzin xd

req.png

1

To raczej ustawienia gdzieś od strony reacta w takim razie.
Od strony PHP wygląda dobrze.
https://stackoverflow.com/questions/54874686/php-session-in-api-changes-when-called-by-axios-in-react

1

@jurek1980: Działa, dzięki :)

Wystarczyło dodać do obiektu w fetchu:

credentials: "include"

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