PHP.ee
 php.ee   linuxator.com   whee 
07.02.12 / 23:17
  Artiklid
  » Algajaile
  » Andmebaasid
  » Varia
  » Graafika
  » Advanced
Logi sisse:
< nimi
< pass
Unustasid passi?
Kas eelistad võimalusel PHP koodi objektorienteeritult kirjutada?
 Jah, see teeb töö lihtsamaks
 Jah, see on lihtsalt lahe
 Nii ja naa, ei tunne erilist võitu
 Ei, mõttetu ajakulu
 Ei oska objektorienteeritult progeda
Tulemused
Liitu listiga!
Telli PHP uudiskiri
Nimi:
Email
PHP ja küpsiste küpsetamine
Martin Rebane

Küpsiste ehk cookiede ümber löödi omal ajal hulga lärmi, eriti seoses sellega, et nad ohustasid(ja teevad seda jätkuvalt) kasutaja privaatsust. Ent oma olemuselt on nad väga lihtsad ja elementaarsed asjad, mida igaüks kasutada saab.

Küpsised kujutavad endast killukest informatsiooni, mida server kasutaja arvutile saadab ning mille too oma kettale salvestab, et järgmine kord, kui ta serveriga ühendust võtab, see info serverile tagasi saata.

Skeem

Kasutaja vaatab lehte -> server annab talle lehe ja ühtlasi cookie -> järgmine kord, kui kasutaja samas serveris lehte vaatab, saadab brauser serverile cookies oleva info tagasi


Kõigepealt käsitleme PHP funktsiooni setcookie(), nimelt seda kasutatakse küpsiste kasutaja arvutisse sokutamiseks. Tema parameetrid on järgmised:

setcookie(nimi, väärtus, parim enne, kataloogirada, domeen, turvalisus);

Nimi, väärtus, kataloogirada ja domeen on stringid, teised arvväärtused. Vaatame lähemalt:

Nimi - räägib iseenda eest. Ainsana kohustuslik.

väärtus - peaks ka selge olema - nt küpsisel nimega 'automark' võib olla väärtus 'peugeot' või 'saab'

parim enne e. expires - kui kaua cookie kehtib

kataloogirada - millise kataloogi jaoks see mõeldud on, nt kas cookie on loetav ainult php.ee/suvaline/ kataloogis või ka php.ee pealehel

domeen - millise domeeni jaoks see mõeldud on, domeen peab sisaldama vähemalt kahte punkti, nt '.linuxator.com', seda selleks, et ei saadetaks küpsiseid, mille domeen on pelgalt .com või .net

turvalisus - kui selle väärtuseks panna 1, siis peab küpsise edastamiseks kasutama HTTPS-protokolli, vastasel juhul saadetakse seda samuti nagu iga teist html-faili.

Kuna domeen ja kataloogirada ei ole kohustuslikud, võib need panemata jätta - vaikimisi on nende väärtused samad, kui dokumendil, mis cookie seadis. Samuti ei huvita meid turvaline cookiede saatmine. See jääb ka välja.

Mis meid huvitab?

Küpsetame siis ühe küpsise.

setcookie("sugu", "$sex", time()+3600);

time()+3600 tähendab seda, et funktsioon time() küsib
serverilt praeguse kellaaja ja liidab sinna 3600 sekundit, järelikult on meie küpsis söödav ühe tunni jooksul. Küpsise nimeks panime "sugu" ja väärtuseks selle, mis oli meil muutujas $sex (ingl.k. 'sugu')

Nii, nüüd tuleb meeles pidada, et küpsis tuleb teele saata enne kui server kasutajale midagi muud väljastab.

PHP kood:


 
<?php
    setcookie
("sugu"$_POST['sex'], time()+3600);
    
//siia muu kood, html jne.
?>


Enne php-märgendit ei tohi olla isegi ainsat tühikut, rääkimata html'ist, sest siis saadab server kliendile, kes seda dokumenti vaadata tahab, dokumendi päise, 'cookie' aga on osa päisest ja tuleb saata kõige esimesena. Samuti ei tohi me PHP'ga enne cookie seadmist ka mingit muud outputi genereerida(nt echo abil). Samas võib enne setcookie() väljakutsumist olla PHP koodi - niikaua kui see kasutajale midagi ei väljasta, näiteks nii:

PHP kood:


 
<?php
    $muu_muutuja
='muu vaartus';
    
setcookie("sugu"$_POST['sex'], time()+3600);
    
//siia ülejäänud kood, html jne.
?>


Aga ikkagi, mis sellest kasu on? Oletame, et meil oli fail index.php, kus küsisime kasutajalt, kas ta on mees või naine? Näiteks nii:
Mis soost oled?

