Door
Jordi timmerman
op 22-03-2018 19:32
gewijzigd op 22-03-2018 19:50
2.177 views
Goedeavond,
ik ben bezig met een PHP script.
waarbij een gebruiker in een input field zijn naam kan invullen.
door op een button te clicken wordt de naam opgeslagen in een COOKIE.
als deze COOKIE als bestaad.
dan krijg je als output: echo "Welcome terug ".$_COOKIE['name'];
bestaad de COOKIE nog niet dan word er een COOKIE aangemaakt.
en dan krijg je de volgende outut: echo "Hallo ".$_COOKIE['name']; echo " Dit is je eerste keer op deze website.";
maar ik krijg wat ik ook intyp altijd als output: echo "Welcome terug ".$_COOKIE['name'];
ook al bestaad deze COOKIE nog niet.
<?php
if(!empty($_POST))
{
header("Location:form_data.php");
setcookie('name',$_POST['name'], time() + (86400 * 30));
}
if(isset($_COOKIE['name']))
{
echo "Welcome terug ".$_COOKIE['name'];
}else
{
echo "Hallo ".$_COOKIE['name']; echo " Dit is je eerste keer op deze website.";
setcookie('name',$_POST['name'], time() + (86400 * 30));
}
Verder bestaat de cookie pas na een refresh, en niet direct.
Na een setcookie() zal $_COOKIE nooit direct je waarde kunnen hebben.
Met sessies kan dit overigens wel.
Verder heb ik een tipje: Het is niet nodig om elke regel te echo'en. Je kan prima gewoon in je HTML je PHP-tags openen en sluiten, of het geheel tussen single-quotes plaatsen. Het scheelt dan tevens de escaping met de slashes.
Je stelt ook geen pad in bij het instellen van je cookie (vierde parameter van setcookie() <-- lees de documentatie). Als je dus naar een andere directory navigeert op dezelfde website is dat cookie dan ook niet geldig.
Ook is het een misvatting dat een header('Location: ...') je meteen transporteert naar een andere pagina. Dit gebeurt pas nadat het hele script is afgedraaid. Meestal is het de bedoeling dat er direct wordt geredirect, daartoe is het dan ook gebruikelijk om direct een exit; achter header('Location: ...') te zetten. Maar in jouw code is om te beginnen de volgorde dus al verkeerd (of op zijn minst raar): éérst set je een cookie, en dan redirect je pas, en niet andersom.
En dan is het onlogisch dat je ergens midden in het uitdraaien van je pagina nogmaals een cookie instelt, ook is het dan niet gegarandeerd dat $_POST bestaat... Het beste kun je het verwerken van het formulier in een aparte stap behandelen en daarna wordt je -zonder het genereren van wat voor output dan ook- doorgestuurd naar een andere pagina.
Is ie daarna ook meteen in de $_COOKIE bekend. Niet iedereen zal hiervan gecharmeerd zijn ("Gij zult geen SuperGlobals aanraken!"), maar daarna is de situatie wel zoals je verwacht.
Voor de volledigheid: dit zit allemaal in een "Helper class", dus die self::secure() is:
public static function secure(){
return array_key_exists('HTTPS',$_SERVER) && !strcasecmp($_SERVER['HTTPS'],'on');
}