PHP Cookie-Session
Inledning
Vi har tidigare sett hur vi kan skicka information mellan webbsidor genom att använda formulär och skicka med "POST" eller "GET". Nackdelen är att vi måste ha en "submit"-knapp synlig och vi måste klicka på den för att åtgärden ska utföras. Detta fungerar utmärkt i många fall, men ibland vill man att information ska föras över mellan webbsidor utan att användaren ska behöva klicka på en knapp. Detta går att göra med cookies och sessions. Cookies lagras lokalt på datorn och är oftast till för data som ska sparas en längre tid och är användbart för återkommande besök vid olika tidpunkter. Sessions lagrar informationen på servern och försvinner så fort webläsarfönstret stängs. Sessions är bra att använda för att spara info under ett och samma besök när användaren förflyttar sig mellan de olika sidorna i webbplatsen.
Delavsnitt
Cookie
Mycket praktiskt att kunna spara en del information lokalt på datorn istället för att t ex behöva skicka informationen mellan olika webbsidor. Ett praktiskt exempel är när du är inne i en webbshop och surfar runt, ibland spar du ner en produkt i din shoppingvagn (sparas i en cookie) och först när du bestämt dig för att betala så körs hela innehållet i shoppingvagnen mot databasen och nödvändiga databastransaktioner utförs. Värdena på cookisarna ändras då med hjälp av javascript.
Först så måste ju webbläsaren tillåta cookies, sen kan det finnas en begränsning på 300 totalt, en begränsning på inte fler än 20 st/server eller domän, där var och en av kakorna kan vara upp till 4 kB.
Varje gång webbläsaren anropar servern bifogas "kakorna". Kakorna sparas i en mapp. Varje domän får en egen mapp.
Varje kaka innehåller en viss mängd data, som namn, värde, giltighetstid och lite annat.
Vi initierar kakan:
setcookie("testcookie","value_one",time()+60, "/", "www.bestonline.se", 0);
där parametrarna är namn, värde, giltighetstid (här 60 sekunder), sökväg, domännamn, och sist om det krävs säker anslutning (här 0 = nej) .
Med "/"
menas att cookie'n är åtkomlig på hela domänen. Vill du begränsa till vissa mappar så ange dessa, t ex /foo/bar/ på domänen.
"www.bestonline.se" säger att cookie'n är tillgänglig för sidor på den domänen och dess subdomäner. Det går även att använda "false" (för xampp och även labbservern, använd inte "localhost").
Om tiden anges till 0 så försvinner kakan när webbläsaren stängs. Tiden kan ju enkelt ställas in med en egen variabel,
$mintid=strtotime("+1 week") så är den giltig en vecka.
OBS! Att setcookie( ) måste utföras INNAN första html-koden skickas från servern.
OBS också på att värdet kan inte vara tom textsträng ("") när vi skapar vår cookie.
Du hämtar ett värde hos en cookie med $_COOKIE['testcookie'] . Det ska dock påpekas att man kan inte hämta ut värdet vid laddningen av samma sida som satte cookisen.
kör t ex: cookie_test_1.php
<?php
setcookie("testcookie","Kalle Anka",time()+60, "/", "www.bestonline.se", 0);
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>cookie_test_1</title>
</head>
<body>
<?php
if (isset($_COOKIE['testcookie'])) {
echo "<p>Hej igen, cookievärdet är ".$_COOKIE['testcookie'].".</p>";
} else {
echo "<p>Hej! Första besöket! Uppdatera så får du se cookisen!</p>";
}
?>
</body>
</html>
och för att ta bort kakan
kör cookie_test_1_delete.php
<?php
setcookie("testcookie","",time()-60, "/", "www.bestonline.se", 0);
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>cookie_test_1_delete</title>
</head>
<body>
<?php
if (isset($_COOKIE['testcookie'])) {
echo "<p>Hej igen ".$_COOKIE['testcookie'].", cookievärdet är ändrat. Uppdatera så
får du se!</p>";
} else {
echo "<p>Hej ".$_COOKIE['testcookie']."! Första besöket! Cookiesen deletad :-)</p>";
}
?>
</body>
</html>
Här skulle man kunna sätta tiden till time(), men det är inte helt säkert alla gånger så därför rekommenderas att man sätter en tidpunkt som redan existerat.
OBS! Vi måste också tänka på att lagringskapaciteten är max 4kB, så vi kan inte spara några stora mängder information.
OBS! Det kan också vara så att webläsaren inte tillåter cookies, då måste vi lösa problemet på något annat sätt. Sessions, POST eller GET kan vara en lösning.
Lokalt i Laragon
Om vi kör Chrome fungerar "localhost" som domän och även false.
setcookie("testcookie","",time()-60, "/","localhost", 0);
setcookie("testcookie","",time()-60, "/",
false, 0);
Session
Sessioner använder vi till exempel för att sätta vissa värden till den den som loggat in på en webbsida. Sessions kan sägas vara den moderna versionen av cookies.
En session tilldelas ett unikt ID som lagras på webbservern.
Vi kan också sätta egna sessionsvariabler med värden. Sessionsvariabler sparas på servern och försvinner då webbläsaren stängs.
Sessions-variabler är superglobala, jämför POST och GET, dvs du kan nå värdena i koden hos alla session-aktiverade webbsidor.
OBS! Normalläget i servern är att sessions INTE startar automatiskt, dvs att sidorna är session-aktiverade.
Default inställning för varaktigheten på en session är 24 minuter(1440 s).
Varje session får ett unikt ID-nummer.
kör: session_test_1.php
<?php
session_start();
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>session_test_1</title>
</head>
<body>
<?php
echo "<p>Hej! <br />ID-värdet på denna session: ".session_id()."</p>";
?>
<a href="session_test_2.php" target="_blank">session_test_2.php</a>
</body>
</html>
Uppdatera sidan så ser du att värdet ligger kvar.
Kör denna sida efter att du kört session_test_1.php i samma webbläsare, då visar denna sida samma ID.
kör: session_test_2.php
<?php
session_start();
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>session_test_2</title>
</head>
<body>
<?php
echo "<p>Hej igen! <br />Detta är en ny sida. ID-värdet på denna
session: ".session_id()."</p>";
?>
</body>
</html>
Vi kan spara lite egna värden i sessionsvariabler. Dessa följer med till servern och sen tillbaks när sidan laddas in igen. Alla egna värden är knutna till den sessionsID som är förknippad med körningen i en webbäsare. Detta är ju bra för att slippa skicka med POST eller GET . T ex är det mycket praktiskt att lagra användarnamn om man använder ett login-system. Dessutom kan det ju vara bra att spara vissa användarspecifika inställningar, t ex ska vissa användare se vissa saker och andra ska inte.
Här ett exempel där vi spar i egna variabler.
kör: session_test_3.php
<?php
session_start();
// Tar bort hela sessionen och rensar allt
if (isset($_POST['destroy'])) {
// Unset all of the session variables.
$_SESSION = array();
// From http://php.net/manual/en/function.session-destroy.php
// If it's desired to kill the session, also delete the session cookie.
// Note: This will destroy the session, and not just the session data!
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
// Finally, destroy the session.
session_destroy();
}
// Initierar sessionsvariabeln
if (isset($_POST['text1']) && !empty($_POST['text1'])) {
$_SESSION['namn']=$_POST['text1'];
}
//Hantera array
$allaNamn = array();
if (isset($_SESSION['allanamn'])) {
$allaNamn = $_SESSION['allanamn'];
$antal=count($allaNamn);
}
if (isset($_POST['text1']) && !empty($_POST['text1'])) $allaNamn[$antal]=$_POST['text1'];
$_SESSION['allanamn']=$allaNamn;
// Tar bort sessionsvariabeln
if (isset($_POST['delete'])) {
unset($_SESSION['namn']);
}
// Ökning av sessionsvariabel "visningar" med 1
if (isset($_SESSION['visningar'])) {
$_SESSION['visningar']++;
} else {
$_SESSION['visningar'] = 1;
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>session_test_3</title>
</head>
<body>
<?php
echo "<p>Tjosan! ID-värdet på denna session: ".session_id()."</p>";
echo "Hämtat från sessionsvariabeln "namn": ".$_SESSION['namn']." <br>";
echo "Hämtat från sessionsvariabeln "visningar":".$_SESSION['visningar'].
"<br><br>";
echo "Alla namn hittills: <br>";
for ($i=0; $i<count($allaNamn); $i++) {
echo $allaNamn[$i]."<br>";
}
echo "<br><br>";
echo "<form action="" method="post">";
echo 'Ditt namn: <input type="text" name="text1" size="10">';
echo '<input type="submit" value="Skicka namn"><br>';
echo "</form>";
echo "<br />";
echo "<form action="" method="post">";
echo '<input type="submit" value="Uppdatera enbart sidan (ladda om)">
<br>';
echo "</form>";
echo "<br>";
echo "<form action="" method="post">";
echo '<input type="hidden" name="delete" value="1">';
echo '<input type="submit" value="Ta bort sessionsvariabeln namn"><br>';
echo "</form>";
echo "<br>";
echo "<form action="" method="post">";
echo '<input type="hidden" name="destroy" value="1">';
echo '<input type="submit" value="Ta bort och rensa hela sessionen,">
<br>';
echo "</form>";
echo "<br>";
?>
<a href="session_test_4.php" target="_blank">Visa session-variablernas värde från en ny sida</a>
</body>
</html>
unset(session-variabel) rensar bort värdet för en session-variabel
Det går även att spara en array i en session-varabel.
$allaNamn = array();
$allaNamn = $_SESSION['allanamn'];
$_SESSION['allanamn']=$allaNamn;
<?php
session_start();
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>session_test_4</title>
</head>
<body>
<?php
echo "<p>Hej! Detta är de aktuella värdena.<br /><br />";
echo "ID-värdet på denna session: ".session_id()."</p>";
echo "Hämtat från sessionsvariabeln \"namn\": ".$_SESSION['namn']."<br />";
echo "Hämtat från sessionsvariabeln \"visningar\":".$_SESSION['visningar'].
"<br /><br />";
?>
</body>
</html>
Mer info hittar du på internet.
Källor, referenser, bra länkar
PHP.net Cookie
PHP.net Session
w3schools.com/php/php_sessions.asp