Programmera i PHP/Sessioner och PHP

Från Wikibooks


Vad är sessioner?[redigera]

Sessioner är ett extremt enkelt och värdefullt sätt för en hemsideägare att se efter om en användare har rätt att komma åt vissa delar av sidorna. Är man inloggad kan man t.ex. se bilder eller ladda ner filer som en oinloggad användare inte kan.


Sessioner använder sig av cookies. Om användaren stängt av cookies i webläsaren fungerar det inte. Därför är det viktigt att vara tydlig med att hemsidan använder cookies så att en frustrerad användare förstår varför det inte fungerar.


Du kan inte förvänta dig att en session skall vara igång när du surfar till den sida där sessionen startar. Logiken säger att du bör ha en särskild sida där en användare loggar in och en särskild sida där en användare loggar ut. Vid inloggning skapas sessionen och vid utloggning avbryts sessionen och alla cookies förstörs.


Man behöver inte en databas för att hantera sessioner, men det underlättar betydligt.


Tänk på att en sessions cookie skrivs som en helt okrypterad liten textfil, så spara inte någon känslig information i den. Inga inloggningsnamn eller lösenord t.ex.


Starta en session[redigera]

Ett enkelt sätt att starta en session kan vara:

<!-- page1.php logga in -->
<?php
session_start();
$_SESSION['time'] = time();
$_SESSION['status'] = "Inloggad";
echo '<a href="page2.php">Gå till sida 2 för att logga ut!</a>';
?>

Då kan man lätt kontrollera mot sessionen om personen är inloggad och dessutom när den blev inloggad. Problemet är nämligen att om en användare bara stänger sin webläsare förblir den inloggad i evig tid eftersom sessions cookiesarna inte raderats. Det kan man komma runt genom att beräkna tiden och automatiskt logga ut någon efter valfritt antal timmar.

SID[redigera]

När en session skapas tillverkas även ett sessions ID, ett sk. SID. Även om användaren har stängt av cookies kan man i nödfall se om den har ett sessions ID eftersom det alltid skapas på servern och på det sättet ialla fall avgöra om den har loggat in. Vill du se ditt sessions-ID kan du skriva:

echo SID; //SID är ingen variabel, därför inget dollartecken

Problemet är att du enbart kan se det i samband med att det skapas. Får du ett tomt värde kan det lika gärna bero på att du tillåter cookies i din webläsare och redan har besökt sidan under samma session.

Sessionsbiljetten[redigera]

På varje sida som sessionencookiesarna skall kunna avläsas måste man lägga till:

session_start();

längst upp, före någon annan text över huvud taget. Komplett kodexempel:

<?php
 session_start();
?>

Om inte den koden kommer med kan man inte läsa av sessionscookiesarna och inte heller förändra dem. I värsta fall kan man sitta på den sidan så länge att tiden för sessionen löper ut och användaren blir automatiskt utloggad.

Ta därför för vana att alltid skriva in sessionsstarten på alla sidor på din hemsideplats oavsett om du behöver sessionscookiesarna eller inte, och se även till att de bara blir inlästa en enda gång per sida. Annars kan diverse konstiga fel uppstå.

Felsökning[redigera]

Sessioner kan skapa mer grå hår än man förtjänar. Man skall aldrig starta två sessioner på samma sida. Ett sätt att kontrollera sesssions-ID:et är att först kontrollera om det finns:

if(session_id() == '') //ID är utan värde
 {
      // sessionen har inte starta      
      session_start();
 }
 else
 {
      // session har startat 
 }

Alternativt:

if(!isset($_SESSION)) {
     session_start();
}

Ibland vill man se vilka variabler som finns i sessionen. Då kan du använda detta enkla kommando:

var_dump($_SESSION);

Då får du fram alla sessionsvariablerna och deras värden.

Logga ut[redigera]

Page2.php får agera utloggningssida. Vi antar att det finns en knapp man klickar på som loggar ut användaren, vad händer då? Då kan man t.ex. använda kod liknande denna:

