Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




PHP Sola

Slovena


PHP Sola (5. del)

Do sedaj smo ze ugotovili, da si nasa skripta ne zapomni podatkov od enega zagona do drugega. Ampak moramo te podatke nekam shraniti. Zdaj ze znamo shraniti podatke v bazo in datoteko. Danes si bomo ogledali kako uporabljamo piskotke in seje.

Zakaj sploh uporabljati piskotke in seje ?

Uporaba piskotkov in seje pride v postev v primeru kadar zelimo shraniti podatke o posameznem obiskovalcu. Zapomniti si je potrebno da se piskotki shranijo samo tistemu obiskovalcu, ki smo mu jih nastavili. Enako ve 858p1520i lja za seje, vsak obiskovalec ima svojo unikatni ID seje s katerim se predstavi in glede na ID se nalozijo podatki te seje.



Piskotki

Piskotki so podatki, s katerimi si spletna stran zapomni podatke o uporabniku. Na primer na forumu se zabelezi uporabnisko ime in teme katere smo danes prebrali ali pri anketi označimo da je obiskovalec ze glasoval. Moramo se zavedati, da se piskotki lahko brez vednosti spletne strani spremenijo ali izbrisejo. Zatorej se ne moremo vedno zanasati na njih. Poznamo dve vrsti piskotkov, sejne in stalne. Sejni piskotki se shranijo za čas trajanja seje. Seja traja dokler ne zapremo (zadnjega) okna brskalnika. Stalni piskotki pa ostanejo shranjeni v brskalniku toliko časa, kot smo določili ob njegovem kreiranju. Poglej si enostaven primer kako shranimo in preberemo piskotek.

<?php

$ime = 'Jerneja';

if ( isset( $_COOKIE['ime'] ) ) else

?>

Kot opazimo piskotke beremo enako kakor GET in POST vrednosti. Piskotki imajo svojo globalno spremenljivko $_COOKIE, katera je polje vseh piskotkov. Piskotek nastavimo s funkcijo setcookie(). Prvi argument je ime piskotka v nasem primeru "ime", drugi je njegova vrednost, tretji čas trajanja piskotka, četrti pot, peti domena in sesti ali je piskotek varen. Obvezen je le prvi argument, v primeru da ne navedemo drugega argumenta ali navedemo prazno vrednost, se piskotek izbrise. Čas trajanja je privzeto 0, kar pomeni da traja le za čas seje, če zelimo piskotek shraniti dlje moramo navesti čas izrazen v Unix timestamp. To vrednost dobimo s pomočjo time() funkcije in pristejemo stevilo sekund kako dolgo zelimo da se piskotek ohrani. Četrti argument - pot je absolutna pot, kjer zelimo da je piskotek dosegljiv. Privzeto je "/", kar pomeni da je dosegljiv po celi strani, lahko pa določimo pot npr. "/anketa" in bo piskotek viden le znotraj tega direktorija in v poddirektorijih. Naslednji argument - domena, določimo če zelimo da je piskotek dosegljiv na vseh poddomenah ali samo na trenutni domeni. Sesti argument pove ali se naj piskotek nastavi le ob HTTPS povezavi.

Naslednji primer nastavi piskotek za naslednjih 10 sekund. Prikazano je tudi kako piskotek izbrisemo. Najprej pogledamo če piskotek se ni nastavljen. Takrat izračunamo čas za naslednjih 10 sekund določimo neko vrednost in le to dodelimo piskotku. V primeru če je piskotek ze nastavljen dalje preverimo ali ga zelimo izbrisati. To preverimo s preprostim načinom kjer pogledamo ali je dana GET vrednost nastavljena. Takrat nastavimo vrednost piskotka na prazni niz, čas pa vzamemo iz preteklosti, prav tako dodamo pot piskotka. Namreč dobra praksa je, da piskotek brisemo z istim stevilom argumentov kot smo ga nastavili. Pri brisanju moramo upostevati tudi to, da se sedaj izbrisan piskotek se vedno nahaja v polju $_COOKIE in ga v njem ne bo se le ob naslednjem obisku strani, tako da moramo v nasem primeru izbrisati tudi to vrednost s pomočjo unset(). Na koncu izpisemo vrednost piskotka, če je le ta nastavljena.

<?php

if ( ! isset( $_COOKIE['test'] ) ) else if ( isset( $_GET['del'] ) )

echo @$_COOKIE['test'];

?>

Pozorni pri nastavljanju piskotkov kot ostalih glav moramo biti na to da pred nastavljanjem le teh ne izpisemo 0, kajti ko enkrat posljemo neko vsebino strani obiskovalcu ne moremo več poslati glav sporočila, v kateri so med drugim tudi piskotki. Zato moramo paziti, da vse piskotke nastavimo oz. izbrisemo preden karkoli izpisujemo (s pomočjo echo ali print ipd). Sicer se da to resit na "grdi" način s pomočjo t.i. output bufferinga, ampak je ta način meni neprijeten, saj se mora najprej cela stran sprocesirat in se sele na to poslje obiskovalcu. Dobra tehnika je, da ze na začetku poskrbimo za piskotke preden začnemo sploh kaj izpisovat. Če zelimo preveriti ali so bile glave ze poslane in ze izpisujemo vsebino strani, lahko to storimo s funkcijo headers_sent(). Na tem mestu bi se omenil, da se v piskotek lahko shranijo le skalarne vrednosti, polja in objekti pa ne. Če zelimo shraniti slednje jih moramo serializirati. PHP ima ze vgrajeno funkcijo, ki nam poenostavi serializacijo. Funkcija serialize() sprejme kot argument polje ali objekt in nam vrne serializiran niz. Tega lahko brez problema shranimo v piskotek. Za deserializacijo pa uporabimo funkcijo unserialize(), katera sprejme ta niz in vrne serializiran objekt oz. polje.

