Kirjautuminen

Haku

Tehtävät

Oppaat: PHP-ohjelmointi: Osa 11 - Istunnot

  1. Osa 1 - Johdanto
  2. Osa 2 - Muuttujat
  3. Osa 3 - if-rakenne
  4. Osa 4 - for-silmukka
  5. Osa 5 - Taulukot
  6. Osa 6 - Lomakkeet
  7. Osa 7 - Nettisivusto
  8. Osa 8 - Lisää silmukoista
  9. Osa 9 - Tiedostot
  10. Osa 10 - Omat funktiot
  11. Osa 11 - Istunnot
  12. Osa 12 - Tietokannat
  13. Osa 13 - Tietoturva
  14. Osa 14 - Olio-ohjelmointi
  15. Osa 15 - Kuvien luonti
  16. Osa 16 - Säännölliset lausekkeet
  17. Osa 17 - Merkistöt
  18. Osa 18 - PHP:n ongelmat

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.

Istunto

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.

Tulostaminen

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";
?>

Esimerkki: Kirjautuminen

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".

Kokeile koodia

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.

Evästeet

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):

<?php
setcookie("nimi", "Aapeli", time() + 3600);
?>

Jos voimassaoloaika on pitkä, tuloksena on "ikuinen" eväste:

<?php
setcookie("nimi", "Aapeli", time() + 1000000);
?>

Evästeet ja istunnot

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ä.


Kommentit

Turso [20.04.2012 22:23:03]

#

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?

ErroR++ [22.05.2012 15:48:45]

#

Ei (kai).

epe07 [14.05.2014 14:31:34]

#

Minä olen tehnyt tällä tavalla latauskerta laskurin.
Tosin, piilotettuna swf tiedostoon.

Kirjoita kommentti

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.

Muista lukea kirjoitusohjeet.
Tietoa sivustosta