<form method="post" action="setcookie.php">
<select name="sex">
<option>Vali...</option>
<option value="mees">Mees</option>
<option value="naine">Naine</option>
<option value="rabast">Rabast hoopis</option>
</select>
<input type="submit" value="Vasta">
</form>

Pakime aga asjad ja astume edasi - setcookie.php:

PHP kood:


 
<?php
    setcookie
("sugu""$sex"time()+3600);
    
header("Location: index2.php");
?>


Nii, vaatame, mida me siis tegime. Küpsise panekust oli juba juttu, aga header? Header e. päis saadetakse iga html-dokumendi alguses, tavaliselt teeb seda server, mitte meie ise. Päise abil saab kasutajale anda erinevat infot lehe kohta(nt not found, permission denied, internal server error jm). Käesolev header - 'location' aga toimib ümbersuunamisena ja on kasulik näiteks siis, kui oled oma veebilehe uuele aadressile kolinud; siis tee lihtsalt nii:

<?php
    header("Location: http://www.linuxator.com/php/index.php");
?>

Seda muidugi eeldades, et sa soovid kõik külastajad, kes sinu vanale lehele tulevad, juhatada nimetatud kohta :)

Nii, aga miks me sellise vahepealse lehe tegime, miks mitte kohe minna index2.php ja seal see küpsis paika seada? Aga sellepärast, et küpsist ei saa kasutada enne järgmist sellise lehekülje serverist alla laadimist, mille jaoks cookie nähtav on.

Kuna me jätsime paika panemata domeeni ja kataloogi, siis on ta nähtav kõigi meie lehtede jaoks, mis meil käesolevas kataloogis ja selle alamkataloogides leiduvad.

Nüüd jõudsime oma küpsisega lehele index2.php. Kasutame siis seda.

PHP kood:


 
<?php
switch($_COOKIE['sugu'])
{
    case 
mees: echo"tere mees!"; break;
    case 
naine: echo"tere naine"; break;
    case 
rabast: echo"ilus ilm täna"; break;
    default: echo 
"kes sa oled ja kust sa tuled?";
}
?>


$_COOKIE['sugu'] on globaalne cookiemuutuja. Kõik lehele kättesaadavad küpsised asuvad serveri poolt paika seatud massiivis $_COOKIE[]. Nii ka meie oma.

Vanades koodides, mis programmeeritud ajal, mil PHPs oli register_globals vaikimisi sisse lülitatud, sai cookiet kasutada ka lihtsalt $sugu nimelist muutujat kasutades. Mõnel pool toimib see ka praegu, ent see ei ole turvaline ega soliidne, seetõttu kasutame $_COOKIE['sugu'] (vanem versioon samast asjast on $HTTP_COOKIE_VARS["sugu"])

PHP kood:


 
//vanemates koodides võid kohata ka sellist pilti
echo $HTTP_COOKIE_VARS["küpsise_nimi"];
//tänapäeval kasutatakse nii
echo $_COOKIE['küpsise_nimi'];



Antud näide on algeline cookiede kasutus, kuid selle asemel võib näiteks sama näidet kasutades mitte mõttetult tervitada, vaid hoopis vastavalt vastusele sobiv banner lehele paigutada: kui tegemist oli mehega, siis autoreklaamid, kui naisega, siis kosmeetikasalongi oma, kui rabast tüübiga, siis kutse kanuumatkale...

Aga kui külastaja tuleb lehele ja tal juba on minu cookie? Siis võib ju kohe esimese faili algusesse paigutada location-headeri:

PHP kood:


 
<?php
if (isset($_COOKIE["sugu"]))
    header("Location: index2.php");
?>


Kui kellegile jäi selgusetuks, mida isset() teeb, siis isset() on see funktsioon, mille abil saab kontrollida, kas muutuja on olemas. Kui on, redirectitakse kasutaja kohe index2.php'le. isseti tähendus saab inglise keele oskajaile selgemaks, kui see lahti kirjutada:

is set (tõlkes: on seatud)


Korras. Aga aitab küpsistest, kustutame nad ära! Siin tuleb veidi hoogu maha võtta, sest otseses mõttes kustutada neid ei saa, vaid nad tuleb uuesti seada, ainult seekord tühjalt:

PHP kood:


 
<?php
    setcookie
("sugu"""0""""0);
?>


Mis juhtus? Nimelt kui saadame brauserile küpsise, millel on ainult üks atribuut - nimi, siis see küpsis sisuliselt kustutatakse. Mõnelpool pakutakse küpsise kustutamise jaoks välja teistsugune lahendus - seada expire väärtus minevikku.

setcookie("sex", "", time()-48*3600, "/");

Ent see võimalus ei toimi mõnede vanemate brauseritega. Kumba kasutada, on igaühe enda otsustada.

Küpsiste kood ühes failis: cookie.txt või ZIP

Artikli kommentaarid

O