Problem z sesją - w jednym skrypcie istnieje w drugim nie

0

Jeżeli ktoś mi wyjaśni dlaczego tak się dzieje, dostanie Nobla.

Dwa skrypty i dwa fetche:

fetch_cars_data.php

<?php
    session_start();

    include "db_conn.php";

    header("Access-Control-Allow-Origin: {$_SESSION['request_origin']}");
    //header("Access-Control-Allow-Origin: http://localhost:3000");
    header("Access-Control-Allow-Credentials: true");

    $stmt = $pdo->query("SELECT * FROM cars");
    $cars_data = $stmt->fetchAll(PDO::FETCH_ASSOC);

    echo(json_encode($cars_data));
?>

delete_rental.php

<?php
    session_start();
    
    include "db_conn.php";

    header("Access-Control-Allow-Origin: {$_SESSION['request_origin']}");
    //header("Access-Control-Allow-Origin: http://localhost:3000");
    header("Access-Control-Allow-Credentials: true");
    header("Access-Control-Allow-Headers: Content-Type, Accept");

    $rental_id = json_decode(file_get_contents("php://input"), true)["rentalId"];

    $stmt = $pdo->prepare("DELETE FROM scheduled_rentals WHERE rental_id = :rental_id");
    $stmt->execute(["rental_id" => $rental_id]);

    if($stmt->rowCount() === 1)
        echo(json_encode(["deleted" => true]));
    else
        echo(json_encode(["deleted" => false]));
?>

Fetche:

fetch(`${API_URL}fetch_cars_data.php`, {
        method: "GET",
        credentials: "include"
      })
      .then((response) => response.json())
      .then((data) => setCardModels(data));
  };
fetch(`${API_URL}delete_rental.php`, {
      method: "POST",
      credentials: "include",
      headers: {
        "Content-Type": "application/json"
      },
      body: JSON.stringify({ rentalId: id })
    });

Pierwszy fetch działa, sesja jest wykrywana i gitara - fetch do każdego innego skryptu również działa.
Drugi fetch nie działa, zmienna $_SESSION jest pusta.

Ktoś potrafi to wyjaśnić?

3

Jesteś pewien, że ta konstrukcja działa i nie rzuca błędem?


    $rental_id = json_decode(file_get_contents("php://input"), true)["rentalId"];

Rozbij to na jakieś mniejsze partie i sprawdzaj np. isset czy masz klucz, wcześniej czy JSON i input nie są puste przez empty.
W logach nic nie masz?

No i ostatnia uwaga, skoro ta część kodu ma usuwać pojedynczy rekord to wypadałoby użyć metody DELETE a nie POST.

0

@jurek1980: Jestem pewien że działa, żadnych błędów w konsoli nie dostaję.
Jak to wpływa na działanie kodu, jeżeli zamiast DELETE używam POST'a?

Rozbij to na jakieś mniejsze partie i sprawdzaj np. isset czy masz klucz, wcześniej czy JSON i input nie są puste przez empty.

Leciałem przez ten kod z debuggerem, cały czas $_SESSION jest puste.

1

Na kod to nie wpływa. Możesz przecież nawet i GETem przesyłać to id. Po prostu są określe metody w HTTP.
Z grubsza to co napisałeś nie powinno powodować problemu z sesją według mnie. Dlatego skupilbym się na jakiś innych błędach.
Spróbuj napisać to bardziej po ludzku i zwracaj jakieś komunikaty typu:

  • input os empty
  • JSON decode error
  • wrong id in data

Czy jak tam chcesz zrobić. Bo tak jak to napisałeś to może dziać się po drodze wssystko.

0

@jurek1980: Napiszę, ale to nie wpływa przecież na to, że zmienna $_SESSION jest pusta.
Po pierwszej linijce w debuggerze powinna już mieć ustawione 2 klucze.

2

Może jeszcze popatrz na ustawienia php.ini
Albo daj na początku skryptów

ini_set('session.cookie_httponly', 0);
ini_set('session.use_only_cookies', 0);
ini_set('session.cookie_secure', 0);

Lub pokobinuj z ustawieniami tych parametrów.

0

@jurek1980: Czy ta pusta sesja może mieć związek z tym, że request do skryptu delete_rental.php nie jest "simple request", tylko najpierw leci preflight?
Może to coś ma do rzeczy i jakieś headery trzeba poustawiać albo co?

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