Hoi

Ik probeer mijn cookies om te zetten naar array opties.
De cookies worden wel gezet maar zonder datum. Het zijn dus sessie cookies :(

Ik zet mijn cookies met
$a = koekjesopties(5000);
setcookie('msg', 1, $a);


Mijn array ziet er zo uit
(
    [expires] => Mon, 09-Jun-2036 00:00:00 GMT
    [path] => /
    [samesite] => Lax
    [httponly] => true
    [secure] => false
)
Ook geprobeerd zonder streepjes in de datum.

Mijn opties worden zo gebouwd

    function koekjesopties($dagen) {
        $a = array(
            'expires'=>CookieEndTime($dagen),
            'path'=>'/',
            'samesite' => 'Lax'
        );
                            
        if(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']=='on') {
            $a['httponly']='true';
            $a['secure']='false'; 
        }
        return $a;
    }


Wat doe ik weer verkeerd?

Jan
Bedankt maar het gaat hier over parameter 3 expires_or_options van commando setcookie.
Dus niet hoe een array doorgeven als een cookie.

ter info ik heb true/false geprobeer als string en als boolean
Het leuke van PHP is, dat je veel van wat het voor je doet, ook gewoon kunt negeren.
Bijvoorbeeld zo:

<?php
function zet_koekje(string $naam, string $inhoud, int $levensduur) {
  header('Set-Cookie: '
    . urlencode($naam) . '=' . urlencode($inhoud)
    . '; Max-Age=' . ((string) abs($levensduur))
//      . '; Domain=' // optioneel, default is huidige domein
    . '; Path=/'
    . ((isset($_SERVER['HTTPS']) and $_SERVER['HTTPS'] !== 'off')
        ? '; Secure'
        : ''
      )
    . '; HttpOnly'
    . '; SameSite=Strict');
}
?>


Maar als ik even in ga op je vraag, dan zegt de handleiding van setcookie() het volgende:

options

An associative array which may have any of the keys expires, path, domain, secure, httponly and samesite. If any other key is present an error of level E_WARNING is generated. The values have the same meaning as described for the parameters with the same name.


Ofwel, de waarde van 'expires' moet hetzelfde zijn als die van de parameter $expires van de setcookie() -functie. Dan gaat de handleiding verder:

expires_or_options

The time the cookie expires. This is a Unix timestamp so is in number of seconds since the epoch.


En dat doe je niet. Je geeft een string met een datum in plaats van een UNIX-timestamp.
Laat nu net deze unix timestamp de reden zijn dat ik overstap naar arrayopties. :)

Ik kreeg de melding dat MET UNIXstamp en ZONDER array het formaat niet juist was.

A 'set-cookie' has an invalid 'expires' date format. The recommended format is: Sun, 08 Jun 2036 22:00:00 GMT
Set-Cookie: msg13=1; expires=Sun, 08-Jun-2036 22:00:00 GMT; Max-Age=431964084; path=/schaak; HttpOnly; SameSite=Lax


Bedankt. Alle meldingen weg en cookies met datum.
Het zou toch echt een UNIX-timestamp moeten zijn volgens de documentatie (maar de documentatie zit er vaker naast):

"You may notice the expires_or_options parameter takes on a Unix timestamp, as opposed to the date format Wdy, DD-Mon-YYYY HH:MM:SS GMT, this is because PHP does this conversion internally."

Dus PHP zou iets voor je doen, maar in de waarschuwing krijg je een verkeerde suggestie? Waar heb ik dat vaker gezien met PHP...

Ik krijg overigens geen enkele error op 3v4l.org
<?php
$opties = [
    "expires" => "Mon, 09-Jun-2036 00:00:00 GMT",
    "path" => "/",
    "samesite" => "Lax",
    "httponly" => true,
    "secure" => false
];
setcookie("x", "y", $opties);
setcookie("x", "y", 5000);
?>


Tenzij alles nu transparant werkt zoals verwacht, zou ik gewoon (een) eigen functie(s) gebruiken, dan weet je tenminste eindelijk een keer waar je aan toe bent. Zoiets eenvoudigs als het schrijven van een cookie HTTP header, dat zou PHP toch simpel moeten kunnen maken?
Zoals ik schreef. Alle meldingen weg en cookies met datum.

Mijn enige opmerkingen zijn nu van firefox die geen translate ondersteunt :(. Gewoon melding uitgeschakeld daar kan ik toch niets tegen doen. :) en externe plugins. Vandaar mijn andere vraag/topic.

Ik probeer om altijd zoveel mogelijk de meldingen in Edge/Chrome weg te werken waar mogelijk en een controle te doen van w3.org voor de html en css

Ik ben ook bezig met headers en dmarc setting 100% in orde te krijgen.

Jan
Wat bedoel je met translate?
Het HTML5 tranlate attribuut werkt nog niet op Firefox, volgens Mozilla:
https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/translate
Daar hoef je dan in ieder geval niet verder naar te kijken.

Je hebt altijd nog de HTTP Accept Language header:
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Language
Dan kan een webserver altijd zelf nog besluiten of die vertaalde content levert.
Daar heb je zelf ook weer meer controle op. Kan je besluiten om alle Friezen te weren, of juist alle niet-Friezen, in voorbereiding op de Frexit =]
Wat ik regelmatig doe:


$array = [
    'expires'  => 'Mon, 09-Jun-2036 00:00:00 GMT',
    'path'     => '/',
    'samesite' => 'Lax',
    'httponly' => true,
    'secure'   => false,
];

echo '<pre>';
echo json_encode($array);
echo '</pre>';


Met andere woorden: het object of de array die je in een cookie wilt bewaren, json_encoden tot een string en die in het cookie zetten. Bij het uitlezen gebruik je dan json_decode.

Reageren