Seje

Seja je podoben mehanizem kot piskotki, glavna razlika je da se piskotek shrani pri obiskovalcu in se za vsak obisk strani posilja na streznik, seja pa je shranjena na strezniku. Vsaka seja je ima svoj unikatni ID, s katerim se določi komu pripada. Ta ID se lahko prenasa preko piskotka, GET ali POST metode. Poglejmo si enostaven primer kako shranimo vrednost v sejo, jo izpisemo in izbrisemo.

<?php

session_start();

if ( !isset( $_SESSION['test'] ) ) else

?>

Vidimo, da je delo s sejami podobno kot s piskotki. Omembe vredna razlika je med drugim tudi, da lahko nastavljamo in spreminjamo vrednosti seje tudi ze po tem ko smo kaj izpisali obiskovalcu. Namreč seja je shranjena na strezniku in se lahko vrednosti spreminjajo ob vsakem času izvajanja skripte. Druga prednost sej je shranjevanje polij in objektov, brez da jih serializiramo, kajti v seji so vsi podatki serializirani kot eno polje, tako da to za nas naredi ze sam PHP. Vendar ni vse tako lepo kot je videt. Potrebno je paziti če je morebiti bila seja ugrabljena. To pomeni če je mogoče tretja oseba, na kakrsen koli način prisla do ID-ja seje. S tem bi se lahko prijavilo npr. kot administrator, brez da bi sploh kdo opazil. Zato je potrebno preverjanje ali je obiskovalec res tisti za koga se izdaja. Poglejmo si primer.

<?php

session_start();

$hash = md5( $_SERVER['REMOTE_ADDR'] . '-' . $_SERVER['HTTP_USER_AGENT'] );

if ( !isset( $_SESSION['hash'] ) ) else if ( $_SESSION['hash'] != $hash )

if ( !isset( $_SESSION['test'] ) ) else

?>

Na začetku smo dodali preverjanje uporabnikovega IP naslova in tip brskalnika. Namreč v 99% kadar obiskovalec brska po strani, ta dva podatka ostaneta nespremenjena. Na začetku iz teh dveh podatkov naredimo hash, ki ga prvič shranimo v sejo, v primeru ko je ta podatek ze shranjen v seji ga preverimo ali se ujema s trenutnim hash-em. Če se ne ujemata pomeni da je prislo do spremembe. Namesto da izpisemo mozen napad, lahko npr. uporabnika odjavimo in mu ponudimo ponovno prijavo in tako bo nasa skripta varna pred ugrabitvijo seje.

Prej smo ze omenili da se ID seje prenasa iz ene strani na drugo s pomočjo piskotka ali preko URL-ja. Kadar pa so v brskalniku onemogočeni piskotki, se seja lahko prenasa le preko GET ali POST metode. PHP ima za to vgrajeno konstanto, katera vsebuje ime in ID seje.

<?php

session_start();

$hash = md5( $_SERVER['REMOTE_ADDR'] . '-' . $_SERVER['HTTP_USER_AGENT'] );

if ( !isset( $_SESSION['hash'] ) ) else if ( $_SESSION['hash'] != $hash )

if ( !isset( $_SESSION['test'] ) ) else

?>

Ime te konstante je SID. PHP sam ugotovi ali je ID seje bil prenesen preko piskotka ali URL-ja. V primeru prenosa preko URL-ja ima konstanta SID vrednost, ki jo lahko dodamo vsakemu URL naslovu, kot v zgornjem primeru. V primeru da se ID seje prenese preko piskotka pa je SID prazen niz.

Primerjava piskotkov in sej po mojem mnenju prevaga v korist sej. Saj se vrednosti shranjujejo na strezniku in je ze pretok podatkov manjsi med streznikom in obiskovalcem, za shranjevanje polij in objektov ne rabimo posebej serializirat, prav tako je velikost podatkov praktično neomejena, kar ne velja za piskotke. Pri sejah je potrebno le paziti da seje ni mogoče ugrabiti in da ne izgubimo ID seje.

Objektno programiranje

Vsi do sedaj napisani programi so bili pisani v proceduralnem načinu. PHP nam omogoča tudi objektno programiranje. Gre za način programiranja, ki bi naj bil bolj priblizan načinu razmisljanja človeka. Vse stvari si predstavljamo kot objekte. Te lahko nadgradimo in jim dodajamo nove moznosti ali stare spreminjamo in dograjujemo. Podrobno v objektno programiranje se ne bi spusčali ampak si bomo pogledali objektno programiranje v PHP-ju. Primeri bodo pisani za PHP 5, kajti v verziji 4 ni bilo "pravega" objektnega programiranja.

<?php

class Novice

public function brisi( $id )

public function beri ( $id )

class DB_Novice extends Novice

public function brisi( $id )

public function beri( $id )

$oNews = new DB_Novice();

echo $oNews->beri( 0 );

?>

V zgornjem primeru imamo dva razreda. Razred Novice določa tri metode. Za dodajanje, brisanje in prikazovanje novice. Vendar je ta razred splosen. Iz njega izpeljemo razred DB_Novice, kateri ima popolnoma iste metode, le njihova implementacija je drugačna, saj je razred namenjen hranjenju novic v bazi. Na koncu ko smo implementirali razreda smo naredili en objekt, to je primerek razreda, DB_Novice. Nato smo prozli metodo beri, ki nam vrne neko vrednost, ki smo jo izpisali.

Toliko na kratko o razredih za danes. Naslednjič si bomo ogledali vso moč razredov v PHP-ju. Od dedovanja, abstraktnih razredov, vmesnikov in se mnogo več.


Document Info


Accesari: 1735
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2024 )