koekjes probleem
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
Mijn array ziet er zo uit
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
(
[expires] => Mon, 09-Jun-2036 00:00:00 GMT
[path] => /
[samesite] => Lax
[httponly] => true
[secure] => false
)
[expires] => Mon, 09-Jun-2036 00:00:00 GMT
[path] => /
[samesite] => Lax
[httponly] => true
[secure] => false
)
Mijn opties worden zo gebouwd
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
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;
}
$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
Gewijzigd op 01/10/2022 15:55:40 door Jan R
Dus niet hoe een array doorgeven als een cookie.
ter info ik heb true/false geprobeer als string en als boolean
Gewijzigd op 01/10/2022 15:56:37 door Jan R
Bijvoorbeeld zo:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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');
}
?>
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.
Ik kreeg de melding dat MET UNIXstamp en ZONDER array het formaat niet juist was.
Code (php)
1
2
2
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
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.
"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
Code (php)
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?
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?
https://www.w3schools.com/tags/att_translate.asp
Ik werk veel met namen en deze worden vertaald wat niet mag natuurlijk
Ik werk veel met namen en deze worden vertaald wat niet mag natuurlijk
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 =]
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
$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>';
'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.
En doe je dit ook vaker?:
'secure' => false,
Het enige dat je doorgaans nodig hebt is een sessie ID, zodat de server al het andere kan bewaren.
Ik deed dat eerst via $_SESSION, met weer later een eigen implementatie van de SessionHandlerInterface, om er achter te komen dat er helemaal geen touw aan vast te knopen was welke functies nou wanneer precies werden aangeroepen door PHP. Toen ben ik afgestapt van $_SESSION, en heb ik zelf maar wat geschreven dat wel te volgen was.