Tilbake til startsida IKT i praksis - PHP

Meny
 
 
 
PHP
Session
 
Pascal
 
Open Office
 

$_SESSION

Sjølv dumpa eg innom $_SESSION då eg skulle setje opp ei enkel side der brukaren måtte skrive inn eit passord som blei vist på skjermen. Dette for å hindra søkerobotane i å sende brev til meg. Det er nokså likt sida du kjem inn på når du trykker på knappen «Send melding» nedst på denne sida. Slumpgeneratoren låg på éi side, innlogginga på ei anna side og kontrollen av passordet på ei tredje side. Sjølvsagt kunne eg ha laga noen variablar som tok med seg dataane frå side til side, men valde altså å bruke $_SESSION i staden. Eit val som skulle vise seg å ikkje vere så enkelt som lærebøkene ga uttrykk for.

Det meste virka greit så lenge eg held meg til den lokale tenaren eg har heime, men svikta heilt då eg prøvde det same på den nettbaserte tenaren. (Den du er inne på nå). På denne sida vil eg prøve å forklare problema og korleis dei enkelt kan løysast.

Først litt forklaring. $_SESSION blir brukt for å lagre eller endre data som blir brukte i fleire sider på nettstaden. Variabelen blir sett opp for ei enkelt brukarøkt («User Session»), og er bare tilgjengelege så lenge brukaren er på nettstaden. Alle session-data blir lagra på tenaren (serveren), og forsvinn når brukaren går ut av nettstaden. Dei må setjast opp på nytt om brukaren kjem tilbake til nettstaden. Er det fleire brukarar inne samstundes, vil kvar brukar få sine unike session-data, som ikkje kan lesast av andre.

$_SESSION er ein tabell («array») der du kan legge inn så mange element du måtte ha bruk for etter mønsteret
$_SESSION['element_1'] = 1;
$_SESSION['element_2'] = 'tekst';
osv.

Bruk av $_SESSION

Det første du må gjere er å opne økta med kommandoen session_start();. Dette må i følgje lærebøkene gjerast øvst på kvar side som skal bruke $_SESSION, føre <html>-taggen. Altså slik:

<?php session_start(); ?>
<html>
<body>

</body>
</html>

Dette virka altså fint heime, men ikkje på Internett. Etter mykje dill fann eg ut at denne kommandoen opna ein ny session for kvar side. Eg måtte fortelje programmet kva session som skulle brukast. Noen tips var å gi kvar session sitt eige namn og så bruke dette namnet heile tida. Dette virka ikkje i alle situasjonane. Derimot virka det helt fint om eg gav kvar session sin eigen ID. Sidan denne skulle brukast på passord-sida, fekk variabelen namnet «passord». Den øvste linja blei då slik:

<?php session_id('passord'); session_start();?>

Hugs å opplyse programmet om ID-en før du startar session.

Dette virka fint lenge, men så byrja feilmeldingane å dukke opp igjen etter kvart som programmet blei meir omfattande. Denne gongen fordi eg starta session som var starta tidlegare i programmet. Løysinga blei endå ei tilføying til linja øvst på sida:

<?php session_id('passord'); session_start(); session_write_close(); ?>

Nå virkar alt som det skal.

Vegen vidare

Nå er vi altså klare til å ta i bruk $_SESSION. Før du eventuelt kastar bort tid med å lese vidare, bør eg åtvare om at eksempla krev at du kan litt om bruk av skjema (<form>) i <html>. Funksjonar i PHP utanom dei som har med $_SESSION å gjere er heller ikkje forklarte her.

Sida som genererer passordet legg dette inn i session. Dette blir gjort slik:

<?php
session_id('passord'); // Identifiser session
session_start();   // Start session
$_SESSION['genkode'] = $generert_kode;   // Legg koden inn i session
session_write_close();   // Lukk session
?>

I sida der brukaren skal skrive inn koden, blir den genererte koden henta fram igjen frå session:

Sida som genererer passordet legg dette inn i session. Dette blir gjort slik:

<?php
session_id('passord'); // Identifiser session
session_start();   // Start session
$generert_kode = $_SESSION['genkode'];   // Hent koden frå session
session_write_close();   // Lukk session
?>

Dermed kan koden skrivast ut på sida slik at brukaren ser den og kan skrive inn det same for å vise at han ikkje er ein robot. Her bruker eg <html> og <form> som sender data til sida som sjekker at det innskrivne passordet er det same som det genererte passordet. Dersom koden er feil, blir brukaren sendt tilbake til innskrivingssida. Er det korrekt, blir resten av sidene opna.

Litt meir avansert

Dersom du trykker på knappen «Send melding» nede til høgre på sida her, kjem du til ei side som er bygd opp slik som nemnd ovanfor. Her er det i tillegg lagt inn noen ekstra funksjonar.

Denne sida kan kallast opp frå alle sidene på denne nettstaden. Difor kjem namnet på sida opp som emne for e-posten. Dette kan du sjølvsagt endre etter behov. Skriv du inn feil kode, vil du få melding om dette og ein knapp for å vende tilbake til innskrivingssida. Normalt når du lastar inn ei slik side, vil alle tidlegare innskrivne data gå tapt og du må skrive alt på nytt. Slik er det ikkje her. Alle data blir lagra i session og hent tilbake derifrå.

Inne i <body>-taggen, nokså høgt oppe, har eg i innskrivingssida sett inn

