Ta teden imamo v načrtu tri teme: piškotke, seje in nalaganje datotek.
Kaj so piškotki (ang. cookies)? S pomočjo piškotkov lahko spletna stran na uporabnikov disk shrani kakšne informacije, recimo forum lahko shrani uporabnikovo uporabniško ime in geslo in si ga tako zapomni.
Branje in pisanje piškotkov je zavarovano tako, da lahko določena spletna stran (domena) dostopa samo do svojih.
Piškotke lahko preberemo kjerkoli v PHP kodi, zapišemo pa jih lahko samo na začetku skripte.
Piškotke ustvarimo s funkcijo setcookie(), ki ima 5 bolj koristnih argumentov, od katerih najpogosteje uporabljamo prve 3:
bool setcookie (string name [, string value [, int expire [, string path [, string domain]]]])
1. name je ime določenega piškotka, recimo "uporabniskoIme" - prek tega imena nato dostopamo do njegove vrednosti
2. value je vrednost piškotka, recimo "Marko"
3. expire
je oznaka, kdaj piškotek poteče. Da bi piškotek
potekel po enem letu, tukaj uporabnimo izraz
time() + 31536000
4. path pomeni pot, kjer je piškotek veljaven - če tukaj navedemo niz "/", bo piškotek dostopen iz vseh podmap
5. domain pomeni domene, kjer je piškotek veljaven - če bi tukaj navedli niz ".stamcar.com", bi bil piškotek dostopen iz vseh poddomen (www.stamcar.com, stamcar.com, www2.stamcar.com,...)
Funkcija vrne true, če je bilo nastavljanje piškotka uspešno, drugače pa false.
Primer programčka, kjer kot piškotek nastavimo uporabnikovo ime in imamo tudi možnost brisanja piškotka:
<?php
if ($_POST['akcija'] == "Poslji") {
if (setcookie("ime",$_POST['ime'],time()
+ 31536000) == true) {
print
"Piskotek je bil uspesno nastavljen!<br />";
} else {
print
"Prislo je do tezav pri nastavljanju piskotka!<br />";
}
}
if ($_POST['akcija'] == "Izbrisi piskotek") {
if (setcookie("ime","",time()-60000) ==
true) {
print
"Piskotek je bil uspesno izbrisan!<br />";
} else {
print
"Prislo je do tezav pri brisanju piskotka!<br />";
}
}
?>
<form method="post">
Ime: <input type="text" name="ime"/> <input
type="submit" name="akcija" value="Poslji"/>
</form>
<form method="post"><input type="submit"
name="akcija" value="Izbrisi piskotek"/>
</form>
Pomembno je, da funkcijo setcookie() kličemo pred izpisom HTML kode strani s print ali izven bloka <?php ... ?>, drugače bo PHP javil napako.
Do piškotkov lahko dostopamo prek 1D polja $_COOKIE, kjer kot ključ navedemo name piškotka. Če bi recimo želeli izpisati zgornje ime, bi programu na dnu dodali še
<?php
print $_COOKIE['ime'];
?>
Session cookies (piškotki seje) so v bistvu zelo podobni piškotkom, le da potečejo, ko uporabnik zapre brskalnik in da se njihove vrednosti shranjujejo na strežniku, uporabnik pa v obliki piškotka dobi samo posebno kodo, s katero dostopa do njih.
Seje so neke vrste globalne spremenljivke, do katerih lahko dostopamo iz različnih PHP skript.
Primer uporabe je recimo košarica v spletni trgovini ali prijava v nek zaščiten sistem.
Zamislimo si primer, kjer nam uporabnik prek metode post pošlje svoje uporabniško ime in geslo. V primeru pravilne prijave želimo uporabniku omogočiti dostop do administracijskih strani na čim lažji in varnejši način.
Za začetek bomo poklicali funkcijo session_start() (ki ne sprejme argumentov) in tako nakazali začetek seje. Tudi to funkcijo moramo podobno kot setcookie() poklicati nekje na začetku skripte:
<?php
session_start();
Ko je seja enkrat pognana, lahko v 1D polju $_SESSION ustvarjamo nove vrednosti ali pa jih beremo.
Naš program dopolnimo s preverjanjem uporabniškega imena in gesla in v primeru pravilnega para spremenljivki z imenom prijavljen določimo vrednost true:
if ($_POST['username'] == "Marko" &&
$_POST['password'] == "dododo") {
$_SESSION['prijavljen']
= true;
print "Uspesno ste prijavljeni v
sistem!";
} else {
print "Napacno uporabnisko ime in/ali
geslo!";
}
?>
Sedaj bi v vseh skriptah, ki zahtevajo prijavo, na začetku dodali tole:
<?php
session_start();
if (!$_SESSION['prijavljen']) {
die("Nimate dostopa do te strani!");
}
// tukaj pride koda, do katere imajo dostop samo prijavljeni uporabniki
?>
V primeru, da v spremenljivki $_SESSION['prijavljen'] ni vrednost true oz. ni nastavljena, bomo poklicali ukaz die(), ki preneha z izvajanjem skripte in izpiše sporočilo, ki mu ga podamo kot argument.
Odjavo (logout) iz sistema bi lahko naredili tako, da s funkcijo unset() izničimo spremenljivko $_SESSION['prijavljen'].
PHP podpira nalaganje datotek iz obrazcev prek metode post.
Primer kode za obrazec (bodi pozoren na enctype):
<form method="post" enctype="multipart/form-data">
<input type="file" name="datoteka"/><br
/>
<input type="submit" name="akcija" value="Nalozi"/>
</form>
Ko datoteko naložimo, se na strežniku shrani v začasen direktorij.
Njene podatke dobimo v 2D polju $_FILES. Prvi ključ je name iz obrazca, druga pa določena lastnost datoteke.
Primer kode za izpis 4 najbolj pomembnih podatkov (dodamo jo recimo pod kodo obrazca):
<?php
if ($_POST['akcija']) {
print $_FILES['datoteka']['name']."<br />";
print $_FILES['datoteka']['tmp_name']."<br />";
print $_FILES['datoteka']['size']."<br />";
print $_FILES['datoteka']['type']."<br />";
}
?>
$_FILES['datoteka']['name'] je originalno ime datoteke, recimo avatar.png.
V $_FILES['datoteka']['tmp_name'] je shranjena začasna pot do datoteke na strežniku, od koder jo moramo nato premakniti v našo mapo.
$_FILES['datoteka']['size'] nam pove velikost datoteke v bajtih, $_FILES['datoteka']['type'] pa MIME tip datoteke.
Ko je datoteka naložena na strežniku, jo lahko s funkcijo move_uploaded_file() iz začasnega direktorija premaknemo v direktorij, kjer se nahaja naša skripta. Funkcija sprejme dva argumenta - prvi je pot do začasne datoteke, ki jo dobimo iz ['tmp_name'], drugi pa nova lokacija datoteke - če tu navedemo samo ime brez poti (ki ga dobimo v ['name'], se bo datoteka pojavila v isti mapi kot naša skripta.
Namesto zgornje kode za nalaganje datotek napišimo
<?php
if ($_POST['akcija']) {
move_uploaded_file($_FILES['datoteka']['tmp_name'],"C:\\Program
Files\\xampp\htdocs\\" . $_FILES['datoteka']['name']);
}
?>
in že imamo preprost sistem za nalaganje datotek.
Opomba: pri XAMPPu moramo pri premikanju navesti pot C:\\Program Files\\xampp\htdocs, drugače se bodo datoteke premaknile v C:\\Program Files\\xampp. Dvojne poševnice so obvezne.
Če bi želeli omejiti velikost datoteke na 1 MB in samo na JPEG slike, bi zgornjo kodo spremenili v tole:
<?php
if ($_POST['akcija']) {
if ($_FILES['datoteka']['size'] > 1048576) {
unlink($_FILES['datoteka']['tmp_name']);
die("Datoteka je prevelika!");
}
if ($_FILES['datoteka']['type'] != "image/jpeg" AND
$_FILES['datoteka']['type'] != "image/pjpeg") {
unlink($_FILES['datoteka']['tmp_name']);
die("Datoteka ni tipa JPEG!");
}
move_uploaded_file($_FILES['datoteka']['tmp_name'],"C:\\Program
Files\\xampp\htdocs\\" . $_FILES['datoteka']['name']);
}
?>
Dodali smo preverjanje parametra ['size'] (1 MB = 1024 bajtov * 1024 = 1048576) - v primeru, da velikost presega to vrednost, izbrišemo začasno datoteko in javimo napako, prav tako pa smo dodali še preverjanje MIME tipa datoteke, ki mora biti image/jpeg ali image/pjpeg (dva najpogostejša MIME tipa JPEG datotek), drugače pa ponovimo postoptek zgoraj.
Poljubno število datotek lahko naložimo tako, da HTML kodo obrazca spremenimo v
<form method="post"
enctype="multipart/form-data">
<input type="file" name="fajl[]"/><br
/>
<input type="file" name="fajl[]"/><br />
<input type="file" name="fajl[]"/><br />
<input type="file" name="fajl[]"/><br />
<input type="file" name="fajl[]"/><br />
<input type="submit" name="akcija" value="Nalozi"/>
</form>
- pri imenu smo dodali [], s čimer nakažemo, da gre za polje datotek. Pri kodi za nalaganje pa si pomagamo s tole zanko:
<?php
for ($i = 0; $i < count($_FILES['fajl']['name']); $i++) {
if ($_FILES['fajl']['name'][$i] != "") {
$pot = "C:\\Program Files\\xampp\htdocs\\";
move_uploaded_file($_FILES['fajl']['tmp_name'][$i],$pot.$_FILES['fajl']['name'][$i]);
}
}
?>
Kjer s count($_FILES['fajl']['name']) dobimo število prostorčkov za datoteke v obrazcu, nato pa za vsak prostorček v 3D polju s stavkom if preverimo, če ima datoteka določeno ime - če ga ima, je v tem prostorčku datoteka bila naložena in jo lahko iz začasnega (temp) direktorija premaknemo v mapo $pot.
Piškotki, seje in nalaganje datotek so zelo močne funkcije PHPja, popolnoma obvladati jih pa zahteva kar precej časa in zagnanosti, zato se prepričaj, da te osnove dobro razumeš. Domače naloge te že čakajo ;)