page2.php:
<?php
session_start();
if ($_COOKIE["PHPSESSID"])
{
echo 'Sessionen påbörjades: ' . date('Y m d H:i:s', $_SESSION['time']) . '<br />';
echo 'Användaren är: ' . $_SESSION['status'] . '<br />';
session_destroy();
} else {
echo 'Det finns ingen session för dig. Endera loggade du inte in på page1.php eller också har du stängt av cookies i din webläsare.<br />';
}
?>

Kommandot session_destroy() raderar sessionen tillsammans med alla cookies och värden associerade med sessionen.

Vill du radera ett enstaka värde, och inte alla, kan du skriva:

 <?php
 session_start();
 if(isset($_SESSION['status']))
   unset($_SESSION['status']);
 ?>

då behåller du alla andra sessionsvärden.

Radera sessionen[redigera]

Skall du radera alla sessionsvariabler, t.ex. när en användare loggar ut, kan du skriva:

$_SESSION = array(); //Töm alla sessionscookiesarna
session_destroy(); //Radera sessions-ID

Läs mer på engelska: http://www.adamsinfo.com/php-developer-php-sessions/

Vanlig cookie[redigera]

Har man svårt att hantera sessioner kan man skapa vanliga cookies. En cookie är inget annat än en liten textfil som lagras lokalt på din egen dator och den innehåller information som din webläsare kan använda. De har använts i årtionden men eftersom användaren kan stänga av stödet för dem är det olämpligt att användas cookies för kritiska funktioner.

En cookie skall innehålla cookiens namn, ett värde och en tid när den inte skall användas längre. Du kan skapa en cookie t.ex. med:

<?php
//Beräkna en tidpunkt 60 dagar in i framtiden //sekunder * minuter * timmar * dagar + tiden just nu
$inTwoMonths = 60 * 60 * 24 * 60 + time(); 
setcookie('lastVisit', date("G:i - d/m/y"), $inTwoMonths); 
?>

När din cookie sedan skall läsas av kan du skriva:

<?php
if(isset($_COOKIE['lastVisit']))
$visit = $_COOKIE['lastVisit']; 
   else
echo "Du har en riktigt gammal kaka!";

echo "Senast du besökte oss var - ". $visit;
?>

Resultatet ut på skärmen är:

Senast du besökte oss var - 11:48 - 28/02/13

En session avbryts när man stänger webläsaren. Vill man spara information från ena gången en användare surfar till en sida till ett senare tillfälle användaren besöker samma sida kan du inte använda dig av sessioner utan måste lita på cookies istället.

Ett problem när man skapar en vanlig cookie är att den webläsarfönstret måste uppdateras minst en gång innan man kan läsa av värdet. Ett sätt att komma runt det problemet är att lagra värdet samtidigt i både cookie och i cookie variabeln, t.ex:

if(!isset($_COOKIE['lg'])) {
   setcookie('lg', 'ro');
   $_COOKIE['lg'] = 'ro';
}
echo $_COOKIE['lg'];


Felsökning - sida[redigera]

Här nedanför följer en minimal kod för att lista ut om något är fel på sessionen. Kopiera in koden i ett tomt dokument som du döper till test.php. varje gång du trycker på uppdatera-länken skall värdet dubblas. Om det inte dubblas sparas inte dina sessions-cookies som de skall. Då finns det två troliga fel. Endera sparar inte din webläsare cookies lokalt, eller så har du inte skrivrättigheter på den server-mapp där dina sessionscookies sparas.

<?php
session_start();
var_dump($_SESSION);
?>

<!doctype html>
<html>
<head>
<title>test.php testsida för sessioner</title>
</head>


<body>

<?php

echo "SID: " . SID . '<br>';


if(isset($_SESSION['testvarde1'])){
    echo "<br>Testvarde1 = ".$_SESSION['testvarde1'];
   }
   else {
   $_SESSION['testvarde1'] = 100;
       echo "<br>Nu skapas testvärde1= ".$_SESSION['testvarde1'];
   }

 echo " <br>Nu dubblar vi testvärde1.<br>";
 $_SESSION['testvarde1'] = $_SESSION['testvarde1'] * 2;

echo "<br>Nu är testvärde1= ".$_SESSION['testvarde1'];

echo "<br>Nu är variablerna:<br>";

var_dump($_SESSION);

echo '<br><a href="test.php">Uppdatera</<><br>';

?>
</body>
</html>