<?php
session_id('passord'); // Identifiser session
session_start();   // Start session
if (!isset($_SESSION['franamn'])) {   // Sjekk om første besøk. Dersom ja:
$_SESSION['genkode'] = '';   // Nullstill
$_SESSION['franamn'] = '';   // Nullstill
$_SESSION['fraepost'] = '';   // Nullstill
$_SESSION['emne'] = '';   // Nullstill
$_SESSION['melding'] = '';   // Nullstill
}
$genkode = $_SESSION['genkode'];   // Hent data frå generert kode
$fra_namn = $_SESSION['franamn'];   // Hent data, namn på avsendar
$fra_epost = $_SESSION['fraepost'];   // Hent data, e-postadressa til avsendar
$emne = $_SESSION['emne'];   // Hent data, emnet for e-posten
$melding = $_SESSION['melding'];   // Hent data, meldinga i e-posten
session_write_close();   // Lukk session
?>

Kontrollen if (!isset($_SESSION['franamn'])) sjekkar om session-elementet 'franamn' er aktivert. Her kunne eg ha brukt kva element som helst av dei som er med i session('passord'). Dersom elementet ikkje er aktivert, betyr det at tabellen $_SESSION heller ikkje er aktivert. Aktiveringa skjer ved å legge tomme strenger i elementa. Lenger nede i programsnutten blir verdiane frå session lagt inn i dei ulike php-variablane. Første gongen programmet kjem hit, vil variablane bli sett til å vere tomme. Seinare gonger vil session innehalde data henta frå programmet og overføre desse til variablane.

Når brukaren trykker «Send» vil data bli overførte via <form> til sida som kontrollerer dataane. Her blir alle data lagt inn i dei respektive php-variablane og derifrå over i session:

<?php
session_id('passord'); // Identifiser session
session_start();   // Start session
$_SESSION['genkode'] = $genkode;
$_SESSION['franamn'] = $fra_namn;
$_SESSION['fraepost'] = $fra_epost;
$_SESSION['emne'] = $emne;
$_SESSION['melding'] = $melding;
session_write_close();   // Lukk session
?>

Dersom brukaren skriv feil kode og må tilbake til innskrivingssida, vil data bli henta inn igjen frå session og skrive inn i skjemaet.

Sjølvsagt er det ein del andre kodingar og kontrollar, men dei har med skjemaet (form) å gjere og blir ikkje tatt opp her. Håper du har fått med deg nok til å prøve $_SESSION.

Som alltid i PHP, finst det fleire måtar å gjere ting på. Eg har bare vist dei eg sjølv fann det greit å bruke. Du kan finne meir om $_SESSION mellom anna på sida PHP.

Eksempel utan skjema (form)

Sidan eksempla ovanfor krev at du kan bruke skjema (<form>) i html, kan det vere på sin plass å legge inn eit eksempel der dette ikkje er nødvendig. Dersom du skriv inn denne programsnutten i alle sidene dine, kan du telje kor mange sider på nettstaden din brukaren har vore innom. Teljaren blir auka med 1 for kvar gong ei side blir opna.

<?php
session_id('teljar'); // Identifiser session
session_start();   // Start session
if (isset($_SESSION['vist'])) // SESSION aktivert frå før. Auk med 1.
$_SESSION['vist'] = $_SESSION['vist'] + 1;
else // 1. gongen session er kalla opp. Set verdien til 1.
$_SESSION['vist'] = 1;
print "<p>Vist ".$_SESSION['vist']." sider.</p>";
session_write_close();
?>

Første gongen session blir kalla opp, blir teljaren sett til 1, alle gonger seinare blir verdien auka med 1.

Slumpgeneratoren

Slumpgeneratoren som er brukt i det første eksemplet kan sjå slik ut:

<?php
function slumpCaptcha($tal){
$teiknliste = array_merge(range('a', 'z'), range('A', 'Z'), range('2', '9'));
shuffle($teiknliste); // Stokkar lista med teikn tilfeldig
$kode = '';
foreach (array_rand($teiknliste, $tal) as $v) {
$genkode .= $teiknliste[$v];
}
return $genkode;
}
$kode = slumpCaptcha(4);
session_id('passord');
session_start();
$_SESSION['genkode'] = $kode; // Lagra den genererte koden i session
session_write_close();
?>

Programsnutten er skriven for å vere så let forståeleg som råd er og samstundes fleksibel. Sjølvsagt finst det haugevis av andre måtar å generere ein tilfeldig kode på.

Denne typen kode blir ofte kalla «captcha», difor namnet på funksjonen. Talet 4 i oppkallet av funksjonen gjer at det blir laga ein kode med fire teikn. Teiknlista inneheld alle dei teikna du vil skal kunne vere med i koden. Her alle store bokstavar frå A til Z og dei tilsvarande små bokstavane. Dei «norske» bokstavane er ikkje tatt med i og med at desse ikkje alltid får den same kodinga på ulike maskiner. Tala 0 og 1 er ikkje tatt med sidan dei på mange maskiner kan forvekslast med bokstavane O og l. Du kan sjølvsagt setje inn andre teikn, men dei må helst finnast eintydig på tastaturet.
Sløyfa foreach() plukker teikn frå starten av teiknlista. I eksempelet altså 4 teikn.


Send melding

© Innhald og design:  Kolbjørn StuestølStuestøl heimesideSist endra 18. april 2013