php: $ _COOKIE instellen en lezen werkt niet correct

Hallo ik heb een probleem met de code die ik hier heb gepost (het is een zeer beperkte versie, dus veel html-spullen zijn weggelaten voor de duidelijkheid). Het doel is: het controleert of de cookie aanwezig is en wordt gevuld. Als de globale vairable $ _POST leeg is, wordt gecontroleerd of de cookie aanwezig is of om een ​​of andere reden leeg is. In het geval de cookie niet bestaat of deze leeg is; het maakt er een. Toon vervolgens de inhoud vóór het HTML-formulier

Nadat op de inzending van het formulier is geklikt, roept de pagina zichzelf op en natuurlijk wordt de $ _POST ingevuld. Zo leest en toont de tweede helft van de code de inhoud van de cookie.

In de realiteit wanneer ik de pagina oproept, wordt de cookie gemaakt (ik heb dit met mijn browser gecontroleerd) maar de eerste meting wordt NIET getoond! als ik op verzenden klik, lees ik de inhoud van de cookie OF als ik de pagina ververs met F5, wordt deze weergegeven.

Maar niet wanneer ik de pagina de "Eerste" tijd laad.

Kun je me alsjeblieft helpen om te vinden waar ik de fout maak?

if (!$_POST) {
   //Create Cookie
    if (!isset($_COOKIE["ID"]) || ($_COOKIE["ID"] != true)){
     $order_id = time();
         $lifetime = 600;
     setcookie("ID",$order_id,time()+$lifetime);
    }//End IF "create cookie"
     ...
     ...
     ...
     $order_id = $_COOKIE["ID"];
     echo $pag = <<< FORM
         $order_id
     <form action="page.php" method="post">
     ...
     ...
     <input type="submit">
     </form>
FORM;
} elseif  ($_POST) {
   //Read Cookie for Contract
    echo $order_id = $_COOKIE["ID"];
    echo $order_id_date = date('l jS \of F Y');
     ...
     ...
     ...
     setcookie("ID","",-50000);
}//End IF ELSEIF
1
Cookies worden pas ingesteld als een pagina is geladen. Daarom, hoewel je setookie() hebt genoemd, is $ _ COOKIE ['ID'] nog niet beschikbaar voor gebruik zoals je hebt ontdekt, totdat je opnieuw laadt.
toegevoegd de auteur Michael Berkowski, de bron

3 antwoord

Cookies worden door de browser naar de server verzonden bij elk verzoek. Omdat u nog steeds in hetzelfde verzoek zit, is de cookie niet verzonden.

Dat is de reden waarom verder in hetzelfde bestand (in hetzelfde verzoek) dit niet werkt:

$order_id = $_COOKIE["ID"];//because the cookie hasn't been sent yet.

Het lijkt er ook op dat dat niet nodig is omdat de variabele $ order_id al de opdracht-id bevat.

0
toegevoegd
Ik heb geprobeerd om de $ order_id te "nietig" maken zonder een betere situatie te krijgen. Maar de $ order_id is normaal leeg, ik bedoel als ik de pagina terughaal, deze moet leeg zijn en de cookie moet worden verzonden. Heb ik het verkeerd?
toegevoegd de auteur user1478024, de bron

Het zou beter zijn als je het zo instelt.

$order_id = time();
if(isset($_COOKIE['ID']) && !empty($_COOKIE['ID'])) {
  $order_id = $_COOKIE['ID'];
} else {
  $lifetime = 600;
  setcookie('ID', $order_id, time() + $lifetime);
}

Daarom stelt u altijd uw bestel-ID in en vervangt deze dan door de cookie-ID als deze aanwezig is.

0
toegevoegd
Ik heb je suggestie geprobeerd, maar ik kreeg hetzelfde probleem. ik weet echt niet hoe ik de browser moet dwingen de cookie te verzenden. De eerste keer dat ik de pagina oproept OF ik noem die nadat de tweede pagina is gebeld (dit betekent dat de cookie is verwijderd), is de nieuwe cookie wel aanwezig maar niet getoond. Zoals eerder. Ik heb echt geen idee waarom
toegevoegd de auteur user1478024, de bron

Ik heb een oplossing gevonden. Het is een ommekeer. in plaats van de cookie zoals degene die ik heb gemaakt, heb ik de sessie gebruikt. het werkt Ik wil hier de code vermelden:

session_start();
if (!$_POST) {
   if ((!isset($_SESSION['order_id'])) or $_SESSION['order_id'] != true ){
    $order_id_time = time();//Assign variables
    $_SESSION['order_id'] = $order_id_time;
    }
$order_id_date = date('l jS \of F Y');
$order_id = $_SESSION['order_id'];
     ...
     ...
     ...
     echo $pag = <<< FORM
     $order_id
     <form action="page.php" method="post">
     ...
     ...
     <input type="submit">
     </form>
FORM;
} elseif  ($_POST) {
   //Read Cookie for Contract
echo $cook = "Order ID: ".$_SESSION["order_id"]."

"; ... ... ... session_destroy(); }//End IF ELSEIF
0
toegevoegd