Kirjoittaja: Antti Laaksonen (2011).
PHP-koodissa asetettu muuttuja on tavallisesti voimassa vain koodin suorituksen loppuun. Istuntoja käyttämällä voi kuitenkin luoda muuttujia, joiden sisältö säilyy muistissa sivulta toiselle. Tavallinen sovellus on kirjautuminen, jossa käyttäjä pysyy "sisällä" sivustolla annettuaan oikean tunnuksen ja salasanan.
PHP:n istunnot on toteutettu evästeiden avulla. Ideana on luoda istunnon alussa käyttäjälle satunnainen id-tunnus ja tallentaa se evästeeseen käyttäjään selaimeen.
Seuraava koodi ottaa käyttöön istuntomuuttujan luku
:
<?php session_start(); $_SESSION["luku"] = 123; ?>
Istunnon käyttäminen vaatii, että koodin alussa kutsutaan funktiota session_start
. Tämän jälkeen istuntomuuttujia voi käsitellä taulukon $_SESSION
kautta. Tässä muuttujan luku
sisällöksi tulee 123.
Seuraava koodi tarkistaa, onko istuntomuuttujaa luku
olemassa, ja näyttää siinä tapauksessa sen sisällön:
<?php session_start(); if (isset($_SESSION["luku"])) { echo "Muuttujan arvo: " . $_SESSION["luku"]; } else { echo "Muuttujaa ei ole olemassa!"; } ?>
Istuntomuuttujan voi poistaa seuraavasti:
<?php session_start(); unset($_SESSION["luku"]); ?>
Lisäksi tavallisesti selaimen sulkeminen päättää istunnon, jolloin kaikki istuntomuuttujat katoavat.
Ennen funktion session_start
kutsumista sivulle ei saa tulostaa mitään. Tämä johtuu siitä, että palvelin välittää istuntotiedot selaimelle ennen sivun varsinaista sisältöä. Jos sivulle on jo tulostettu jotain, istuntoa ei voi enää aloittaa.
Esimerkiksi seuraava koodi ei toimi, koska session_start
on tulostuksen jälkeen:
<?php echo "Heippa!"; session_start(); $_SESSION["nimi"] = "Aapeli"; ?>
Myöskään seuraava koodi ei toimi, koska PHP-koodin ulkopuolella on tulostusta:
<!DOCTYPE html> <?php session_start(); $_SESSION["nimi"] = "Aapeli"; ?>
Seuraavassa esimerkissä on yksinkertainen kirjautumisjärjestelmä, jossa tieto kirjautumisesta tallennetaan istuntomuuttujaan. Järjestelmässä on kaksi käyttäjää: tunnus "aapeli" ja salasana "kissa" sekä tunnus "maija" ja salasana "pupu".
Tiedosto kirjautuminen.html
:
<!DOCTYPE html> <html> <head> <title>Kirjautuminen</title> </head> <body> <form action="sisaan.php" method="post"> Tunnus: <input type="text" name="tunnus"> <br> Salasana: <input type="password" name="salasana"> <br> <input type="submit" value="Kirjaudu"> </form> </body> </html>
Tiedosto sisaan.php
:
<?php session_start(); $salasanat = array(); $salasanat["aapeli"] = "kissa"; $salasanat["maija"] = "pupu"; $tunnus = $_POST["tunnus"]; $salasana = $_POST["salasana"]; if (isset($salasanat[$tunnus])) { if ($salasanat[$tunnus] == $salasana) { $_SESSION["kayttaja"] = $tunnus; header("Location: sisalto.php"); die(); } } ?> <p>Tunnus tai salasana on väärin!</p> <p><a href="kirjautuminen.html">Takaisin</a></p>
Taulukko $salasanat
sisältää käyttäjien tunnukset ja salasanat. Jos tunnus on taulukossa ja salasana on oikein, istuntomuuttujan kayttaja
sisällöksi tulee käyttäjän tunnus ja käyttäjä ohjautuu sivulle sisalto.php
. Komento die
lopettaa sivun käsittelyn, eikä sen jälkeen tulosteta enää mitään.
Tiedosto sisalto.php
:
<?php session_start(); if (!isset($_SESSION["kayttaja"])) { header("Location: kirjautuminen.html"); die(); } ?> <p>Tervetuloa, <?php echo $_SESSION["kayttaja"]; ?>!</p> <p><a href="ulos.php">Kirjaudu ulos</a></p>
Jos kirjautumista vastaavaa istuntomuuttujaa kayttaja
ei ole olemassa, käyttäjä ohjautuu suoraan sivulle kirjautuminen.html
. Muuten sivulle tulee tekstiä, jossa näkyy käyttäjän tunnus, sekä linkki uloskirjautumiseen.
Tiedosto ulos.php
:
<?php session_start(); unset($_SESSION["kayttaja"]); header("Location: kirjautuminen.html"); ?>
Uloskirjautuminen poistaa istuntomuuttujan kayttaja
ja ohjaa käyttäjän sivulle kirjautuminen.html
.
Istuntojen toiminta perustuu evästeisiin, jotka ovat käyttäjän selaimeen tallennettavia tiedonpalasia. Seuraava koodi luo evästeen, jonka nimeksi tulee nimi
ja sisällöksi tulee "Aapeli":
<?php setcookie("nimi", "Aapeli"); ?>
Tämän jälkeen evästeen sisällön saa selville taulukosta $_COOKIE
:
<?php echo "Nimi: " . $_COOKIE["nimi"]; ?>
Huomaa, että evästeen sisältö ilmestyy taulukkoon $_COOKIE
vasta seuraavalla sivunlatauksella funktion setcookie
kutsumisen jälkeen.
Evästeen pystyy poistamaan antamalla sen arvoksi null
:
<?php setcookie("nimi", null); ?>
Evästeen luonnin yhteydessä kolmantena parametrina voi antaa, kuinka kauan eväste on voimassa. Seuraava koodi luo evästeen, joka on voimassa tunnin (3600 sekuntia):
Jos voimassaoloaika on pitkä, tuloksena on "ikuinen" eväste:
Istunnon alkaessa käyttäjälle muodostetaan satunnainen id-tunnus, joka tallennetaan evästeeseen PHPSESSID
. Tämän jälkeen kaikki istuntomuuttujat tallennetaan palvelimella olevaan tiedostoon, jonka nimenä on istunnon id-tunnus. Käyttäjän selaimessa oleva eväste kertoo siis, mistä käyttäjän istuntoon liittyvät muuttujat löytyvät palvelimella.
Istunnon käyttäminen ei ole pakollista, vaan tarvittavat tiedot voisi tallentaa suoraan erillisiin evästeisiin. Tässä kannattaa kuitenkin huomata, että osaava käyttäjä pystyy katsomaan ja muuttamaan selaimensa evästeitä.
Esimerkiksi Firefox-selain näyttää äskeisten esimerkkien evästeet seuraavasti:
On mahdollista, että evästeet eivät toimi käyttäjän selaimessa, koska ne voi kytkeä pois käytöstä selaimen asetuksista. Jotkut pelkäävät evästeiden uhkaavan yksityisyyttä, eikä huoli ole aiheeton: esimerkiksi mainostajat voivat kerätä evästeiden avulla tietoa, millä sivuilla käyttäjät liikkuvat. Nykyään voi kuitenkin olettaa, että evästeet toimivat käytännössä kaikilla käyttäjillä.
Kysymys: jos A.php tiedoston alussa on includetettu tiedosto (B.php), jossa on ensimmäisenä session_start(), niin tarvitseeko se olla kuitenkin myös A.php alussa?
Ei (kai).
Minä olen tehnyt tällä tavalla latauskerta laskurin.
Tosin, piilotettuna swf tiedostoon.
Huomio! Kommentoi tässä ainoastaan tämän oppaan hyviä ja huonoja puolia. Älä kirjoita muita kysymyksiä tähän. Jos koodisi ei toimi tai tarvitset muuten vain apua ohjelmoinnissa, lähetä viesti keskusteluun.