PHP

Sessioner

På Internet skickas data med protokollet HTTP och vi nämnde i inledningen att det var ett lägeslöst protokoll. Detta betyder att det inte håller reda på klienten efter det att data har skickats. När nästa förfrågan kommer till servern har den ingen aning om att klienten nyss skickade en annan förfrågan. Det här är ett litet problem för programmeraren som vill hålla koll på sina användare.

Nu finns det något som kallas för sessioner i PHP som hjälper till med detta.

Förklaring En session kan liknas vid en besöksbricka som du får som besökare på ett företag. Du har hela tiden med dig den som ditt identitetskort som besökare. Den fungerar som ett passerkort i en del dörrar och det kan även finnas annan information på den. När du lämnar företaget lämnar du även kvar din besöksbricka. Skulle du gå in utan att ha din besöksbricka på dig/med dig blir du inte igenkänd och insläppt på olika stället på företaget.
Samma gäller för en webbsida och där en användare loggar in och blir då registrerad i en session, som tas bort när användaren loggar ut. På det här sättet kan systemet hålla reda på om en viss användare är inloggad och då ge tillgång till sådant material som bara är för inloggade. Systemet i det här fallet är den PHP-kod som är till för att hantera besökarna på sidan. Varje besökare på en webbsida tilldelas en egen session och programmeraren kan lagra de data som är nödvändiga i sessionen. Ofta räcker det med att lagra användarens användarnamn, resten finns förmodligen att hämta hem från en databas.

Varje ny sida som ska hålla reda på en inloggning (session) måste starta sessionshanteringen först i skriptkoden. Den funktion som sköter detta är session_start() och måste alltså finnas med på varje sida. När sessionen är startad går det att registrera den data som ska finnas tillgänglig senare och på andra sidor.

I tidigare versioner av PHP användes ofta funktionen session_register() för att lägga till variabler till sessionen. Det här fungerade bara om webbservern var inställd på att tillåta globala variabler. De flesta webbservrar på senare tid tillåter inte detta som standard och då fungerar inte den tekniken. Det nyare sättet att göra samma sak är genom att använda variabeln $_SESSION som är en vektor med alla sessionsvariabler i. T ex kan vi genom följande kod lägga till den användare som precis loggat in på en sida.

<?php 
session_start();
$_SESSION['username'] = $_POST['username'];
?>

Det är precis vad vi också ska göra på Nikes inloggningssida : login.php . Om inloggningen lyckas ska det rätta användarnamnet registreras i sessionen.

<?php 
session_start();
// Här läser vi in värdena som skickas till sidan. 
// Det här är bara en kommentar på sidan
$username = $_POST ['username'];
$password = $_POST ['password'];

if (checkLogin($username, $password)) {
	//echo "Du är inloggad!";
	$_SESSION['username'] = $username;
	header("Location: traning.php");
}
...

Förutom att registrera variabeln username skickar vi också användaren till den sida som är målet med inloggningen : traning.php.

Nu kan vi på denna och senare sidor ta fram den användare som är inloggad genom att hämta ut variabeln username från sessionen. Detta görs genom att hämta ut variabeln och värdet som vanligt ur vektorn $_SESSION. Vi tar nu fram filen traning.php och gör skapar själva kontrollen av inloggningen. Det första vi gör är att ange att vi ska använda sesionen även på den sidan.

<?php
session_start();
...

Efter detta kollar vi helt enkelt om det finns en session registrerad

if ($_SESSION['username']) 
{
	// Här kan vi t ex skriva ut ett välkomstmeddelande 
	// eller hämta användarens personliga data
}

// Annars skickar vi tillbaka användaren!
else
{
	header("Location: login.html");	
}

Här är alltså namnet på variabeln nyckel i vektorn $_SESSION. Det går nu att använda användarnamnet på den nya sidan. Det är fortfarande användarnamn "webbmaster" och lösenord "secret" som är rätt vid inloggning.

Resultat

Kod till traning.php

Kod

För att ta bort värden från sessionen sätter man helt enkelt det värde man vill ta bort till faskt värde. Det här görs enklast enligt $_SESSION['username'] = FALSE. Sessionsvariabeln är nu borttagen utan att hela sessionen är förstörd.

För att nollställa sessionen och ta bort alla dess värden behöver man göra två saker. Dels måste alla värden tömmas och det görs genom att tilldela sessionsvektorn en tom vektor

$_SESSION = array();

Efter det här tar vi bort resterna av sessionen genom att använda funktionen session_destroy(). Nu är allt borttaget och sessionen går att återskapa om man så vill. För att trycka på säkerheten på sin webbsida är det också bra att verkligen kolla så att sessionen är borttagen helt och hållet.

Vi skapar en knapp (ett formulär) för utloggning på träningssidan. Det enda formuläret gör är att skicka en variabel tillbaka till sidan som säger att vi vill logg ut. Först en titt på det enkla formuläret

<FORM name="logout" action="traning.php" method="POST">
	<INPUT type="submit" name="logout" value="Logga ut">
</FORM>

Det som händer när användaren klickar på knappen Logga ut är att en variabel med namnet logout och värdet Logga ut skapas och skickas med metoden POST till PHP-sidan traning.php (vilket är samma sida som formuläret själv ligger på). Vi kan nu skriva PHP-kod för att kolla om användaren har skickat iväg formuläret. Koden läggs till längst upp i filen i PHP-blocket.

if ($_POST['logout']) 
{
	$_SESSION = array(); 
	session_destroy();	 
}

Prova nu exemplet igen. Förmodligen kommer du fortfarande vara inloggad eftersom sessionen ligger kvar. Prova då först att logga ut för att sedan logga in igen. Vad händer när du stänger exempelfönstret utan att ha loggat ut och sedan öppnar exemplet igen?

Resultat

Koden till traning.php

Kod

Koden till nya login.php

Kod

När vi anropar olika slags kod på det här sättet beroende på vad användaren gör kallas det händelsestyrd programmering. Mycket av PHP handlar om det och modellen är användbar till många olika tillämpningar.

Övning Du ska nu skapa en länk till träningsschemat så att det går att komma åt från Nikes webbsida. För att det ska vara lite extra hemligt så låter vi den undre bilden på sidan bilder.html vara själva länken. Gör även så att sidan visas i ramen innehåll för att passa in med resten av webbsiten. Prova att det fungerar att logga in och ut. Prova även att klicka runt lite på de andra länkarna i menyn och sedan gå tillbaka (genom att klicka på bildlänken) utan att logga ut under tiden. Fungerar sessionen som den ska?

Resultat

Koden till bilder.html

Kod