Phpdhemysqlperfillestare
Phpdhemysqlperfillestare
Tahir Hoxha
This book is for sale at http://leanpub.com/phpdhemysqlperfillestare
This version was published on 2015-03-14
This is a Leanpub book. Leanpub empowers authors and publishers with the Lean Publishing
process. Lean Publishing is the act of publishing an in-progress ebook using lightweight tools and
many iterations to get reader feedback, pivot until you have the right book and build traction once
you do.
2015 Tahir Hoxha
Prmbajta
Parathnie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Hyrje n PHP . . . . . . .
Arkitektura klient/server
Web servert . . . . . . .
HTTP . . . . . . . . . .
1. sht PHP? . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
2
2
2
2
3
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
9
9
9
10
10
10
10
11
12
Strukturat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Strukturat e degzimit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Strukturat e iteracionit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
16
22
MVC (Model-View-Controller) .
Modelet . . . . . . . . . . . .
Pamjet . . . . . . . . . . . . .
Kontrollert . . . . . . . . . .
Kontrolleri . . . . . . . . . . .
Modeli . . . . . . . . . . . . .
Funksioni pr thirrjen e View .
Views . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
24
25
26
26
27
28
29
29
GET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
POST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
PRMBAJTA
FILES . . . . . . . . . . . . . . . . . . . .
Gabimet . . . . . . . . . . . . . . . . .
MAX_FILE_SIZE . . . . . . . . . . . .
post_max_size dhe upload_max_filesize
Kontrollimi i MIME type t fajllit . . .
Bartja e fajllave n destinacionin final .
.
.
.
.
.
.
34
35
37
37
38
39
Procesimi i formularve . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
43
Cookie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
Sesionet . . . . . . . . . . . . . . . . . .
Fillimi i nj sesioni . . . . . . . . . .
Prfundimi i sesionit . . . . . . . . .
Session hijacking . . . . . . . . . . .
Menaxhimi i sesioneve nga databaza .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
46
49
49
49
49
Funksionet . . . . . . . . . . . . . . . . . . . .
Built-in functions . . . . . . . . . . . . . . .
User-defined functions . . . . . . . . . . . .
Anatomia e funksionit . . . . . . . . . . . .
Dallimi ndrmjet argumentit dhe parametrit
Jetgjatsia e variablave brenda funksioneve
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
50
50
51
52
54
55
PHP extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
58
Composer . . . . . . . . . . . . . . . . . .
PEAR . . . . . . . . . . . . . . . . . .
Packagist . . . . . . . . . . . . . . . . .
Composer . . . . . . . . . . . . . . . .
Inkludimi i pakove n aplikacionin ton
.
.
.
.
.
59
59
59
60
62
Regular Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
64
AJAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
XMLHttpRequest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
65
65
Virtual hosts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
66
.
.
.
.
.
70
70
71
72
73
75
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
PRMBAJTA
Instalimi i Twig . . . . . . . . . .
Inicializimi i Twig . . . . . . . . .
Prdorimi i Twig npr kontroller
Thirrja e nj template/view . . . .
Struktura e nj view fajlli . . . . .
Variablat n Twig . . . . . . . . .
Strukturat n Twig . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
75
76
77
77
78
79
79
Kriptimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Hash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
81
81
MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
87
mysqli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Konektimi me databaz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Funksionet kryesore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
88
88
89
Shembuj me mysqli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Leximi i t dhnave nga nj SQL tabel . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Prepared statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
93
93
93
95
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
113
113
113
113
113
113
114
114
114
114
114
114
PRMBAJTA
for . . . . . . . . . .
header() . . . . . . .
if...else . . . . . .
ignore_user_abort()
ini_set() . . . . . .
intval() . . . . . . .
isset() . . . . . . .
mktime() . . . . . . .
nl2br() . . . . . . .
phpinfo() . . . . . .
print_r() . . . . . .
session_start() . .
setcookie() . . . . .
strip_tags() . . . .
strlen() . . . . . . .
strval() . . . . . . .
substr() . . . . . . .
time() . . . . . . . .
trim() . . . . . . . .
urlencode() . . . . .
var_dump() . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
114
114
114
115
115
115
115
115
115
115
115
116
116
116
116
116
116
117
117
117
117
Parathnie
Ky manual sht prmbledhje e materialeve t ndryshme t prdorura n kurset e PHP/MySQL n
NSH ORBIS (Prizren), Innovation Centre Kosova (Prishtin) dhe SmartCode (Prishtin).
Materiali sht ende i pasistemuar dhe i pakompletuar sepse libri sht n procesin e prgatitjes,
ndrkoh q sht vshtir t parashikohet se kur libri mund ta marr formn e vet finale.
Jan t mundshme gabime t ndryshme si n tekst, ashtu edhe n kod, por do t prpiqem q ato ti
eliminoj apo ti sjell n minimum.
Vshtirsia m e madhe me nj libr pr PHP sht mungesa e terminologjis pr termet nga IT,
n veanti t atyre specifike pr Web. Prandaj, n raste t caktuara jan prdorur fjal n gjuhn
angleze, t cilat do t zvendsohen me ato shqipe kur t gjendet prkthimi i prshtatshm i tyre.
Libri i dedikohet fillestarve, por aty-ktu temat jan di m t avancuara, gj q nuk do t duhej
t konsiderohej si mangsi sepse mund t hyjn n pun kur lexuesi ta ket arritur nj nivel m t
lart t njohurive n PHP programim.
Libri sht duke u prgatitur me prdorimin e Markdown, q e bn formatimin e faqeve m pak
t sofistikuara se ato n ndonj tekst procesor. Ky kufizim sht i imponuar nga shtpia botuese
Leanpub, pr shkak se prej momentit t ruajtjes s dokumenteve deri n publikim n Web, i gjith
procesi sht i automatizuar. Pr shkak t automatizimit t procesit, mund t ndodh q ndonj pjes
e ndonj faqeje t mos dal e formatuar n mnyr korrekte n momentin e publikimit, por gjithsesi
do t bj prpjekje q edhe ky lloj i gabimeve t eliminohet.
N kt faz, libri ofrohet gratis dhe mund t shpndahet lirisht.
I mirpres kshillat, sugjerimet, kritikat dhe korigjimet e gabimeve npr tekst.
Autori
Kontakti:
Email: [email protected]
Facebook: /hoxha.tahir
Twitter: @Alkimisti
Hyrje n PHP
Arkitektura klient/server
Arkitektura klient/server sht nj model q vepron si aplikacion i shpndar (distributed application),
i cili bn ndarjen e detyrave ndrmjet ofruesve t resurseve apo shrbimeve (servert) dhe krkuesve
t atyre shrbimeve (klientt).
Klientt dhe servert komunikojn nprmjet rrjetit kompjuterik n pajisje t ndryshme harduerike.
Serveri sht host n t cilin ekzekutohen nj apo m tepr programe speciale, q kan pr detyr
ti ndajn resurset me klientt.
Klienti e inicon sesionin e komunikimit me serverin, i cili sht n pritje t krkesave nga klientt.
Web servert
Dedikim parsor i Web serverve sht distribuimi i Web faqeve me krkesn e klientve, duke u
bazuar n protokolin HTTP (Hypertext Transfer Protocol).
Kjo prfshin drgimin e dokumenteve t tipeve t ndryshme, imazheve, audio/video fajllave, etj.
Shfletuesi (browser, user agent) e inicon komunikimin duke drguar krkes pr nj resurs specifik
duke prdorur HTTP. N kt serveri i prgjigjet duke ia drguar prmbajtjen e krkuar apo duke
kthyer raportin e gabimit, nse ai resurs nuk sht gjetur.
Resursi i kthyer mund t jet fajll real q ekziston n diskun e serverit, por edhe mund t jen t
dhna t gjeneruara n mnyr dinamike.
Prve drgimit t t dhnave, serveri sht n gjendje edhe t pranoj t dhna nga klientt.
Kjo rndom ka t bj me pranimin e prmbajtjes s ndonj formulari, apo t fajllave t atashuar.
Shum Web server, prkrahin gjuht skriptuese si jan PHP, ASP, Perl, Python, etj.
Kto m tepr prdoren pr krijimin e HTML dokumenteve dinamike, q gjenerohen aty pr aty
(on-the-fly).
HTTP
HTTP funksionet jan protokole krkes-prgjigje (request-response) n modelin klient-server.
Klienti ia drgon serverit krkesn n form t HTTP mesazhit krkues (HTTP request message).
Hyrje n PHP
Serveri nga ana e vet, do prgjigjeje t kthyer ia shoqron edhe raportin (response message) q i
drgohet klientit.
Ai raport prmban statusin mbi realizimin e krkess, dmth nse sht kompletuar apo jo dhe ka
mund t jet arsyeja e gabimit. Raporti se gjithka ka vajtur n rregull:
1
HTTP/1.1 200 OK
1. sht PHP?
PHP sht shkurtes nga Personal Home Page. I krijuar n vitin 1994 nga Rasmus Lerdorf, me qllim
t prcjelljes s vizitave n Web faqen q e prmbante rezymen e tij. Kuptimi q i jepet sot sht
PHP: Hypertext Preprocessor.
sht gjuh programore, e dedikuar n veanti pr zhvillimin e Web aplikacioneve. Duke qen gjuh
pr prpilimin e skriptave q ekzekutohen n server, programet e shkruara n PHP nuk kompajlohen,
por interpretohen gjat ekzekutimit. Efekti kryesor negativ i ksaj qasjeje sht se aplikacionet,
gjegjsisht skriptat, ekzekutohen m ngadal se ato t kompajluara, si jan aplikacionet e shkruara
n gjuht programore C apo C++. N kt aspekt, PHP sht i krahasueshm me JavaScript, me nj
dallim thelbsor se JavaScript ekzekutohet brenda shfletuesit, ndrsa PHP ekzekutohet ekskluzivisht
n server.
Meqense shfletuesit i njohin vetm kodet e prpiluara n HTML, CSS dhe JavaScript, edhe rezultati
q gjenerohet nga nj PHP skript duhet t jet n njrn nga gjuht e prmendura. Kodi i PHP mund
t futet brenda kodit HTML, ku sht n gjendje ti shtoj faqes ekzistuese kodin HTML t gjeneruar
n mnyr programore.
Pra, prdorimi i PHP sht shum specifik: gjenerimi i HTML kodit q insertohet n nj HTML
faqe ekzistuese. Me PHP nuk mund t shkruhen aplikacione t pavarura q rezultojn n nj .exe
aplikacion.
Kodi n PHP ekzekutohet n server, jo tek klienti (shfletuesi). Pr dallim nga JavaScript, ekzekutimi
i kodit n PHP nuk varet nga modeli apo versioni i shfletuesit t caktuar.
Skripta ruhet n server dhe shfletuesit i drgohet vetm rezultati i ekzekutimit t kodit, n form t
dokumentit t formatuar n HTML/CSS.
Pr kt shkak, skripta n PHP nuk mund t shihet n shfletues me View Source, gj q
sht avantazh n aspektin e mbrojtjes s prons intelektuale, por edhe n aspektin e siguris s
aplikacionit.
Sipas Bacon J. (2007), PHP ofron nj gjuh programuese solide dhe mir t definuar q prfshin
prkrahjen pr programim t orientuar n objekte (object-orientated programming - OOP), strukturat
logjike, manipulimet me fajlla, aritmetik, e shumka tjetr.
Gjuha PHP sht e ngjashme semantikisht me at t gjuhve skriptuese kombinuar me lehtsit q
ofron gjuha C.
Hyrje n PHP
Performanca
Skriptat e shkruara n PHP tregojn peformanca m t mira se ato n gjuht tjera, n radh t par
pr nga shpejtsia e ekzekutimit.
Versioni 5.0 i PHP sht rishkruar nga zeroja, me ka sht prmirsuar dukshm n aspektin e
shpejtsis.
Jan n dispozicion akcelerator t ndryshm pr tia rritur performancat e prgjithshme.
Portabiliteti
PHP-n e gjejm n shum sisteme operative: UNIX, Microsoft Windows, Mac OS, dhe OS/2.
PHP aplikacionet e shkruara n nj platform munden me aspak apo fare pak prshtatje t
ekzekutohen n cilndo pratform tjetr.
Lehtsia e prdorimit
Kodi i hapur
PHP ka kod t hapur, q dmth se programuesit mund ta modifikojn kodin sipas nevojs.
Kodi i hapur jep mundsin q zhvilluesit e aplikacioneve tu gjejn gabimet, tia raportojn
at komunitetit, ti korigjojn, etj.
Mund t merret pa pages.
Nuk krkon harduer t shtrenjt.
Mundson reduktimin e kostos s zhvillimit t aplikacioneve, duke mos e dmtuar n asnj
aspekt.
Hyrje n PHP
Mbshtetja e komunitetit
PHP sht gjuh programore q gzon mbshtetje t nj komuniteti t gjer t Web zhvilluesve
nga e gjith bota.
Si rezultat e puns me mbshtjetje nga komuniteti, sht:
PEAR (PHP Extension and Application Repository, http://pear.php.net/), dhe
PECL (the PHP Extension Community Library, http://pecl.php.net/).
Kto dy librari prmbajn ekstensione t shumta q i shtojn PHP-s funksione t reja, t cilat
e lehtsojn n mas t madhe procesin e programimit.
Zgjerimi i gjuhs
PHP lejon q programuesit t zhvillojn shtojca t ndryshme pr kt gjuh, duke e zgjeruar
funksionalitetin e tij.
Kto shtojca mundsojn q sot t mund t kryhen:
Manipulime me imazhet (GIF, JPEG, and PNG),
Zhvillimi i komunikimit me postn elektronike,
T zhvillohen Web servise t bazuara n protokolet REST dhe SOAP, etj.
PHP mund tu qaset bibliotekave n C, klasave t Java dhe COM objekteve.
Hyrje n PHP
Procesi i ekzekutimit
Vizitori e hap shfletuesin dhe e shnon adresn (URL) e faqes s dshiruar.
N baz t adress s shnuar, shfletuesi ia drgon nj krkes (HTTP request) Web serverit
prkats.
Web serveri, me t pranuar t krkess, e gjen n server fajllin prkats n PHP.
Prmbajtja e fajllit t zgjedhur prcillet tek PHP interpreteri.
PHP intepreteri e analizon fajllin, duke ekzekutuar kodet e shkruara n PHP (kodi ndrmjet ).
Brenda ktyre dy etiketave mund t ket kode:
Pr t kryer analizn e t dhnave hyrse,
Pr komunikim me databazn,
Pr kryerjen e llogaritjeve t ndryshme, etj.
Pasi t jet kryer ekzekutimi i kodeve t shkruara n PHP, Web serveri e drgon faqen e
gjeneruar drejt shfletuesit t vizitorit, me ka prmbyllet procesi.
<html>
<head>
<title>Leksioni 1</title>
</head>
<body>
<h1>Ky tekst sht brenda HTML</h1>
<?php
echo <p>Ky sht drguar nga PHP</p>;
?>
</body>
<html>
Rreshtat 1, 2, 3, 4, 5, 6, 10, 11 jan t shkruara n HTML, ndrsa rreshtat 7, 8 dhe 9 jan n PHP. Kodi
rezultues n HTML do t duket kshtu:
Hyrje n PHP
1
2
3
4
5
6
7
8
9
<html>
<head>
<title>Leksioni 1</title>
</head>
<body>
<h1>Ky tekst sht brenda HTML</h1>
<p>Ky sht drguar nga PHP</p>
</body>
<html>
Kod t ktill do t shohim kur zgjedhim p.sh. opsionin View Source n shfletuesin Google Chrome.
Kodi PHP nuk shihet me View Source, sepse paraprakisht sht transformuar n HTML n server,
pr tu drguar pastaj n shfletues.
Bazuar n shembullin e msiprm, mund t nxjerren disa prfundime:
1. HTML dokumentin q brenda vetes prmban PHP kod, duhet ta ruajm me ekstensionin
.php dhe jo .html, si bhet rndom. N baz t ktij ekstensioni, Web serveri vendos nse
ai dokument duhet t drgohet i pandryshuar drejt shfletuesit (rasti me .html), apo duhet
paraprakisht t drgohet n PHP parser pr tu transformuar n HTML dokument.
2. Kodi q shkruhet n PHP, fillon me etiketn . Thn ndryshe, e vazhdon m tutje rrjedhn e
atij HTML dokumenti. Si rezultat prfundimtar do ta kemi nj HTML dokument, prmbajtja e
t cilit sht modifikuar n mnyr dinamike. Mund t shprehemi edhe n mnyr t thjesht:
HTML + PHP = HTML.
3. Konstrukti gjuhsor echo e kryen nj detyr t thjesht: gjith tekstin q sht brenda
thonjzave e drgon n ekran, gjegjsisht ia bashkangjet at HTML dokumentit dhe at
pikrisht n pozitn ku sht shnuar PHP kodi. Meqense n shembullin ton, PHP kodi sht
i shnuar pas </h1> dhe prfundon para </body>, edhe HTML kodi rezultues do t vendoset
pikrisht brenda ksaj zone:
4. do rresht programor n PHP duhet t prfundoj me pikpresje (;). Pr dallim nga JavaScript,
ku pikpresja sht opsionale, n PHP ajo sht e domosdoshme dhe mungesa e pikpresjes n
ndonj rresht mund t rezultoj n gabime t paparashikueshme gjat ekzekutimit t skripts.
5. Dokumenti q prmban PHP kod nuk ekzekutohet si programet tjera aplikative duke klikuar
n ikonn prkatse n desktop apo Start menu, por ekzekutohet duke e shnuar URL-n e
tij n shfletues. N raste t caktuara, nj PHP skript mund t startohet edhe nga rreshti
komandues.
6. N rastin konkret, URL-ja sht: http://localhost/leksioni1.php, ku http://localhost/ paraqet
adresn e serverit lokal, ndrsa leksioni1.php sht vet emri i skripts. N rast se kt skript
e kopjojm n Web server t kompanis s hostingut, localhost zvendsohet me domainin
prkats, p.sh.: http://faqjaime.com/leksioni1.php
7. Rezultat i ekzekutimit t PHP skripts konkrete do t jet nj HTML dokument, t cilit do ti
shtohen HTML kode shtes, pr ta formuar nj trsi q i drgohet shfletuesit pr ta paraqitur
n ekran.
Hyrje n PHP
Skripta e msiprme nuk kryen ndonj gj t veant, sepse shtimin e paragrafit me nj fjali do t
mund ta realizonim duke koduar drejtprsdrejti n HTML. Fuqia e vrtet e PHP vie n shprehje
ather kur nevojitet ti shtohet faqes ndonj informat e karakterit variabil, gjegjsisht dinamik, si
jan p.sh. t dhnat meteorologjike, rezultatet sportive, kurset valutore, postimet nga forumet apo
rrjetat sociale, produktet e porositura n nj e-dyqan, etj. N t tilla situata, prmbajtja e faqes nuk
paraqitet e njjt tek t gjith vizitort e sajtit, por do t jet e ndryshueshme varsisht nga dinamika
e ndryshimeve t t dhnave si dhe nga zgjedhjet q i bn vet vizitori.
Pr ti paraqitur t dhnat e tilla, PHP komunikon me Sistemin pr Menaxhimin e Databazave
Relacionale (RDBMS), ku m s shpeshti e gjejm t prdorur sistemin MySQL. Kshtu, PHP e
siguron logjikn e aplikacionit, ndrsa MySQL i siguron t dhnat t cilat do t prpunohen pr
tu paraqitur m pas si faqe HTML n ekranin e vizitorit nprmes shfletuesit. PHP interpreteri nuk
vepron i pavarur, por mbshtetet n serviset q i ofron nj Web server. Pra, minimumi i nevojshm
pr ta krijuar nj ambient pr zhvillimin e aplikacioneve dinamike konsiston n instalimin e Web
serverit, PHP interpreterit dhe nj sistemi pr menaxhimin e databazave.
Me nj ndryshim fare t vogl n kodin e msiprm, do t jemi n gjendje t fitojm nj t dhn
dinamike si sht data aktuale, e cila do t ndryshoj vet me kalimin n dat t re. Prderisa tek
HTML faqet statike, pr ndryshime t ktilla nevojitet modifikimi i dats brenda HTML dokumentit
dhe publikimi i srishm i atij dokumenti n Web server, tek prdorimi i PHP kodit kjo detyr
eliminohet sepse sistemi e kryen vet n mnyr automatike.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html>
<head>
<meta charset="utf-8">
<title>Leksioni 1b</title>
</head>
<body>
<h1>Ky tekst sht brenda HTML</h1>
<p>
<?php
echo date("d.m.Y");
?>
</p>
</body>
<html>
AMP stack
Edhe pse sht i mundur instalimi i secilit prej komponentave ve e ve, pr shkak t konfigurimit
t ndrsjellt q nuk sht i leht pr fillestar, mund t zgjedhur t instalojm nj AMP stack.
AMP sht akronim pr Apache MySQL Perl/PHP/Python. Kto jan pako softuerike q
prmbajn kombinime t ndryshme t programeve.
LAMP pr Linux
WAMP pr Windows
MAMP pr Macintosh
10
XAMPP
AMPPS
Zend Server Community Edition
Bitnami MAMPStack, LAMPStack, WAMPStack, RubyStack, DjangoStack, JRubyStack, LAPPStack,
WAPPStack, MAPPStack, TomcatStack, JBoss, Solr, NodeJS (Open Source License, Apache 2,
PHP 5.x,MySQL 5, Python 2.4)
AMPPS
MAMP
DAMP
Bitnami MAMPStack (Open Source License, Apache 2, PHP 5.x, MySQL 5, Python 2.4)
XAMPP for OS X
AMPPS
EasyPhp
Bitnami WAMP Stack
WAMPServer
XAMPP
Uniform Server
UwAmp
WT-NMP
WPN-XM Server Stack
IDE
Komerciale:
1.
2.
3.
4.
5.
6.
7.
8.
9.
Pa pages:
1. Aptana Studio (http://www.aptana.com/products/studio3)
2. Eclipse PHP PDT (http://www.eclipse.org/pdt/downloads/)
3. Komodo Edit (http://www.activestate.com/komodo-edit)
11
12
N kt rast, pr testimin e aplikacionit vetm duhet t startohet shfletuesi dhe t shnohet URL-ja
prkatse.
Qasja e dyt konsiston n krijimin e nj folderi n diskun lokal pr aplikacionin dhe nj folder tjetr
brenda Web serverit pr testim.
Para do testimi, nevojitet q folderi i aplikacionit t drgohet (upload) n folderin prkats n Web
server. N Dreamweaver dhe n disa FTP programe mundsohet sinkronizimi i folderve.
Sinkronizimi:
Krahasimi i dats/kohs s modifikimit t dokumenteve ndrmjet folderit t aplikacionit dhe folderit
prkats n Web server. Dokumentat q kan data m t reja barten n folderin e Web serverit.
13
Nprmes CLI SAPI (Command Line Interpreter / Server Application Programming Interface)
Metoda e par sht standarde dhe rezultati shfaqet n dritaren e Web shfletuesit.
Me metodn e dyt, skriptat ekzekutohen nga rreshti komandues dhe po aty edhe shfaqen rezultatet.
<?php
echo Skripta ime e par!';
?>
14
Regullat themelore
Kodi n PHP fillon me <?php ose <?
Mbaron me ?>
do PHP statement duhet t prfundoj me pikpresje
Rreshtat e zbrazt injorohen
Komentet njrreshtor fillojn me //
Komentet shumrreshtor fillojn me /* ndrsa mbarojn me */
Komentet injorohen gjat procesit t gjenerimit t rezultateve, gjegjsisht gjat interpretimit
Variablat
1
2
3
4
5
6
<?php
$a = 2;
$b = 5;
$c = $a * $b;
echo "<p>".$a."*".$b."=".$c."</p>";
?>
Tipet e variablave
Integer: Numr i plot. Varsisht nga sistemi operativ, diapazoni i vlerave ndryshon, por
rndom kemi t bjm me -2 miliard deri n +2 miliard.
Floating point number: Numr, rndom jo i plot, q prfshin edhe vendet pas presjes
dhjetore, psh 3.14, 4439,2343. Njihet si real number ose float.
Character string: Seri e karaktereve. Nuk ka limit sa i prket gjatsis, gjegjsisht numrit t
karaktereve
Boolean: Vlera TRUE (Sakt) ose FALSE (pasakt). Prdoret n analizat logjike.
Matricat
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$ditet = array("E hn", "E mart", "E mrkur", "E enjte", "E premte", "E shtun\
", "E diel");
echo "<ul>";
foreach($ditet as $dita)
{
echo "<li>".$dita."</li>";
}
echo "<ul>";
?>
15
Strukturat
Sikurse gjuht tjera programore, edhe PHP posedon struktura me an t t cilave ndrtohet logjika
e nj aplikacioni. Ktu bjn pjes:
Strukturat e degzimit
Struktura e iteracionit
Strukturat e degzimit
Rrjedha normale e ekzekutimit t rreshtave programor sht rrjedh lineare: pas ekzekutimi t
rreshtit t par, interpreteri kalon n t dytin, n t tretin, e kshtu me rradh deri n fund t
programit.
Ekzekutimi sekuencional i rreshtave programor sht i prshtatshm n rastet kur duhet t
ekzekutohet nj seri e urdhrave t prsritshme, psh:
Konketohu me server
Lexoji t dhnat nga nj tabel
Paraqiti t dhnat e lexuara n form tabelare
Nj mnyr e ktill e organizimit t kodit presupozon se ekzekutimi nuk do t ndrpritet n asnjrin
prej rreshtave, gj q nuk sht konform kushteve reale.
Pr shembull, nse programi nuk konektohet me server, far kuptimi do t kishte leximi i t dhnave
nga njt tabel? Apo, si do t paraqiteshin t dhnat n form tabelare nse paraprakisht programi
ka dshtuar n leximin e t dhnave nga tabela?
Duke u bazuar n kt shembull t thjesht, nxjerrim konkluzionin dhe programi yn duhet t ket
njfar intelegjence, e cila do t dij t bj n t dy situatat: edhe kur paraqitet gabimi, edhe kur
nuk paraqitet.
Tash, e modifikojm pak logjikn e algoritmit:
Strukturat
17
ifelse
Kushti mund t kthej vetm nj nga dy prgjigjet e mundshme: TRUE ose FALSE. TRUE nse kushti
sht plotsuar, FALSE nse ai kusht nuk sht plotsuar.
1
2
3
4
5
6
7
8
9
10
<?php
$emri = $_POST['emri'];
if ($emri == "")
{
echo "<p>Nuk e keni shenuar emrin</p>";
}
echo "<p>Ju faleminderit!</p>";
?>
Strukturat
1
2
3
4
5
6
7
18
|
|
|\
| |
|/
|
|
Shpesh kemi nevoj q t caktojm veprime t ndryshme pr TRUE dhe FALSE. Pr kt prdorim
else:
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$emri = $_POST['emri'];
if ($emri == "")
{
echo "<p>Nuk e keni shenuar emrin</p>";
}
else
{
echo "<p>Ju faleminderit!</p>";
}
?>
Ktu, nse kushti plotsohet, jepet raporti Nuk e keni plotsuar emrin, e n t kundrtn - shfaqet
teksti Ju faleminderit!. Pra, pr dallim nga shembulli paraprak, kur n t dy situatat na shfaqej
falnderimi, tash na shfaqet vetm kur e kemi plotsuar emrin.
1
2
3
4
5
6
7
8
|
|
/\
/ \
|
|
\
/
\/
|
Analizat q i bjm me if...else, mund t jen edhe m komplekse se kaq, varsisht prej logjiks
q duam t implementojm n program.
Pr shembull, mund t dshirojm q ti analizojm dy kushte njkohsisht.
19
Strukturat
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$emri = $_POST['emri'];
$mosha = (int) $_POST['mosha'];
if ($emri == "" && $mosha == 0)
{
echo "<p>Nuk e keni shenuar emrin ose moshn, ose asnjrn!</p>";
}
else
{
echo "<p>Ju faleminderit!</p>";
}
?>
Ktu analizuam dy kushte prnjher, emri dhe moshn. Cilado t jet e paplotsuar, programi do
t raportoj mbi gabimin.
Operatori logjik && q i lidh kto dy kushte, do t jap rezultat TRUE, vetm nse jan plotsuar t
dy kushtet.
TRUE && TRUE = TRUE TRUE && FALSE = FALSE FALSE && TRUE = FALSE FALSE && FALSE
= FALSE
Ndonjher mund t duhet q t plotsohet vetm njri prej dy kushteve, pr t rezultuar krejt
shprehja si e sakt. Psh.
1
if ($x == 2 || $y ==1)
$cmimi = 12.50;
ku vlera 12.50 i bartet variablit $cmimi, pra nuk bhet krahasimi se a sht mimi baras me 12.50.
Pr krahasime prdoren operatort vijues:
Strukturat
1
2
3
4
5
6
7
20
==
===
<
<=
>=
!=
!==
Nse analiza jon sht m komplekse, pra nuk na mjafton vetm krahasimi se a sht nj shprehje
e sakt apo e pasakt, mund t konstruktojm degzime m t detajuara.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
if ($x < 2)
{
//
}
elseif ($x > 5 )
{
//
}
else
{
//
}
?>
Kushti i par plotsohet nse $x sht m i vogl se 2, ndrsa kushti i dyt - nse sht m i madh
se 5. Kushti i tret plotsohet pr t gjitha vlerat e $x prej 2 deri 5. Vlera e $x sht vetm nj vler,
ndrsa dgzime jan tre, varsisht prej kushteve t cakura.
Nj blloku t ifelse mund t fusim ifelse tjera, t cilat bjn krahasime t tjera, m komplekse.
21
Strukturat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
if ($x < 2)
{
if ($y > 3)
{
if ($z == 5)
{
//
}
}
}
else
{
//
}
?>
switch
Struktura switch rndom gjen zbatim kur analizojm vlera nga nj list e paracaktuar e vlerave.
Psh, nse analizojm numrin e muajit, ai mund t jet nga 1 deri 12, numri rendor i dits s javs
mund t jet nga 1 deri 7, etj.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$dita = 5;
switch ($dita)
case 1:
echo "E hene ";
break;
case 2:
echo "E marte ";
break;
case 3:
echo "E merkure ";
break;
case 4:
echo "E enjte ";
break;
case 5:
22
Strukturat
19
20
21
22
23
24
Urdhri break prdoret pr ndarjen m vete t secilit rast (case). Nse psh. pas case 1 do t largohet
break, ather kur $dita=1, do t paraqitej raporti E hene E marte, pra sikur t ishin plotsuar edhe
case 1, edhe case 2.
Sado komplekse t jet nj struktur e degzuar, ato gjithmon shpiejn teposht rrjedhs s
ekzekutimit t programit. Pra, pas plotsimit (apo mosplotsimit) t nj kushti, rreshtat pasardhs
vijn n radh pr ekzekutim.
Strukturat e iteracionit
Pr zgjidhjen e ndonj problemi, na nevojitet q programi ta prsris nj bllok t rreshtave
programor. Kt e quajm iteracion. Iteracioni pra do t zbatohet sa her kemi nevoj q nj bllok
rreshtash t prsritet disa her.
for
Struktura ciklike for prdoret kur na nevojitet prsritja e nj blloku pr nj numr fiks t herave.
Prsritja e nj blloku 10 her:
1
2
3
4
5
6
<?php
for ($i=1; $i<=10; $i++)
{
echo "<p>".$i;
}
?>
Ajo ka prsritet 10 her sht rreshti echo brenda bllokut t shnuar me {}.
$i=1 prcakton vlern fillestare.
$i<=10 prcakton deri n ciln vler do t shkoj iteratori, n kt rast deri n 10
$i++ e rrit vlern e $i pr 1 n secilin iteracion. Nse kemi nevoj t prdorim ndonj vler
tjetr, psh. q numri t rritet pr 3, ather shnojm: $i = $i +3, me rast numrimi do t
shkonte: 1, 4, 7, 10, pra do t prsritej 4 her, e jo 10.
Strukturat
23
Nse nisemi nga nj vler m e madhe dhe duam t lshohemi n nj vler m t vogl,
ather prdorim $i, ose pr inkremente t tjera $i = $i - 3
Brenda nj blloku mund t vendosim aq rreshta sa ka nevoj. Brenda nj blloku mund t vendosim
edhe struktura t tjera.
Le ta gjenerojm tabeln e shumzimit:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
echo "<table border='1'>";
for ($x=1; $x<=10; $x++)
{
for ($y=1; $y<=10; $y++)
{
$z = $x * $y;
echo "<tr><td>".$x."</td><td>*</td><td>".$y."</td><td>=</td><td>".$z."</td><\
/tr>";
}
}
echo "</table>";
?>
while
Struktura while bn prsritjen e nj blloku derisa vlen nj kusht. N momentin q kushti nuk
plotsohet (kthen vlern FALSE), cikli ndrpritet.
1
2
3
4
5
6
7
8
<?php
$x = 1;
while ($x < 10)
{
echo "<p>".$x;
$x++;
}
?>
Kushti ktu sht q $x t jet m i vogl se 10. Pr aq koh sa vlen ky kusht, cikli do t prsritet.
Kur $x e arrin vlern 10, blloku m nuk do t ekzekutohet.
MVC (Model-View-Controller)
N fillet e veta. PHP nuk ka qen asgj m shum se nj templating engine - ka mundsuar futjen
e t dhnave dinamike brenda nj HTML dokumenti statik. Me t dhna dinamike nnkuptohet t
dhnat q llogariten aty pr aty, si data, ora, numruesi i vizitorve, ndonj rezultat i kalkuluar, etj.
PHP mund t intermiksohet me HTML fare leht: kudo n HTML dokument ku dshirojm t
shfaqim t dhna dinamike, e hapim bllokun e PHP me <?php, dhe kudo tjetr ku dshirojm t
vazhdojm me HTML, e mbyllim bllokun e PHP me ?>.
Mund t vendosim sa t duam shkputje t tilla brenda nj HTML dokumenti, serveri do t dij
ciln pjes ta drgoj ashtu si sht, e ciln ta prpunoj para drgimit, gjithnj duke u bazuar n
tag-at e PHP: <?php dhe ?>.
Nse PHP na nevojitet brenda nj numri t vogl t HTML dokumenteve dhe at pr veprime t
thjeshta, kjo qasje do ta kryej punn e vet pa kurrfar problemi.
Por, cilido aplikacion m serioz do t prmbaj me dhjetra apo qindra HTML dokumente, ku
PHP nuk do t prdoret vetm pr ta llogaritur dhe shfaqur nj t dhn dinamike. Aplikacionet
komplekse krkojn kod kompleks, pr aspekte t ndryshme t nj Web sajti:
Sistemin pr autentifikim dhe autorizim
Komunikimin me sistemin pr menaxhimin e databazave relacionale
Kryerjen e analizave t ndryshme pr ta prcaktuar rrjedhn e ekzekutimit t programit (if,
switch)
Prsritjen e blloqeve t rreshtave programor (for, foreach, while, dowhile)
Gjenerimin e fajllave t ndryshm (tekst, JSON, HTML, XML, etj.)
e shum e shum veprime t tjera. Pra, nj PHP aplikacion nuk sht vetm nj mjet pr paraqitjen
e t dhnave dinamike n nj Web faqe, por qenka nj trsi programesh t mirfillta q zgjidhin
probleme nga m t ndryshmet.
Nse kodi i PHP do t intermiksohej me HTML kodin e faqes, do t ishte tejet e vshtir t
mirmbahej kodi sepse nuk sht i lexueshm, nse shkruhet copa-copa n vende t ndryshme t
HTML dokumentit.
N rastet kur kemi skripta t tilla t prziera me HTML dhe PHP (e diku edhe me SQL),
sht e vshtir pr t mos thn e pamundshme puna ekipore e programuesve, dizajnuesve dhe
administratorve t databazave. Kjo sepse n t njjtin fajll duhet t punojn s paku 3 persona dhe
at me kusht q secili t jet n gjendje ta kuptoj kodin e tjetrit. Sepse, nse Web dizajneri nuk
kupton mir kodin n PHP, programuesi nuk e njeh aq mir HTML-n, administratori i databazs
MVC (Model-View-Controller)
25
mund t mos e njoh asnjrn, ather leht do t vijn n situata q ta dmtojn kodin e njri-tjetrit.
Apo edhe thjesht q kodi i njrit mos ta ndjek logjikn e kodit t tjetrit.
Problemet e cekura kan sjell nevojn pr ndarjen e kompetencave n trsi t veanta, ku
programuesi nuk ndrhyn n HTML, dizajneri merret vetm me aspektin e dizajnit, ndrsa
administratori merret me krijimin dhe optimizimin e krkesave q i drgohen SQL serverit.
Kshtu, secili do ta jap maksimumin n fushn e vet, ndrkoh q sht i siguruar q nuk do t ket
nevoj t ndrhyj n kodin e kolegut tjetr.
MVC sht paradigm q implementohet n rastet kur dshirojm ti separojm 3 trsit kryesore
t nj aplikacioni:
Modelet (Models). Administratori i databazs.
Pamjet (Views). Web dizajnuesi, front-end developer.
Kontrollert (Controllers). Programuesi, back-end developer.
Modelet
Modelet jan skripta/programe brenda t cilave do t vendoset kodi q merret me leximin dhe
shkrimin e t dhnave n sistemin pr menaxhimin e databazave. Modelet nuk jan t kufizuara
vetm n drgimin e SQL query, por te aty mund t bjm edhe procesim t t dhnave, q pastaj
rezultatet e fituara tia drgojn kontrollerit q e ka krkuar at shrbim.
Pr shembull, jepet nj SQL krkes, lexohen t dhnat e fituara, pastaj n baz t atyre t dhnave
ndrtohen SQL krkesa t tjera pr t ardhur deri te nj rezultat prfundimtar. Rezultati prfundimtar
i kthehet kontrollerit q e ka krkuar at.
Rndom, rezultati kthyes do t jet:
Nj rresht i lexuar nga databaza (varg njdimensional), psh. t dhnat mbi nj antar
Nj tabel e lexuar nga databaza (varg dydimensional), psh. lista e produkteve
Prgjigje n formn TRUE ose FALSE, q indikojn nse ekziston apo nuk ekziston ndonj e
dhn
Numr, q tregon pr shembull sa rreshta e plotsojn nj kriter
sht mir q modelet t mos ken side-effects, pra q vlerat e variablave t tyre t mos ndryshojn
vlerat e variablave me emra t njjt n pjest tjera t aplikacionit. Kjo pr shkak se flasim pr 3
developer q punojn njkohsisht, secili n pjesn e vet t puns. Nse ndonjri do t prdorte
variabl me emrtim t njjt si tjetri, psh. edhe autori i modelit edhe ai i kontrollerit, secili pr nevoja
t programit t vet prdor variablin $rezultati, mund t ndodh q diku n rrjedhn e ekzekutimit
t programit, vlera e njrs ta zvendsoj vlern e tjetrs dhe me kt t ndodhin situata ku sht
vshtir t gjendet ku sht gabimi.
MVC (Model-View-Controller)
26
Pr kt arsye, modelet dhe kontrollert organizohen n form t funksioneve, apo edhe m mir: n
form t klasave. Me kt sigurohet q variablat e funksioneve t ndryshme (apo metodat e klasave
t ndryshme), t koekzistojn t pavarura, pa marr parasysh emrin e njjt.
Autori i modelit mund ta ket prdorur nj variabl me emrin $rezultati, por vlera kthyese e
funksionit (apo metods) s tij do t kthej nj rresht, apo nj tabel t lexuar nga tabelat e databazs,
kshtu q vlera e variablave lokale nuk do ti ekpozohen kontrollerit fare, dhe n kt mnyr nuk
do t ket kolizion ndrmjet tyre, pra edhe n rastet kur n kontroller ekziston nj variabl me emr
t njjt.
Pamjet
Pamjet (views) jan fajlla t shkruara kryesisht n HTML/CSS/JavaScript. Ato nuk prmbajn ose
fare pak prmbajn PHP kod. PHP do t prdoret nse nevojitet ndonj logjik m komplekse, prtej
asaj t vetm paraqitjes s rezultateve. Kryesisht do t prdoren strukturat pr degzim (if) dhe ato
pr iteracion (while).
Nse kemi prdorur ndonj templating engine si Twig apo Smarty, nuk do t kemi fare nevoj pr
PHP, sepse ato posedojn pseudo-tagat e vet pr degzim dhe iteracion.
Kontrollert
Ndonse t numruar n fund, pr nga rndsia jan t part. E tr logjika e aplikacionit vendoset
brenda kontrollerve. Ktu bjn pjes veprime t shumta:
Leximi dhe analizimi i URL-s (router)
Leximi i komponentve t ndryshm t aplikacionit, varsisht se ka krkohet n kontrollerin
e caktuar. Njri kontroller mund t krkoj drgimin e emailave, tjetri gjenerimin e JSON
fajllave, tjetri leximin e nj Excel tabele, etj.
Drgimi i krkest modelit pr t dhna nga databaza
Analiza e rezultateve t kthyera nga modeli, pr procesim t mtejm
Kryerja e llogaritjeve t ndryshme
Drgimi i t dhnave finale n nj template (view), etj.
Pra, mund ta imagjinojm kontrollerin n pozit qendrore, prej nga fillon ekzekutimi i aplikacionit
ton. Sa her do t ket nevoj pr t dhna nga databaza, kontrolleri do ti drgoj krkes modelit.
Sa her q kontrolleri do t duhet ti tregoj rezultatet e nj procesi, ato t dhna do tia drgoj nj
template-je.
MVC, si plan arkitektural i nj aplikacioni, mund t ket edhe ndrlidhje tjetr ndrmjet komponenteve.
Dikush praktikon q relacioni t jet Controller - Model - View, pra q t dhnat e manipuluar nga
27
MVC (Model-View-Controller)
kontrolleri t drgohen n model, e pastaj modeli ti drgoj n pamje. Pra, kufiri nuk sht tepr
strikt dhe mund t aplikohen qasje t ndryshme.
N PHP framework si CodeIgniter dhe Laravel, praktikohet skema e spjeguar n tekst, pra kontrolleri
e prmban logjikn e aplikacionit, modeli t dhnat, ndrsa pamja sht hapi i fundit, q bn vetm
paraqitjen e rezultateve n browser, me aspak ose fare pak procesim.
MVC pattern
Kontrolleri
produkti.php
MVC (Model-View-Controller)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
include("modelet.php");
include("func.php");
$id = (isset($_GET['id'])) ? intval($_GET['id']) : 0;
$result = getproduct($id);
$data = array();
if (!empty($result))
{
$data['cmimi'] = $result['cmimi'];
$data['tvsh'] = $data['cmimi']*16/100;
$data['cmimitvsh'] = $data['cmimi']+$data['tvsh'];
$data['emri'] = $result['emri'];
$data['kodi'] = $result['kodi'];
template("produkti", $data);
}
else
{
$data['raporti'] = "Nuk ekziston ky produkt";
template("raporti", $data);
}
Modeli
modelet.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$dbcon = @mysqli_connect("localhost", "root", "", "ickshop") OR die("Nuk munda t\
e konektohem. Gabimi: ".mysqli_connect_error());
mysqli_set_charset($dbcon, 'utf8');
function getproduct($n) {
global $dbcon;
$sql = "SELECT * FROM products WHERE Pro_ID = '$n' LIMIT 1";
$rez = mysqli_query($dbcon, $sql);
if (mysqli_num_rows($rez))
{
while($row = mysqli_fetch_array($rez, MYSQLI_ASSOC))
{
$rreshti = array(
'kodi' => $row['Pro_Code'],
28
MVC (Model-View-Controller)
17
18
19
20
21
22
23
24
25
26
<?php
function template($view, $data)
{
extract($data);
include($view."_view.php");
}
Views
produkti_view.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
</head>
<body>
<div>
<p>Emertimi i produktit: <?=$emri; ?></p>
<p>Kodi i produktit: <?=$kodi; ?></p>
<p>Cmimi pa TVSH: <?=$cmimi; ?></p>
<p>TVSH: <?=$tvsh; ?></p>
<p>Cmimi me TVSH: <?=$cmimitvsh; ?></p>
29
MVC (Model-View-Controller)
15
16
17
30
</div>
</body>
</html>
raporti_view.php
1
2
3
4
5
6
7
8
9
10
11
12
13
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
</head>
<body>
<div>
<?=$raporti; ?>
</div>
</body>
</html>
GET
Karakteristik e metods GET sht se t dhnat q duhet t barten n faqen tjetr, i bashkangjiten
URL-s s asaj faqeje tjetr.
Kjo bhet duke ia shtuar linkut nj query string, n t cilin do ti rendisim variablat dhe vlerat e
tyre prkatse.
Psh. nse dshirojm ta prcjellim vlern e ID-s s nj lajmi t krkuar n nj portal, ather query
string do ta ket kt form:
?id=5
duke e br linkun t duket kshtu:
1
http://localhost/lajmet.php?id=5
http://localhost/lajmet.php?id=5&category=2
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~:/?#[]@!$&'()*\
+,;=
POST
Metoda POST, sikurse edhe metoda GET, prdoret pr drgimin e t dhnave nga nj skript n
tjetrn.
Pr dallim nga GET q t dhnat i ekspozon n URL, metoda POST i drgon t dhnat duke ia
bashkangjitur HTTP krkess s radhs. Kjo bn q vlerat t mos shfaqen n URL dhe me kt t
mos ruhen n historin e browser-it.
Pikrisht pr shkak se t dhnat nuk i bashkangjiten URL-s, metoda POST sht e prshtatshme pr
drgimin e t dhnave sensitive, si sht fjalkalimi. N munges t lidhjes SSL, kjo mbrojtje sht
efikase vetm nga shikimet e t tjerve n ekran, apo t atyre q e shfletojn historin e browser-it.
Metoda POST ka edhe nj avantazh tjetr: lejon drgimin e nj vllimi m t madh t t dhnave. Se
sa do t jet gjatsia m e madhe e t dhnave, caktohet me direktivn post_max_size n php.ini:
1
post_max_size = 50M
Fushat, vlerat e t cilave duhet t drgohen me POST, duhet ta ken atributin name. Vlerat e drguara
me POST, lexohen nga superglobali $_POST.
regjistro.php
POST
1
2
3
4
5
6
7
33
<?php
$titulli = $_POST['titulli'];
$mesazhi = $_POST['mesazhi'];
echo "<h1>".$titulli."</h1>";
echo "<blockquote>".$mesazhi."</blockquote>";
?>
T dhnat e lexuara nga POST duhet t konsiderohen si potencialisht t ndotura, prandaj ato n
fillim validohen (validate) dhe sanitizohen (sanitize), pr tu prcjell n procesim t mtejm n
program.
1
2
3
4
5
6
7
<?php
$titulli = filter_var($_POST['titulli'], FILTER_SANITIZE_STRING);
$mesazhi = filter_var($_POST['mesazhi'], FILTER_SANITIZE_STRING);
echo "<h1>".$titulli."</h1>";
echo "<blockquote>".$mesazhi."</blockquote>";
?>
FILES
PHP mundson ngarkimin (upload) t fajllave nga disku lokal n Web server. Pr t drguar fajlla,
e ndrtojm nj formular t ktill:
1
2
3
4
Kjo do t mundsoj q skripta pranuese ta shoh kt fush si nj varg (array) dhe jo si variabl t
thjesht. Secili prej antarve t vargut do t prmbaj informatat pr fajllin prkats. T dhnat e
fajllave lexohen nga superglobali $_FILES.
Ta japim fillimisht shembullin me procesimin e nj fajlli:
dergo.php
1
2
3
<?php
var_dump($_FILES)
?>
Rezultati:
35
FILES
1
2
3
4
5
6
7
8
array (size=1)
'fajlli' =>
array (size=5)
'name' => string 'd2.jpg' (length=6)
'type' => string 'image/jpeg' (length=10)
'tmp_name' => string 'C:\wamp\tmp\php266D.tmp' (length=23)
'error' => int 0
'size' => int 62176
Gabimet
Pr kt arsye, gjat procesimit t fajllit t drguar, ne do ti cekim kushtet. Fillimisht verifikojm
nse sht shfaqur gabim gjat ngarkimit.
FILES
1
2
3
4
5
6
7
8
9
10
11
12
13
36
<?php
$fajlli = $_FILES['fajlli'];
if ($fajlli['error'] == 0)
{
// Procesojm m tutje
}
else
{
echo "Gabim gjat drgimit t fajllit!";
}
?>
Pra, me procesim t fajllit do t shkojm vetm nse kodi i gabimit sht 0, pra nse nuk sht shfaqur
asnj gabim.
Gabimet i kan edhe konstantat korresponduese t tyre, kshtu q n vend t 0 mund ta prdorim
konstantn UPLOAD_ERR_OK. Lista komplete:
UPLOAD_ERR_OK. Vlera 0. Nuk sht shfaqur asnj gabim.
UPLOAD_ERR_INI_SIZE. Vlera 1. Madhsia e tejkalon madhsin maksimale t definuar n
direktivn upload_max_filesize n php.ini.
UPLOAD_ERR_FORM_SIZE. Vlera 2. Madhsia e fajllit e tejkalon vlern e caktuar me MAX_FILE_SIZE n formular.
UPLOAD_ERR_PARTIAL. Vlera 3. Fajlli sht ngarkuar pjesrisht.
UPLOAD_ERR_NO_FILE. Vlera 4. Nuk sht ngarkuar asnj fajll, dmth prdoruesi nuk e ka
zgjedhur asnj fajll n formular.
UPLOAD_ERR_NO_TMP_DIR. Vlera 6. Mungon folderi i prkohshm. Kjo caktohet me direktivn
upload_tmp_dir n php.ini.
UPLOAD_ERR_CANT_WRITE. Vlera 7. Fajlli nuk mund t ruhet n diskun e serverit.
UPLOAD_ERR_EXTENSION. Vlera 8. Ndonj nga ekstensionet e PHP ka shkaktuar ndrprerjen e
ngarkimit t fajllit.
Kriteri i dyt mund t jet madhsia. Nuk do t lejojm fajllat m t mdhenj se 1 Mb.
FILES
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
37
<?php
$fajlli = $_FILES['fajlli'];
if ($fajlli['error'] == 0)
{
if ($fajlli['size'] > 1048576)
{
// Procedo me tutje
}
else
{
echo "Fajlli teper i madh. Lejohet maks. 1 Mb.";
}
}
else
{
echo "Gabim gjat drgimit t fajllit!";
}
?>
MAX_FILE_SIZE
Madhsia maksimale e fajllit mund t caktohet edhe n HTML formular, duke e prdorur konstantn
MAX_FILE_SIZE, e cila definohet brenda nj input fushe, e cila fush duhet t shnohet para fushs
pr upload.
1
2
3
4
5
Vlera e ksaj fushe pastaj lexohet n skript dhe bhet krahasimi i madhsis s fajllit dhe ksaj
vlere. Pr shkaqe sigurie, kjo praktik nuk duhet t konsiderohet e mir sepse, si e dijm, n t
gjith browsert e rinj, vlerat e atributeve t HTML jan t manipulueshme, pra prdoruesi malicioz
mund ta ngris vet limitin. Prandaj, gjithmon vlerm maksimale e caktojm me nj numr n
skript.
38
FILES
Direktiva post_max_size cakton madhsin maksimale t t gjitha fushave tekstuale dhe t fajllit q
ngarkohet. Pra, nse pr shembull post_max_size=10M. ndrsa upload_max_filesize=7M, ather
pr fushat tekstuale jan n dispozicion 3 Mb.
application/octet-stream.
text/plain. Fajll tekstual.
text/html. Fajll q prmban HTML.
image/jpeg. Fotografi e tipit JPG/JPEG.
image/png. Fotografi e tipit PNG.
image/gif. Fotografi e tipit GIF.
application/pdf. Dokument i tipit PDF.
application/msword. Dokument i Wordit, i tipit .DOC.
application/vnd.openxmlformats-officedocument.wordprocessingml.document. Dokument
<?php
$fajlli = $_FILES['fajlli'];
if ($fajlli['error'] == 0)
{
if ($fajlli['size'] <= 1048576)
{
if ($fajlli['type'] == "image/jpeg" || $fajlli['type'] == "image/png")
{
// Procedo me tutje
}
else
{
echo "Lejohen vetem tipet JPG/JPEG dhe PNG";
}
}
else
{
39
FILES
19
20
21
22
23
24
25
26
Pra, pr ndrtimin e linqeve npr faqe nuk prdoret path absolut /home/site/public_html/assets/images/',
por prdoren path q jan relativ ndaj public_html si /assets/images/foto1.jpg.
Vizitort e faqes nuk kan, as nuk guxojn t ken qasje n foldert q jan mbrapa, sipr apo
posht folderit public_html (ose public, www, htdocs,, varsisht nga serveri).
Folderi ku do t vendosen fotografit duhet t ken write permission, pra sistemi operativ duhet
t lejoj q n at folder t vendosen fajlla. Kjo n Linux rregullohet me komandn chmod:
1
40
FILES
Nse nuk realizohet me 755, provojm me vlerat 775 dhe 777, si opsion i fundit.
N Windows, pra aty ku e bjm zhvillimin dhe testimin e aplikacionit n mnyr lokale - nse kemi
br login si administator, nuk do t kemi nevoj pr t caktuar kto privilegje.
Prndryshe, e ndjekim kt procedur:
Nse folderi nuk i ka permissions adekuate, do t shfaqet raporti i gabimit n momentin kur skripta
jon tenton ta vendos fajllin atje.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
$fajlli = $_FILES['fajlli'];
if ($fajlli['error'] == 0)
{
if ($fajlli['size'] <= 1048576)
{
if ($fajlli['type'] == "image/jpeg"
|| $fajlli['type'] == "image/png")
{
$f = move_uploaded_file($fajlli['tmp_name'],
"assets/images/".$fajlli['name']);
if ($f)
{
echo "Fajlli u ruajt me sukses";
}
else
{
echo "Deshtoi ruajtja e fajllit";
}
}
}
else
{
echo "Fajlli teper i madh. Lejohet maks. 1 Mb.";
41
FILES
27
28
29
30
31
32
33
}
}
else
{
echo "Gabim gjat drgimit t fajllit!";
}
?>
"assets/images/".$fajlli['name']
<?php
$fajlli = $_FILES['fajlli'];
if ($fajlli['error'] == 0)
{
if ($fajlli['size'] <= 1048576)
{
if ($fajlli['type'] == "image/jpeg" || $fajlli['type'] == "image/png")
{
$filepath = "assets/images/";
$filename = $fajlli['name'];
while (file_exists($filepath.$filename))
{
$ext = pathinfo($filename, PATHINFO_EXTENSION);
$basename = pathinfo($filename, PATHINFO_BASENAME);
$name = substr($filename, 0, -strlen($ext)-1);
$filename = $name."_".rand(1, 10000).".".$ext;
42
FILES
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
}
if (move_uploaded_file($fajlli['tmp_name'], $filepath.$filename))
{
echo "Fajlli u ruajt me sukses";
}
else
{
echo "Deshtoi ruajtja e fajllit";
}
}
}
else
{
echo "Fajlli teper i madh. Lejohet maks. 1 Mb.";
}
}
else
{
echo "Gabim gjat drgimit t fajllit!";
}
?>
Kjo skript do t verifikoj nse fajlli me emr dhe tip t njjt tashm ekziston n folder. Nse
ekziston, emri t tij i shtohet shenja _ (underline), dhe m pas nj numr i rastsishm ndrmjet 1
dhe 10000. Kshtu, nuk do t ket gjasa q nj fajll ta mbuloj tjetrin.
Natyrisht, ktu mund t prdorim edhe zgjidhje t tjera. Nj prej tyre sht me prdorimin e ID-s
s produktit n emrin e fajllit, duke u siguruar kshtu se nuk do t ket dy fajlla me emr t njjt,
sepse ID-t jan unike pr produktet. Nse kemi m shum se nj fotografi pr produkt, mund t
shtojm numrin rendor 1, 2, 3
Leximi i ID-s s INSERT-it t fundit n mysqli bhet me funksionin mysqli_insert_id().
Nse psh. ID-ja e INSERT-it t fundit sht 456, ather mund t konstruktojm emrtime si vijon:
456.jpg
product-456.jpg
product-456-1.jpg
product-456-2.jpg
product-456-3.jpg
Me nj zgjidhje t ktill, nuk do t kemi nevoj t verifikojm nse fajlli ekziston sepse e dim se
nuk ka dy produkte q kan ID t njjt
Procesimi i formularve
Formulart jan dritare t aplikacionit ton ndaj ambientit t jashtm.
Cookie
Cookie mundson ruajtjen e t dhnave q duhet t persistojn ndrmjet faqeve (skriptave) t
ndryshme.
Metodat POST dhe GET nuk jan praktike pr ruajtjen e t dhnave persistuese, meq pr bartjen
e vlerave krkojn linqe me query string (n rastin e GET), apo ndrtimin e formularve (n rastin
e POST), gj q shton shkalln e ndrlikueshmris s aplikacionit e me kt edhe mundsit pr
gabime.
Cookie i ruan vlerat q duhet t persistojn n fajlla special q menaxhohen nga browseri.
Sintaksa:
1
2
3
4
5
6
Shembull
1
setcookie('company', 'Apple');
N kt shembull bazik, company sht antar i vargut $_COOKIE, me vlern Apple. Kur kalojm
n nj skript tjetr t aplikacionit, kt vler do ta shfaqim me:
1
2
3
<?php
echo $_COOKIE['company'];
?>
setcookie('company', $company_name);
ku vlera e atij variabli sht prcaktuar m heret, psh. sht lexuar nga formulari, databaza apo
burime t tjera.
Cookie
45
Jetgjatsia e cookie
Si parametr i tret sht jetgjatsia e cookie, ku si vler shnohet UNIX timestamp i kohs kur
cookie duhet t skadoj. Kjo m s lehti mund t shnohet si time() + numri i sekondave. Psh. nse
dshirojm q cookie t jetoj 7 dit, shnojm:
1
Sesionet
E meta kryesore e protokolit HTTP sht pamundsia pr ta ruajtur gjendjen, gjegjsisht pr
ti ruajtur vlerat e variablave gjat kalimit nga nj skript n tjetrn. Kjo mangsi deri diku
kompensohet si vijon:
duke ia bashkangjitur vlerat e dshiruara URL-s q thirret (GET),
duke i drguar vlerat me an t nj formulari (POST),
duke i ruajtur vlerat n nj fajll lokal (COOKIE) pr ti bartur pastaj n server
N t tri rastet flitet pr bartje t vlerave, e jo pr ruajtjen e tyre. Gjat bartjes s atyre vlerave, sht
i mundur edhe ndryshimi i tyre, me apo pa qllim.
Pr aplikacione m komplekse, ku duhet t ruhet gjendja, gjegjsisht zgjedhjet q i ka br nj vizitor
(si n rastin e nj e-commerce aplikacioni), asnjra prej metodave t cekura nuk ofrojn fleksibilitet
t mjaftueshm.
Metoda GET bie posht sepse do t duhej q n do URL t shtohet query string me vlerat e
variablave, di q n nj moment mund t jet i pamenaxhueshm nga ana e skripts pr shkak
t kompleksitetit. Ve ksaj, vlerat n URL jan t manipulueshme, gj q do ta cenonte integritetin
e aplikacionit. Imagjinoni nse n URL vendoset mimi dhe vizitori e ndryshon at.
Metoda POST sht jopraktike pr shkak se n do faqe do t duhej t futeshin formular, t cilat
fillimisht i lexojn vlerat e dshiruara, pr tia bartur pastaj skripts s thirrur.
COOKIE poashtu i ka mangsit e veta q e bjn t paprshtatshm pr prdorim n t gjitha
aspektet e nj aplikacioni kompleks. Ato mund t jen t manipulueshme sepse t dhnat ruhen
n nj fajll lokal, ku sulmuesi mund ti ndryshoj t dhnat sipas nevojs, pr tiu prezantuar Web
serverit si ndonj vizitor tjetr. Cookiet, nse nuk jan ndrmarr masat e duhura, jan t lexueshme
nga JavaScript, duke e br kshtu aplikacionin t ekspozueshm ndaj XSS.
Zgjidhja m e mir ofrohet me SESSION, ku mekanizmi pr bartjen dhe ruajtjen e vlerave sht di
m kompleks, por m i kompletuar dhe m i sigurt.
Sesioni startohet me funksionin session_start(). Me kt i udhzohet serverit q ta krijoj nj
sesion t ri, apo ta vazhdoj sesionin aktual.
Me krijim t sesionit t ri nnkuptohet krijimi i nj fajlli n server, brenda t cilit do t ruhen t
gjitha t dhnat e nevojshme. Ai fajll do t largohet automatikisht kur mbaron sesioni.
Pra, pas session_start() krijohet nj fajll q i korrespondon atij sesioni. Emrtimi i fajllit sht nj
hash unik, dhe kjo bhet me qllim q t parandalohet prdorimi i fajllit t njjt pr dy sesione. Ai
hash paraqet ID-n e sesionit, session_id().
Sesionet
47
Meqense HTTP, gjat kalimit prej nj faqeje n tjetrn nuk e ruan gjendjen, si do t dij serveri se
cili sesion cilit vizitor i prket?
T dhnat q Web serveri i merr prej browserit jan t pamjaftueshme pr ta identifikuar vizitorin
n mnyr unike. T dhnat identifikuese jan:
IP adresa
Browseri
Versioni i browserit
Sistemi operativ
Kto t dhna i drgohen serveri gjat do HTTP request, psh. kur krkohet hapja e nj faqeje dhe
duken kshtu:
Mozilla/5.0 (Windows NT 6.3; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0
Kto t dhna jan t pamjaftueshme pr ta identifikuar vizitorin, sepse Web serveri e sheh
vetm IP adresn publike, ndrkoh q jan me miliona kompjuter prapa NAT (Network Address
Translation), gjegjsisht prapa routerve, me IP adresa private. As t dhnat mbi sistemin operativ
dhe browserin nuk mund t formoj nj identifikator unik sepse shum prdorues mund ta ken t
njjtin sistem operativ dhe t njjtin version t browserit.
N pamundsi t identifikimit t vizitorit nga t dhnat e drguara me HTTP, Web serveri shrbehet
me nj cookie q do tia drgoj browserit, nse ai cookie tashm nuk ekziston n at browser. Cookie
do t prmbaj vlern (hash-in) e session ID. Ky cookie, prej momentit t krijimit e deri n fund t
sesionit, do ti bashkangjitet do HTTP requesti duke ia bartur Web serverit ID-n e sesionit, e n
baz t ksaj - Web serveri do t dij se n cilin fajll ti regjistroj vlerat e sesionit.
Pra, pr ndrtimin e urs ndrmjet browserit dhe Web serverit, na ndihmon prezenca e nj cookie
q e prmban ID-n e sesionit.
Skenari:
Browseri i drgon Web serverit krkes pr hapjen e faqes
Serveri verifikon HTTP requestin e pranuar dhe krkon prezencn e cookie me ID-n e sesionit
Nse cookie nuk ekziston, krijohet nj sesion i ri (duke krijuar fajll t ri) dhe ID-ja e atij sesioni
regjistrohet n nj cookie q i drgohet browserit n do HTTP response
Nse cookie ekziston n HTTP request, lexohet vlera e ID-s s sesionit, dhe krkohet fajlli
me at ID (hash). Nse fajlli ekziston, procesi vazhdon normalisht. Nse nuk ekziston, kjo do
t thot se cookie prmban informat jovalide, kshtu q hapet nj sesion i ri duke krijuar nj
fajll t ri n server dhe duke drguar nj cookie t ri n browser.
Prej momentit q Web serveri ia drgon browserit cookien me session ID, browseri do ta
kthej at cookie n Web server n do HTTP request, ndrsa Web serveri do ta kthej prapa
n browser n do HTTP response. Me kt ping-pong t cookie ndrmjet browserit dhe
serverit ruhet kontinuiteti i identitetit t vizitorit prgjat nj sesioni.
Sesionet
48
sess_6nhs0c9j9u7qp3dcrtnh00mm96
sess_f5cnai4mdvqkem7v286dr9ar66
sess_g76a18t8p7opc328qpj6grd7m23gg10l
sess_jkn3s6ac38f029ah9jip2t5v93
Nse e hapim ndonjrin prej fajllave, aty do t gjejm t dhna t serializuara t sesionit:
1
2
3
shporta|a:2:{i:0;a:3:{s:2:"id";i:1;s:5:"price";d:650.14999999999998;s:3:"qty";d:\
1;}i:1;a:3:{s:2:"id";i:2;s:5:"price";d:999.95000000000005;s:3:"qty";d:4;}}crsf_t\
oken|s:32:"ecdb364e8740ce40879410a7071725e4";
Kto t dhna jan t ruajtura n plain text dhe mund t dekodohen leht si array:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
array (size=2)
'shporta' =>
array (size=2)
0 =>
array (size=3)
'id' => int 1
'price' => float 650.15
'qty' => float 1
1 =>
array (size=3)
'id' => int 2
'price' => float 999.95
'qty' => float 4
'crsf_token' => string 'ecdb364e8740ce40879410a7071725e4' (length=32)
Prandaj, sht me rndsi q askush nga jasht t mos ket qasje n kto fajlla.
Sesionet
49
Jetgjatsia e sesionit
Sa do t jetoj ky cookie, gjegjsisht sa do t jet jetgjatsia e nj sesioni? Varet si sht konfiguruar
PHP serveri. Vlera standarde sht 1440 sekonda, gjegjsisht 24 minuta.
php.ini
session.gc_maxlifetime = 1140
Nse brenda 24 minutave nuk ka aktivitet nga ana e vizitorit, fajlli i sesionit fshihet dhe n munges
t tij, sesioni do t skadoj.
Natyrisht, ka metoda pr tejkalimin e ktij kufizimi, me prdorimin e nj cookie tjetr q e prmban
ID-n e antarit (jo t sesionit) dhe q ka jet m t gjat (psh 30 dit). Aplikacioni mund t
programohet asisoj q s pari e verifikon ekzistencn e ktij cookie t dyt dhe nse ekziston, e
lexon ID-n e antarit nga aty dhe fillon nj sesion t ri, duke e deklaruar antarin t autentikuar.
N kt parim funksionon opsioni Remember me, q e hasim npr Web site t ndryshme.
Fillimi i nj sesioni
session_start();
Prfundimi i sesionit
Sesioni mbaron n tri mnyra:
Mbyllja e nj sesioni:
1
2
3
$_SESSION = array();
session_destroy();
setcookie('PHPSESSID', ", time()-3600,'/', ", 0, 0);
Session hijacking
//
Funksionet
Built-in functions
Funksionet jan trsi programore pr zgjidhjen e nj problemi t caktuar. Mund t prdoren pr:
ta llogaritur ndonj vler,
pr ta konstatuar/verifikuar ndonj gjendje,
pr ta kryer ndonje veprim, etj.
Ato jan vet esenca e PHP-s, sikurse q sht rasti edhe me gjuht e tjera programore.
PHP posedon nj numr t madh t funksioneve t integruara. Numri i sakt i tyre varet prej
PHP ekstensioneve t instaluara; sa m shum ekstensione - aq m shum funksioneve i kemi n
dispozicion.
Numrin e sakt t funksioneve t nj instalimi konkret, mund ta shohim me kt kod:
1
2
3
4
<?php
$f = get_defined_functions();
echo count($f['internal']);
?>
N kt kompjuter, me WAMP t instaluar dhe vetm disa ekstensione, numri sht 1890. Me shtimin
e eksensioneve t tjera, ky numr do t bhet m i madh.
Edhe pse ky numr i funksioneve sht jashtzakonisht i madh dhe prfshin zgjidhje pr situata t
ndryshme, megjithat ka raste kur na nevojitet nj funksion i ri q do t kryej nj detyr shum
specifike. Ather paraqitet nevoja pr krijimin e nj funksioni t ri, t ashtuquajturat user-defined
functions.
Megjithat, para se t fillojm ta ndrtojm nj funksion t ri, sht mir t verifikojm n PHP
manual nse nj funksion q e kryen at pun tashm ekziston. Funksionet e integruara, prve q
do t ekzekutohen m shpejt, jan edhe m t sigurt dhe prmbajn m pak bugs.
Ve ksaj, duke krkuar npr Web, mund t gjejm funksione t gatshme, apo edhe biblioteka t
tra t funksioneve, me prdorimin e t cilave mund t zgjidhim probleme t ndryshme, pa pasur
nevoj ta kuptojm kodin e tyre, apo t ndrhyjm.
Funksionet
51
User-defined functions
Gjat krkimit t gabimeve npr skriptat tona, shpeshher e prdorim funksionin var_dump() pr
t na treguar vlerat e ndonj variabli, rndom t atyre m kompleks si jan vargjet.
Nse skripta jon automatikisht redirektohet n ndonj faqe tjetr, ne nuk do t jemi n gjendje
se far rezultati na jep var_dump(). Pr kt arsye, pas var_dump(), shtojm edhe die() ose exit.
Funksionin die() e shtojm edhe ather kur me qllim dshirojm ta ndalim ekzekutimin e skripts,
n mnyr q ta izolojm vendin e gabimit m mir. Shpesh ndodh q gabimi ka origjinn e ka krejt
tjetrkund n krahasim me vendin ku raportohet, prandaj duke e ndalur programin n vende t
ndryshme, ne arrijm ta gjejm burimin e problemit.
Nse shpesh na nevojiten kto dy funksionet e cekura (var_dump() dhe die()), do t ishte mjaft e
bezdishme q ti shkruajm gjithmon nga fillimi. Pr kt arsye, mund ta krijojm nj funksion t
ri pr t na e lehtsuar punn.
1
2
3
4
Kt funksion e vendosim le t themi n fund t skripts, edhepse vendndodhja e tij brenda skripts
nuk ka kurrfar rndsie, sepse sht nj trsi n vete dhe ekzekutohet vetm kur thirret n mnyr
eksplicite.
Tash, mund ti analizojm variablat me funksionin e ri dd(). Nse pr shembull duam ta dim
prmbajtjen e superglobalit $_POST, shkruajm dd($_POST); ose dd($_POST, "test"); kur duam
ta shoqrojm edhe ndonj mesazh.
1
2
3
4
5
6
7
<?php
dd($_POST);
function dd($arg, $message="") {
var_dump($arg);
die($message);
?>
Tash, pra, ekzekutohen dy funksione njri pas tjetrit. S pari var_dump() e tregon prmbajtjen e
$_POST, e pastaj die() e ndrpren ekzekutimin e skripts duke e dhn mesazhin q e kemi shnuar
si parametr t dyt te dd().
Nse ky funksion na nevojitet edhe n skriptat tjera, mund ta kopjojm prmbajtjen e tij dhe ta
vendosim npr skripta. Mirpo, nse m von dshirojm ta bjm ndonj ndryshim n funksion,
do t duhet q ta editojm do skript ku e kemi vendosur at funksion.
Funksionet
52
<?php
function dd($arg, $message="") {
var_dump($arg);
die($message);
?>
skripta.php
1
2
3
4
<?php
include("funksionet.php");
dd($_POST);
?>
Pr aplikacionin ton mund t nevojitet nj numr i funksioneve t ndryshme, kshtu q sht mir
q ato ti vendosim n nj fajll t prbashkt, jo secilin ve e ve. Kshtu do t kemi nevoj vetm
pr nj include.
Nse megjithat numri i funksioneve sht i madh, pa nevoj do t inkludohej fajlli i madh, prandaj
ne duhet ti sistemojm npr fajlla duke i grupuar. Bjm include vetm at fajll q prmban
grupin e funksioneve q do ti prdorim n skriptn ton. N kt mnyr formojm biblioteka
t funksioneve.
Anatomia e funksionit
Emrtimi i funksionit
Funksioni duhet ta ket nj emr q fillon me shkronj apo n raste t caktuara me _ (underline).
Emri duhet t jet unik, q t mos ket kolizion me emrat e funksioneve ekzistuese. Emri i funksionit
sht case-insensitive, q dmth se nse e emrtojm funksionin tvsh, mund ta thrrasim edhe me
Tvsh ose TVSH.
Pas emrit t funksionit vendosen kllapat (), brenda t cilave do ti vendosim parametrat, apo thn
ndryshe - vlerat hyrse t funksionit, nse funksioni ka nevoj pr ta. Pas kllapave vendosen kllapat
e mdha (curly braces), t cilat e definojn bllokun e kodit t funksionit.
Funksionet
1
2
3
53
function tvsh($input) {
. . .
}
Trsit e funksionit
Funksionet mund ti zbrthejm n 3 trsi:
Leximi i vlerave hyrse
Procesimi i vlerave hyrse dhe krijimi i vlers dalse
Kthimi i vlers dalse
Vlerat hyrse, apo parametrat e funksionit jan at vlera q prcillen nga programi/skripta pr tu
prpunuar brenda funksionit. Imagjinojeni funksionin si nj makin e cila krkon lnd t par pr
ta prodhuar nj produkt. Lnda e par e funksioneve jan vlerat numerike, tekstuale, logjike, etj. Ato
vlera procesohen brenda funksionit pr tu prfituar rezultati i cili pastaj i kthehet thirrsit.
1
2
3
4
5
6
7
8
<?php
echo "Cmimi me TVSH: ".tvsh(100);
function tvsh($cm) {
$cmt = $cm+($cm*16/100);
return $cmt;
}
?>
Funksioni tvsh thirret n rreshtin e dyt si tvsh(100), ku vlera 100 sht mimi pa TVSH.
Funksioni e merr at vler nprmes parametrit $cm. Parametrat shnohen brenda kllapave pas
emrtimit t funksionit.
Rreshti vijues e vendos vlern e $cm n formuln $cm+($cm*16/100), formul kjo q vlern e
variablit $cm e rrit pr 16%, duke e fituar kshtu mimin me TVSH. Vlerat e re vendoset n variablin
$cmt. N rreshtin tjetr, me urdhrin return e kthejm vlern e cmimit me TVSH. Ku apo kujt ia
kthejm. Thirrsit, q n kt rast sht rreshti: echo "Cmimi me TVSH: ".tvsh(100);
Krejt pjesa tvsh(100) zvendsohet me vlern e kthyer nga funksioni, pra me numrin 116. Prandaj,
echo do ta printoj tekstin Cmimi me TVSH: 116.
Funksionet mund t ken nj apo m tepr parametra, por mund edhe t mos e ken asnj. Funksionet
t cilave nuk kan nevoj pr t dhna hyrse, nuk kan parametra. Pr shembull funksionin i PHP
time() q tregon UNIX timestamp, nuk ka nevoj pr asnj vler hyrse pr t na kthyer si rezultat
kohn aktuale.
Brenda funksionet shkruajm kod n mnyr standarde, nuk dallon asgj nga programimi i pjess
tjetr t skripts.
Funksionet
54
Kthimi i vlerave
Funksionet kthejn vlera, por kemi edhe funksione q nuk kan nevoj t kthejn vlera fare.
Parimisht, nse funksioni duhet vetm t kryej procesim pr t ardhur deri te nj vler, ne zgjedhim
q funksioni t kthej vler. N rastet kur funksioni duhet ta kryej nj veprim, ather ai mund t
mos kthej rezultate.
$cmimi_tvsh = tvsh(56);
function tvsh($cm) {
}
$cmimi = 100;
$tvsh = 16;
echo tvsh($cmimi, $tvsh);
1
2
3
Si shohim parametrit $cm i prgjigjet argumenti $cmimi, ndrsa atij $shk i prgjigjet $tvsh. Emrat
jan irelevant, renditja sht ajo q merret parasysh.
Numri i argumenteve nuk sht e thn t jet i barabart me numrin e parametrave:
Funksionet
echo tvsh(100);
1
2
3
4
55
<?php
$cmimi = tvsh(115, 16);
echo "<p>Vlera e TVSH:".$cmimi['tvsh'];
echo "<p>Cmimi me TVSH:".$cmimi['cmimi_tvsh'];
function tvsh($cm, $shk=16) {
$tvsh = $cm*$shk/100;
$cmimi_tvsh = $cm+$tvsh;
$rezultati = array('tvsh' => $tvsh, 'cmimi_tvsh' => $cmimi_tvsh);
return $rezultati;
}
Rezultati:
1
2
Vlera e TVSH:18.4
Cmimi me TVSH:133.4
Funksionet
1
2
3
4
5
6
7
8
9
10
11
12
13
56
<?php
$cmimi = 100;
echo "<p>Cmimi:".$cmimi;
trego_cmimin();
echo "<p>Cmimi:".$cmimi;
function trego_cmimin()
{
$cmimi = 200;
echo "<p>Cmimi:".$cmimi;
}
?>
Rezultati:
1
2
3
Cmimi:100
Cmimi:200
Cmimi:100
Si shihet nga shembulli, vlera e variablit $cmimi n skript sht 100, brenda funksionit sht 200,
dhe kur e printojm prap - vlera sht 100. Pra, ndryshimi i vlers s variablit me emr t njjt
brenda funksionit - nuk e ka ndryshuar vlern e atij variabli jasht funksionit.
Kjo karakteristik na mundson q n funksione t prdorim variabla me emrtime sipas dshirs,
pa pasur frik se ato do ti mbulojn vlerat e variablave me emr t njjt jasht skripts.
Po ashtu, ky izolim i variablave brenda funksionit, mundson q vlera e tyre t mos ndryshohet
aksidentalisht, duke e marr vlern e ndonj variabli me emr t njjt jasht funksionit.
Me kt, funksionet jan si kuti t zeza, variablat e t cilave nuk ndikohen nga ambienti i jashtm,
duke e br kodin e tyre portabil, pra q t mund ta prdorim n cilndo skript q t na nevojitet.
Nse megjithat na nevojitet ndonj interaksion i funksionit me ambientin e jashtm, kemi
mundsi q variablat e caktuar ti shpallim si variabla global, me global.
Funksionet
1
2
3
4
5
6
7
8
9
10
11
57
<?php
$cmimi = 100;
echo "<p>Cmimi pa TVSH:".$cmimi;
echo "<p>Cmimi me TVSH:".trego_cmimin(16);
function trego_cmimin($tvsh)
{
global $cmimi;
return $cmimi+$cmimi*$tvsh/100;
}
?>
Ktu, funksionit nuk ia kemi prcjellur fare mimin me prdorimin e ndonj argument, e kemi
prcjell vetm vlern e TVSH-s (16). Funksioni e merr vlern e variablit $cmimi nga skripta, sepse
sht shnuar global $cmimi, pra $cmimi sht deklaruar si variabl globale. Pas llogaritjes me
formuln $cmimi+$cmimi*$tvsh/100, funksioni me return e kthen at vler, dhe echo-ja e dyt n
skript e printon, duke e dhn vlern e re (116).
Nse vlera e variablit global $cmimi ndryshohet brenda funksionit, edhe skripta do t ket qasje n
at vler t re.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$cmimi = 100;
echo "<p>[Skripta] Cmimi pa TVSH:".$cmimi;
echo "<p>[Funksioni] Cmimi me TVSH:".trego_cmimin(16);
echo "<p>[Skripta] Cmimi pa TVSH:".$cmimi;
function trego_cmimin($tvsh)
{
global $cmimi;
$cmimi = $cmimi+$cmimi*$tvsh/100;
return $cmimi;
}
?>
PHP extensions
Me rritjen e krkesave pr mundsi t reja n aplikacion, zhvilluesi vazhdimisht do t ket nevoj t
shtoj funksione t reja.
Pr shembull, nevojitet nj funksion apo nj trsi funksionesh pr:
Composer
N kapitullin mbi PHP ekstensionet, pam se ka jan ato dhe pr ka prdoren.
Avantazh i ekstensioneve sht shpejtsia e ekzekutimit t tyre, sepse ato jan t shkruara n C.
Avantazh tjetr sht se brenda skriptave tona nuk duhet t shtojm asgj pr ti informuar skriptat
mbi ekzistencn e nj ekstensioni.
Ndonse ofrojn shpejtsi, lehtsim t puns si dhe siguri, ekstensionet nuk jan gjithmon zgjedhje
ideale. Kjo pr shkak se numri i ekstensioneve, pr shkak t natyrs s tyre specifike (duhet t
shkruhen n C), sht i vogl.
Pr fat t mir, ekziston zgjidhja alternative: bibliotekat e funksioneve t shkruara n PHP. Kto nuk
jan t shpejta si ekstensionet pr vet faktin se jan t shkruara n PHP. Pra, sikurse edhe kodi i
skriptave tona, ashtu edhe kodi i ktyre bibliotekave me funksione, duhet t kalojn pr procesim
n PHP server.
Avantazh i tyre sht fleksibiliteti dhe numri i madh i bibliotekave n dispozicion.
Jan fleksibile sepse kemi mundsi t ndrhyjm n kodin e tyre dhe t bjm prshtatjet e
nevojshme. Te ekstensionet kjo sht e pamundur sepse atje ruhen si fajlla binar.
Numri i madh i bibliotekave siguron q do t mund t gjejm zgjidhje pr probleme t natyrave
t ndryshme, nga manipulimet me tekste deri te kriptografia e avancuar.
PEAR
Nj koleksion tejet i madh i bibliotekave quhet PEAR - PHP Extension and Application Repository
(http://pear.php.net/).
E meta e PEAR sht se ka shum biblioteka tashm t vjetra dhe t pasuportuara nga autort.
Packagist
Kohve t fundit, nj rritje t madhe n popullaritet shnon Web packagist.org.
Aty mund t gjejm nj numr tejet t madh t pakove t gatshme, mjafton vetm t bjm krkim
me emrin e pakos s dshiruar.
Mnyra e marrjes s fajllave n packagist.org sht specifike, nuk bhet download direkt nga faqja
e ndonj zip fajlli, as nuk bhet klonimi si n rastin e Github.
Composer
60
Composer
Pr ti shkarkuar fajllat e nj pakoje, nevojitet prdorimi i programit Composer nga http://getcomposer.org
.
Windows installer
Nn Windows Installer klikojm te linku Composer-Setup.exe, me t cilin e shkarkojm fajllin,
t cilin fajll m tej e instalojm.
Gjat instalimit, do t krkohet lokacioni ku gjendet fajlli php.exe, q n rastin e WAMP - do t
jet n c:\wamp\bin\php\php5.5.12\php.exe. T prsrisim: numri i versionit mund t dalloj n
kompjuter t ndryshm.
Pasi t kryhet instalimi n kt mnyr, e startojm command prompt-in, ku shkruaj: composer.
Nse paraqitet dritarja me opsionet e Composer, instalimi ka qen i suksesshm.
Instalimi manual
Instalimi mund t kryhet edhe manualisht, duke e formuar nj folder t ri diku n sistem, psh. c:\bin.
Futemi n command prompt, pastaj shnojm komandn cd c:\bin. Ktu e japim komandn e re:
C:\bin>php -r "readfile('https://getcomposer.org/installer');" | php
cd c:\bin
php composer.phar
ose
1
2
cd c:\users\document\projekti
c:\bin\php composer.phar
Pas composer.phar e shnojm ndonjrn prej komandave t tij, ku neve do t na interesojn: install
dhe update.
Ktu i shohim dy probleme:
1. composer.phar nuk mund t startohet direkt nga cilido folder.
2. pr ta startuar duhet t shnohet mjaft kod n rreshin komandues
Composer
61
E para: Startojm Control Panel -> Advanced System Settings -> Advanced -> Environment
Variables
Te User variables zgjedhim opsionin PATH, pastaj Edit. Te Variable value, shkojm n fund t
rreshtit dhe shtojm: ; c:\bin' .E hapim nj command prompt t ri dhe testojm nga cilido
folder q nuk sht brenda c:\bin, duke shkruar php composer.phar. Nse na dalin opcionet
e composer, gjithka sht OK dhe kalojm n hapin e dyt.
E dyta: duke qen n command prompt, futemi n c:\bin.
1
cd c:\bin
e japim komandn:
1
N kt mnyr e krijuam nj fajll t ri, t quajtur composer.bat t cilin mund ta startojm thjesht
me komandn composer. Pra, jo m php composer.phar, por vetm composer.
Prdorimi i Composer
Pasi i zgjidhm dy problemet e siprcekura, tash kemi mundsi q ta startojm Composerin nga cilido
folder me komandn composer install, nse dshirojm t instalojm ndonj pako, apo composer
update kur dshirojm t bhet prditsimi i nj pakoje.
T kthehemi te packagist.org. Atje tham se nuk bhet shkarkimi direkt i pakove. N vend t linkut
t pakove, atje mund ta marrim nj rresht si ky:
1
"os/php-excel": "dev-master"
Ky rresht duhet ti shtohet fajllit composer.json, i cili fajll duhet t jet i vendosur brenda folderit
ku do ta shkarkojm pakon/pakot.
Nse pr shembull e kemi caktuar folderin c:\wamp\www\aplikacioni-yne\libraries si vend ku
do ti ruajm pakot, ather composer.json do t vendoset pikrisht aty.
Fajlli duhet ta ket kt struktur:
Composer
1
2
3
4
5
62
{
"require": {
"os/php-excel": "dev-master"
}
}
Nse duam t prfshijm m tepr pako, vetm i shnojm njri nn tjetrin, duke i ndar me presje.
Pas plotsimit t composer.json me t dhnat e marra nga packagist.org, e japim komandn:
1
composer install
N kt moment fillon shkarkimi i pakos duke e formuar strukturn prkatse t fajllave, pra duke
i krijuar foldert dhe duke i vendosur fajllat brenda tyre.
Kurdo q t kemi nevoj pr ti prditsuar pakot, e japim komandn:
1
composer update
<?php
require 'vendor/autoload.php';
<?php
require '..libraries/vendor/autoload.php';
Composer
composer update
duke i zvendsuar fjalt vendor dhe package me emrtimet prkatse t pakos konkrete.
Pr ta prditsuar vet Composer-in, shnojm:
1
composer self-update
63
Regular Expressions
T gjitha Web faqet jan t mbushura me tekst. Edhe vet HTML dokumentet jan fajlla tekstual
q dallohen nga ato .txt vetm me prezencn e tag-ave. do input n formular sht tekst dhe ata
ruhen n form teksti n databaz, apo n ndonj JSON fajll.
T dhnat q futen n nj formular jan t natyrave t ndryshme: emr, email, dat, numr telefoni,
numr letrnjoftimi, numr karte krediti, etj. T gjitha kto krkojn formatim t caktuar pr t qen
t dhna korrekte:
AJAX
Deri para disa vitesh, JavaScript dhe PHP kan qen dy botra plotsisht t ndara; nuk ka qen i
mundur komunikimi i drejtprdrejt i nj JS skripte me nj PHP skript.
JavaScript ekzekutohet n browser, ndrkoh q PHP ekzekutohet n Web server. Nj lloj interaksioni
mes tyre mund t sigurohej me an t gjenerimit dinamik t JS skriptave n PHP. Megjithat,
mungonte mundsia e pranimit t t dhnave nga JavaScript.
Pr shkak t ktij kufizimi, ka qen e pamundur prcjellja e t dhnave dinamike n nj Web faqe,
n koh reale. Si zgjidhje gjysmake dhe jo fort praktike ka qen mundsia e rifreskimit t faqes
(refresh) nga JavaScript, brenda intervaleve t caktuara kohore, pr shembull do 1 minut. Kjo
metod pamundsonte fardo interaksioni normal t vizitorit me faqen. meqense rifreskimi i faqes
e ndrprente do veprim q mund t ishte duke br vizitori.
XMLHttpRequest
XMLHttpRequest sht nj JavaScript objekt i cili mundson leximin e t dhnave nga nj URL, pa
pasur nevoj pr rileximin e Web faqes. Viteve t fundit gjen zbatim n nj numr shum t madh
t Web aplikacioneve, duke mundsuar ndrtimin e t ashtuquajturit Web 2.0.
Objekti XMLHttpRequest mundson komunikimin asinkron ndrmjet browserit dhe serverit, me
rast browseri ka mundsi ti drgoj krkesa serverit dhe nga ai t marr prgjigje n form
t HTML, XML, JSON apo t ndonj formati tjetr, dhe kto t dhna ti vendos brenda HTML
dokumentit, pa pasur nevoj pr gjenerimin e faqes me refresh. Kjo teknologji quhet AJAX.
N HTML, kur e ndrtojm nj formular, e prdorimin atributin action t elementit form, me t cilin
atribut e definojm URL-n e skripts e cila do ti lexoj t dhnat e drguara. Sa her q klikohet
butoni i tipit submit, browseri i mbledh t dhnat e formularit dhe e drgon nj HTTP krkes
serverit pr URL-n e definuar n action, me rast pra hapet nj faqe tjetr.
Virtual hosts
Ata t cilt e kan t instaluar WAMP-in, e dijn se fajllat e nj PHP aplikacioni ruhen n
C:\wamp\www, t cilave u qasemi nga browseri me URL-n:
1
http://localhost
Nse kemi m tepr se nj projekt, ather mund t krijojm direktoriume brenda atij www, t cilave
u qasemi me:
1
2
3
4
5
http://locahost/projekti1
http://locahost/projekti2
http://locahost/projekti3
Nse n nj faqe (psh index.php) e linkojm CSS fajllin n kt mnyr dhe e testojm n browser,
do t shohim se faqja nuk do ta gjej fare CSS fajllin. Kjo ndodh pr shkak se shenja / nuk e
tregon direktoriumin ku gjendet aplikacioni yn, por i referohet direktorumit www, pra atje te www
krkohet /assets/style.css, por nuk gjendet atje. Shtegu i sakt sht /projekti1/assets/style.css!
1
Zgjidhja duket triviale: shtojm /projekti1 para do linku absolut. Por kjo nuk sht zgjidhje e mir,
sepse kur do t dshirojm ta sinkronizojm sajtin ton me remote host, do t kemi probleme me
dead links, sepse atje ne i vendosim n
public_html
Virtual hosts
67
public_html/projekti1
Pra, nse problemin e zgjidh n local host, m del problem n remote host. N remote host do t
funksiononte linku nse do t shnohej si
1
/assets/style.css
/projekti1/assets/style.css
http://kursi.app
se sa me
1
http://localhost/kursi
C:\Windows\System32\drivers\etc\hosts
Virtual hosts
68
127.0.0.1 kursi.app
E ruajm fajllin me Save. Nse nuk kreni privilegje t Administratorit, nuk do t jeni n gjendje
ta ruani fajllin me ndryshime.
Vrejtje: Duhet t keni parasysh se n vend t .app mund t prdorni fardo Top Level Domain
tjetr (.dev, .test, etj), por edhe .com, .net, etj. Preferohen kto fiktivet sepse nse prdorim ndonj
TLD real, do ta bllokojm qasjen te ai domain nse vrtet ekziston. Psh. nse n Web ekziston
kursi.com, e ne e kemi zgjedhur pikrisht kt n hosts, ne efektifisht e kemi bllokuar qasjen n
sajtin e vrtet kursi.com.
Me shtimin e rreshtit n hosts mundsuam q duke shnuar http://kursi.app n browser t hapet
http://localhost
Kjo nuk mjafton, sepse neve na duhet prmbajtja e http://localhost/kursi
Tash duhet ta konfigurojm Web serverin Apache, ku do t krijojm nj host virtual.
Fillimisht i qasemi fajllit httpd.conf n:
1
C:\wamp\bin\apache\apache2.4.9\conf
N vend t numrit 2.4.9, mund t jet ndonj numr tjetr i versionit t Apache, varsisht cilin
version e keni instaluar n sistemin tuaj.
N fajallin httpd.conf e krkojm rreshtin me kt prmbajtje (rreshti 512 n versionin e prdorur
n kt shembull):
1
2
# Virtual hosts
# Include conf/extra/httpd-vhosts.conf
Shenja # sht shenj e komentimit, q do t thot se nse nj rreshti i paraprin kjo shenj, ai rresht
do t injorohet. Prandaj, ne e fshijm shenjn #.
1
2
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
T njjtin veprim mund ta realizojm edhe nga WAMP, duke shkuar n menun Apache - Apache
modules dhe duke selektuar opsionin
1
vhost_alias_module
N vazhdim, shkojm n:
Virtual hosts
69
C:\wamp\bin\apache\apache2.4.9\conf\extra
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot "C:\wamp\www\kursi"
ServerName kursi.app
</VirtualHost>
Nse e kemi konfiguruar WAMP-in ta prdor ndonj port tjetr, psh 8000, ather shnojm:
1
<VirtualHost *:8000>
http://localhost/test/index.php?cmd=produkti&id=3
http://localhost/index.php?cmd=produkti&id=3
N vend t localhost mund t jet ndonj domain name, nse aplikacionin e kemi vendosur n
remote host, si psh:
1
http://www.onlineshop.com/index.php?cmd=produkti&id=3
Edhe pse u shkurtua pak, URL-ja ende sht mjaft komplekse dhe e palexueshme.
N aspektin e SEO (Search Engine Optimization), URL-t e formuara n mnyr t ktill kan vler
m t vogl se URL statike, si psh:
1
http://www.onlineshop.com/produkti/3
Pr relizim t prkryer t SEO friendly URL, edhe numri n fund duhet t zvendsohet me slug,
pra me fjal q prmban emrtimin e produktit, n kt rast. Psh:
1
http://www.onlineshop.com/produkti/cokolade-milka
mod_rewrite.so
Pr t manipuluar me URL-t n mnyr q atyre tua japim dukjen e URL-ve t faqeve statike,
duhet t shrbehemi me modulin rewrite_module t Apache.
Kt e arrijm n WAMP, duke zgjedhur menun:
71
Kjo realizohet edhe duke e edituar httpd.conf, me heqjen e shenjs # para rreshtit:
1
.htaccess
Pr momentin, nuk ka ndonj ndryshim n fuksionimin e aplikacionit ton. Deri te ndryshimi do
t vijm duke e shtuar nj fajll t quajtur .htaccess n folderin kryesor t aplikacionit ton. Do t
shrbehemi me kt .htaccess, q sht huazuar nga CodeIgniter:
1
2
3
RewriteEngine on
RewriteCond $1 !^(index\.php|favicon.ico|assets|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]
http://localhost/kontakti.php
http://localhost/login
http://localhost/produktet/produkti.php
http://localhost/assets/style.css
72
http://localhost/kontakti
http://localhost/index.php/kontakti
Me kt ndryshim, ende nuk kemi arritur asgj, prve asaj se tash nuk del raporti se faqja nuk sht
gjetur (Page not found).
N strukturn e fajllave t aplikacionit ton, askund nuk gjendet folderi /kontakti, dhe pa Rewrite
t aktivizuar, Web serveri do t lajmronte se ajo faqe/folder nuk ekziston.
Pra, edhepse kemi krkuar folderin kontakti, neve na sht ofruar fajlli index.php.
Prej ktu, ne duhet ta vendosim logjikn e analizs s URL-s n index.php n mnyr q atje t
vendoset ka t ndodh kur vizitori e klikon nj link t aplikacionit ton.
$_SERVER['PATH_INFO']
73
/produkti/1
/produkti/cokolade-milka
/produkti/cololade-milka/edit
Pr kt shkak, ne duhet fillimisht ta zbrthejm URL-n (pjesn pas domainit), n segmente. Kjo
arrihet me explode, funksion i cili e ndan nj string duke u bazuar n ndonj karakter t zgjedhur,
dhe t gjitha fragmentet e stringut i ruan si elemente t vargut (array).
N browser psh e shnojm URL-n: http://kursi.app/produkti/edit/5. Pastaj e analizojm n skript:
1
Variabli $url sht n fakt nj varg njdimensional, i cili ka aq elemente sa segmente ka URL-ja. N
rastin /produkti/cololade-milka/edit, var_dump() do t na i tregoj segmentet si vijon:
1
2
3
4
5
array (size=4)
0 => string '' (length=0)
1 => string 'produkti' (length=8)
2 => string 'edit' (length=4)
3 => string '5' (length=1)
E shohim se segmenti 1 jep fjaln produkti, segmenti 2 fjaln edit dhe n fund, segmenti 3 e jep
numrin 5.
router
Duke u bazuar n vlerat e fituara, pra t segmenteve t URL-s, ne e ndrtojm router-in e
aplikacionit ton.
Detyra e routerit do t jet q ti lexoj segmentet e URL-s, dhe n baz t atyre t prcaktoj se
ciln skript do ta ekzekutoj, gjegjsisht ta inkludoj n index.php.
Si cekm, $url[1] tregonte segmentin e par, pr neve m kryesorin t URL-s. Duke e shfrytzuar
at, e ndrtojm nj router rudimentar.
74
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
$url = explode("/", $_SERVER['PATH_INFO']);
if (!empty($url[1]))
{
$cmd = filter_var($url[1], FILTER_SANITIZE_STRING);
switch ($cmd)
{
case 'login':
require('login.php');
break;
case 'check':
require('check.php');
break;
case 'produkti':
require('produkti.php');
break;
case 'kontakti':
require ('kontakti.php');
break;
case 'signup':
require ('regjistrimi.php');
break;
default:
echo "<p>Nuk ekziston kjo faqe!</p>";
}
}
else
{
require("home.php");
}
?>
Nse tash e shikojm kronologjikisht si jan ndrtuar URL-t prgjat kursit, do t shohim se si ato
po bhen gjithnj e m kompakte dhe m t lexueshme:
1
2
3
4
5
http://localhost/test/index.php?cmd=produkti&id=3
http://localhost/index.php?cmd=produkti&id=3
http://kursi.app/index.php?cmd=produkti&id=3
http://kursi.app/?cmd=produkti&id=3
http://kursi.app/produkti/3
Instalimi i Twig
Twig instalohet me Composer, ku n composer.json e shtojm rreshtin:
1
"twig/twig": "1.18.0"
{
"require": {
"swiftmailer/swiftmailer": "5.3.*@dev",
"twig/twig": "1.18.0"
}
}
76
require("../app/libraries/vendor/autoload.php");
Shtegu deri te folderi vendor mund t jet ndryshe, varsisht nga mnyra e organizimit t fajllave
nga ana e programuesit.
Inicializimi i Twig
Inicializimi i Twig bhet me:
1
2
3
4
5
6
Twig_Autoloader::register();
$loader = new Twig_Loader_Filesystem('../app/views');
$twig = new Twig_Environment($loader, array(
'cache' => '../app/cache',
'debug' => true
));
77
$_SESSION['auth'] = TRUE;
ajo vler nuk do t ruhet n fajllin/tabeln e sesioneve, derisa nuk drgohet nj HTTP request i
ri. HTTP request drgojm kur klikojm n nj link (metoda GET), kur drgojm nj formular
(metoda POST), apo kur e drgojm HTTP requestin me header(), si n rastin header("Location:
/kontakti");. Nse skripta jon i jep vler nj variablit t sesionit dhe pastaj me header() redirekton
n nj skript tjetr, vlera e variablit t sesionit do t ruhet. Por, nse para thirrjes s header(),
ekzekutohet echo, procesi do t ndalet aty - nuk do t ket ruajtje t vlers s sesionit, as nuk do
t ket redirektim. E gjith far u prmend pr sesionet, vlen edhe pr cookie-t. Edhe cookie-t e
ruajn vlern, tek pasi t sht drguar HTTP requesti i radhs, prndryshe vlera e tyre mbetet e
pandryshuar.
Thirrja e nj template/view
Pasi ti kemi vendosur vlerat e variablave brenda nj vargu, e thrrasim template me:
78
Ku si argument i par sht emri i view, ndrsa i dyti sht vargu q i prmban vlerat q duam ti
bartim atje. N kt shembull, bhet thirrja e view t quajtur raporti.html.
{% extends "layout.html" %}
{% block content %}
{% endblock %}
Ndrmjet {% block content %} dhe {% endblock %} vendoset i gjith HTML kodi i faqes. Po ka
specifikon rreshti i par me: {% extends "layout.html" %}?
Me extends tregohet se kjo faqe sht fmij i nj faqeje kryesore, t quajtur layout.html, apo
sido q ta kemi quajtur at.
Faqja layout.html sht faqja kryesore, e cila do ta prmbaj seksionet kryesore t faqes:
DOCTYPE
HEAD
BODY
Brenda ksaj faqeje i bjm t gjitha linkimet me CSS fajlla, me JavaScript, e vendosim header-in,
navigacionin, footer-in, sidebar-in, div-in pr prmbajtjen specifike t faqeve, etj.
Te div-i ku duhet t vendoset prmbajtja specifike e faqeve, vendoset kodi:
1
Ta rishqyrtojm ndryshe:
E formojm faqen layout.html dhe aty vendosim gjith HTML/CSS/JavaScript kodin e
nevojshm t faqes. Pra, t gjitha elementet e prbashkta pr t gjitha faqet.
79
Variablat n Twig
Pr shtypjen e vlers s nj variabli, prdoren shenjat {{ var }}. Ky sht ekuivalent me <?=$var;?>
ose <?php echo $var; ?> n PHP.
Pra, nse n kontroller e kemi ruajtur vlern e nj variabli si $data[tvsh] = 16, at do t mund ta
printojm me Twig duke shnuar {{ tvsh }}.
Twig, do vlere q drgohet n view i bn escape, q dmth i largon t gjitha HTML tag-at. Kjo bhet
pr shkaqe sigurie, pr ta eliminuar rrezikun nga XSS (cross-site scriptin). Megjithat, nse ndonj
variable nuk dshirojm tia heqim tag-at, e prdorim opsionin raw.
1
{{ tabela | raw }}
Variabli tabela sht drguar nga kontrolleri si nj HTML tabel q prmban <table>, <tr>, <th>,
<td>. Nse e prdorim n view pa opsionin raw, ajo nuk do t shfaqet si tabel, por do t jet tekst i
thjesht.
Strukturat n Twig
if
1
2
3
{% if auth %}
<input class="btn btn-success" type="submit" value="Bleje">
{% endif %}
ifelse
1
2
3
4
5
6
7
8
{% if auth %}
<li><a
<li><a
<li><a
{% else %}
<li><a
<li><a
{% endif %}
href='/shporta'>Shporta</a>
href='/profili'>Profili</a>
href='/logout'>Logout</a>
href='/login'>Login</a></li>
href='/signup'>Regjistrohu</a></li>
for
1
2
3
{% for o in OS %}
<option value='{{ o.id }}'>{{ o.emri }}</option>
{% endfor %}
set
1
{% set a = 5 %}
80
Kriptimi
T dhnat n Web transferohen n form t fajllave tekstual. Edhe nse sht prdorur SSL pr ta
shifruar komunikimin browser-server, ato t dhna prap kthehen n trajt tekstuale n momentin
e arritjes n server.
Pra, t dhnat e pranuara me cilndo metod (GET, POST, databaz, JSON, etj.) dhe pa marr
parasysh a sht prdorur a jo SSL, n prfundim t procesit t transferimit - ruhen si tekste t
rndomta.
Kshtu, ato t dhna edhe kur ruhen n databaz, do t jen t ruajtura si tekste. Nse ndodh q
dikush me SQL injection attack arrin ti qaset t dhnave n server, ai do t jet n gjendje ti lexoj
t dhnat e ruajtura aty. Kjo n veanti sht e disfavorshme nse t dhnat jan sensitive, si jan:
fjalkalimi, numri i kartels s kreditit, t dhnat financiare, etj.
Pr ta parandaluar rrezikun e leximit t t dhnave sensitive nga databaza, duhet t prdoren metoda
t shifrimit t t dhnave n server.
Jan dy metoda kryesore pr shifrimin e t dhnave:
Crypt
Hash
N kt kapitull do t fokusohemi vetm n cryptographic hash functions.
Hash
Hash sht nj metod tjetr e shifrimit t t dhnave, veori kryesore e s cils sht se teksti i
enkriptuar nuk mund t rikthehet n formn e vet origjinale. Pr kt, ky algoritm gjen zbatim
vetm n raste t caktuara, dhe kryesisht prdoret pr enkriptimin e fjalkalimeve (password), si
dhe pr verifikimin e integritetit t fajllave (checksum).
Funksionet n PHP pr hash jan:
hash()
md5()
sha1()
Pr nevojat e aplikacionit ton, ne do t prqndrohemi vetm n sha1(), por parimet jan t njjta
pr secilin prej funksioneve t cekura.
E marrim shembull nj fjalkalim t mundshm: ick2015.
Kriptimi
1
2
3
4
82
<?php
$fjalekalimi = "ick2015";
echo $fjalelalimi." ".sha1($fjalekalimi);
?>
Rezultati:
1
ick2015 1488c61e22f54e75d43ac3935fea5e85451eb6be
Kriptimi
83
Nse zgjedhim q fjalkalimin e antarit ta ruajm si plain text, pra tekst t pashifruar, kjo ka ndikim
negativ n sigurin e t dhnave t antarve sepse ato t dhna sensitive mund t nxirren me nj
SQL injection attack si u cek n fillim. Prandaj, fjalkalimet ruhen n form t hash, sepse sulmuesi
q vie n dispozicion t tabels s antarve, nuk do t jet n gjendje tua dij fjalkalimet duke
u bazuar n hash. Pa marr parasysh far fjalkalimesh kan pasur dhe far gjatsie kan pasur
fjalkalimet, n kolonn e fjalkalimeve, sulmuesi do t shoh vetm vargje shkronjash e numrash
t rastsishme me gjatsi prej 40 karakteresh. Duke ditur se nuk mund t ket funksion q e bn
t kundrtn e sha1(), ne mund t pretendojm se t dhnat jan t palexueshme pr sulmuesin.
Rainbow tables
Por, n praktik, ka dallim fare t vogl n nivelin e siguris ndrmjet plain text dhe hash!
Pse?! Sepse tashm nj koh t gjat jan duke u formuar databaza tejet t mdha n t cilat ruhen
tekste t ndryshme t shkurtra bashk me hash-in korrespondues. Mjafton q t shnohet hash-i,
dhe nga databaza do t nxirret teksti origjinal brenda nj kohe t shkurtr! Pra, nuk ka nevoj q
ndonj kompjuter t punoj me or e dit t tra pr t br crack, mjafton vetm nj krkim n
databaz! Kto quhen rainbow tables dhe tashm ka n qarkullim databaza t tilla t madhsis
prej disa Tb.
Shembull: https://crackstation.net
Nse e marrim psh fjaln tralala, me sha1() do ta fitojm kt hash:
bb31fbff8fac91c17ee6052d98084e6e63184859
Tash, kt hash e kopjojm dhe e vendosim n fushn prkatse t Web sajtit t cekur dhe shtypim
butonin Crack Hashes. Si rezultat do t shfaqe fjala tralala.
Npr rainbow tables, gjasat m t mdha pr tu thyer i kan fjalkalimet vijuese:
Kriptimi
84
Hash-at e dhn si shembull mund t testohen n Crack Station, dhe do t shohim se t gjithave u
gjindet teksti origjinal!
Meq n rainbow tables tashm ruhet nj numr enorm i hash-ave dhe ky numr sht gjithnj
n rritje, ruajtja e fjalkalimeve n form hash-i ka fare pak vler n aspektin e siguris, nse
kemi parasysh fjalkalimet e shkurtra dhe ato tipike. Fjalkalimet e gjata dhe komplekse (q
prbhen nga kombinimi i shkronjave t vogla e t mdha, numrave dhe shenjave speciale, psh.
k!uhFRn9ds54&!2) nuk jan t rrezikuara nga thyerja n rainbow tables. Thn m sakt,
ende jo. Me rritjen e fuqis procesorike t kompjuterve, n veanti kur ato lidhen n distributed
computing, si dhe t rnies s mimit t disqeve me kapacitet t madh, nuk sht larg dita se kto
tabela do t prmbajn edhe fjalkalime komplekse, e me kt ti diskualifikojn fjalkalimet q sot
mund t konsiderohen t sigurta.
Fjalkalimet komplekse, ndonse m t sigurta, ato jan t vshtira pr tu mbajtur n mend nga
antart. Pr kt arsye, dikush i ruan fjalkalimet komplekse psh n email, dhe kshtu i hapin dyert
atyre q arrijn tua thejn llogarin e emailit, me rast do t jen n gjendje ti marrin kto
fjalkalime! Nse ruani fjalkalime t tilla n inbox, ather s paku bjeni fjalkalimin e emailit
sa m kompleks e megjithat t mbajtshm n mend. Apo edhe m mir: fjalkalimet komplekse i
printoni dhe i ruani si hard copy n ndonj vend t sigurt.
Ju mund t formoni fjalkalime komplekse edhe nga tekstet q mbahen n mend leht. Psh. e marrim
fjaln Prishina. At mund ta shnojm si pR!$hT!nA, ku njra shkronj sht e vogl e ajo vijuesja
e madhe e kshtu me radh (p-R-h-T-n-A), shkronja i sht zvendsuar me !, ndrsa shkronja
S sht zvendsuar me $. Ky sht fjalkalim kompleks por q bazohet n nj fjal e njohur.
Salt
Nj zgjidhje q mund ta prmirsoj nivelin e siguris s fjalkalimeve sht ajo me prdorimin e
salt. ka sht salt? sht nj numr apo varg shkronjash e numrash, psh: 521457826, a9d5re2.
Salti i bashkangjitet fjalkalimit n fillim apo n fund, dhe pastaj nxirret hash-i, q n kt rast do
t jet krejt tjetrfare.
Shkojm me shembull: Fjala prishtinacity e ka si hash stringun 16c952e331eb893de13258bafe24e0d126d3e7c1.
E marrim nj salt, psh. 521457826 dhe ia bashkangjesim n fillim dhe e nxjerrim hashin:
sha1(521457826prishtinacity); me rast fitohet hashi i ri: c720ec040d745b38e97df275130c801d7af344aa
Ky tash sht hashi i nj fjalkalimi kompleks i prbr nga 22 karaktere, dhe si i till, ka pak gjasa
t gjendet n ndonj rainbow table. Edhe po t dekriptohej nga rainbow tables, do t rezultonte
si 521457826prishtinacity, ndrkoh q fjalkalimi real sht prishtinacity, kshtu q prap do t
ishte i paprdorshm. Natyrisht, me shikim t kujdesshm, kt fjalkalim megjithat do ta gjenim
sepse i paraprin nj varg i numrave, t cilat kur i heqim e fitojm fjalkalimin e pastr. Pr kt,
pr siguri sa m t lart, n vend t numrave duhet t prdoren vargje alfanumerike, pra shkronja e
numra, asisoj q sulmuesi ta ket sa m t vshtir t kuptoj se ku fillon e ku mbaron fjalkalimi,
e cila pjes sht salt, pra fragment i shtuar.
85
Kriptimi
$pass1 = trim($_POST['password1']);
Kriptimi
86
nga POST dhe i bashkangjitet salt-it t lexuar nga databaza, dhe n at form t bashkuar iu nxirret
hash-i. - Krahasohet hashi i prfituar kshtu me hashin q m par u lexua nga databaza. - Nse
hashat nuk jan t njjt, dmth fjalkalimi i shnuar n formular nuk ka qen i sakt. Raportohet
gabimi, jepet opsioni pr t br login srish. - Nse hashat jan t njjt, ather konkludohet se
fjalkalimi i shnuar n formular sht i njjt me at q sht ruajtur n databaz. Me kt rast, n
variablin e sesionit $_SESSION[auth] vendoset vlera TRUE. - Gjithkund npr skripta ku lejohet
aksesi vetm antarve bhet verifikimi me:
1
Nse plotsohet kushti, antari ka akses n at faqe. Nse jo, atij i raportohet se nuk ka privilegje
pr ta vizituar at faqe, apo redirektohet n Page Not Found.
N rastet kur nj antar e harron fjalkalimin e vet, nuk do t jet e mundur q atij ti drgohet
fjalkalimi sepse, si u cek m sipr, nga hash-i nuk mund t prfitohet teksti origjinal. N kto
situata, duhet t krijohet nj fjalkalim i ri q antarit i drgohet n email n form jo t kriptuar,
ndrsa n databaz regjistrohet e kriptuar.
Dictionary attack
Hashi i kombinuar me salt sht trsisht joefektiv karshi dictionary attack!
ka sht dictionary attack?
Si e pam, salt i bn komplekse edhe fjalkalimet e thjeshta, duke ia shtuar nj varg numrash prpara
apo prapa. Mirpo, fjalkalimet e enkriptuara me hash dhe salt jan t efektshme pr mbrojtje nga
ata q e kan n dor tabeln e antarve nga databaza.
Ndrsa, dictionary attack bhet asisoj q nj skript e thirr direkt faqen ky lexohen POST data (n
aplikacionin ton check.php), duke i drguar fjalkalime nga nj tabel e paraprgatitur e mijra
fjalkalimeve t mundshme. Kjo mund t realizohet psh me funksionet e caktuara t PHP apo t
ekstensionit cURL.
Pr kt sht me rndsi q t bllokohet qasja n skriptn q i lexon POST data, duke verifikuar
nse at skript e ka thirrur ndonj skript tjetr e aplikacionit ton, apo krkesa ka ardhur nga
jasht. Pr kt mund t prdoret superglobali $_SERVER[PHP_REFERER]. Por, kjo variabl e
lexon vlern nga HTTP requests, e kto edhe mund t falsifikohen nga sulmuesi me eksperienc.
Konkluzioni: Vetm fjalkalimet komplekse ofrojn nj nivel sigurie, por megjithat - n Web kurr
nuk ka mjaft siguri.
Testimi i algoritmeve t ndryshme pr hash, mund t bhet duke klikuar n linkun vijues:
http://hide.al/hash
http://hide.al/hash
MySQL
MySQL sht server pr databaza relacionale i cili n radh t par prdoret pr Web databaza, n t
cilat mbshteten aplikacionet dinamike. Prve versioneve komerciale (MySQL Enterprise Edition,
MySQL Cluster), ofrohet edhe versioni pa pages MySQL nn emrtimin MySQL Community
Server (). MySQL ka prhapje t gjer dhe sht n ofertn standarde t t gjitha kompanive t
hostingut. Prdoret nga firma si: Yahoo! Finance, MP3.com, Motorola, NASA, Silicon Graphics, Texas
Instruments, etj.
MySQL prdor standarde t hapura si jan ANSI SQL 99, pr t komunikuar me databaza nprmes
gjuhs SQL (Structured Query Language). Ky standard mundson selektimin, futjen, prditsimin
dhe fshirjen e t dhnave nga databaza.
MySQL prdoret n shum sisteme operative, si jan: Linux, Windows, Mac OS X, BSD dhe varianta
t ndryshme t UNIX.
N kuadr t aplikacionit ofrohet edhe klienti pr rreshtin komandues interaktiv, i cili mundson
komunikim n me serverin. Prve ksaj, MySQL ofron edhe metoda t tjera t qasjes n databaz,
si p.sh. nprmes Web-it (phpMyAdmin), apo programit aplikativ MySQL Workbench (GUI Tool).
MySQL u mundson gjuhve t ndryshme programuese ti qasen databazs, ku mund ti numrojm:
PHP, Python, Perl, C, C++, C#, Java, etj.
mysqli
Konektimi me databaz
Pr konektim me databaza, PHP prdor tri API t ndryshme:
PHPs MySQL Extension
PHPs mysqli Extension
PHP Data Objects (PDO)
Ne do ta prdorim ekstensionin mysqli (MySQL Improved), meqense ekstensioni MySQL nuk
rekomandohet t prdoret pr arsye t siguris.
Ekstensioni mysqli mundson prdorimin n stilin procedural dhe stilin OOP (Object Oriented
Programming), prej t cilave ne do ta prdorim t parn pr spjegim m t thjesht.
Veprimi i par q duhet t bhet sht akti i lidhjes, gjegjsisht konektimit n databaz.
Me kt rast duhet t ofrohen t dhnat vijuese:
Ata q prdorin WAMP, nse nuk e kan konfiguruar ndryshe, do ti prdorin kto vlera:
89
mysqli
Natyrisht, n servert e produksionit, pra n remote host, n asnj mnyr nuk lejohet krijimi i
prdoruesit pa fjalkalim. Fjalkalimi duhet t jet i gjat dhe kompleks, pr shkaqe sigurie.
Meqense shum skripta t aplikacionit mund t ken nevoj pr tu konektuar me databazn, nuk do
t ishte praktike q n seciln thirrje t funksionit mysqli_connect() ti shnojm direkt t dhnat
e krkuara (host, name, user, password). Kjo pr arsye se kur dshirojm ta ndryshojm ndonjrn
nga kto vlera, ndryshimet do t duhej ti bnim n seciln prej skriptave.
Pr kt shkak, rekomandohet q t dhnat pr konektim n databaz t vendosen n nj fajll t
veant, i cili fajll do t inkludohet (me require ose include) kudo t jet nevoja. Nse duhet t
ndryshohen parametrat, ndryshimet bhen vetm te ai fajll.
db.php
1
2
3
4
define("DB_HOST",
define("DB_USER",
define("DB_PASS",
define("DB_NAME",
"localhost");
"root");
"");
"ickshop");
skriptat:
1
2
3
4
5
include("db.php");
$dbcon = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
.
.
.
Funksionet kryesore
mysqli_connect()
Hapja e nj koneksioni t ri me MySQL serverin. Si vler kthyese e jep nj objekt i cili e prfaqson
at koneksion.
Sintaksa:
1
mysqli_connect(host,username,password,dbname,port,socket);
90
mysqli
Argumenti socket, q tregon emrin e MySQL socket file, nj fajll i formatit t veant pr
transmetimin e t dhnave n server dhe nga serveri. Krijohet automatikisht dhe lokacionin
prcaktohet n my.ini, me direktivn socket.
N Windows: C:\wamp\bin\mysql\mysql5.6.17\my.ini
1
socket
= /tmp/mysql.sock
N rast se konektimi dshton, vlera kthyese e funksionit sht FALSE. Kjo vler mund t shfrytzohet
pr t verifikuar nse konektimi ka qen i suksesshm.
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$dbcon = mysqli_connect("localhost","root","","ickshop");
if (!$dbcon)
{
echo "Konektimi dshtoi!";
die();
}
.
.
.
?>
mysqli_set_charset()
Caktimi i character set t koneksionit.
Prdoret vlera utf8 pr kompatibilitet me shumicn e alfabeteve botrore.
Gjat krijimit t databazs, si vler pr Collation mund t prdoret utf8_unicode_ci.
N HTML dokumente, meta tagu charset duhet t jet <meta charset="utf-8">.
Me kto veprime sigurohet q t mos shfaqen karaktere t gabuara npr faqet e sajtit, q mund t
jen pasoj e mosprputhjes s character set.
1
mysqli_set_charset($dbcon, 'utf8');
mysqli_connect_errno()
Tregon kodin e gabimit q paraqitet n rastet kur dshton konektimi n server.
2002 - Serveri e refuzon konektimin. Hosti nuk ekziston ose porti i gabuar.
1044 - Prdoruesit t cekur i refuzohet konektimi n server. Emr i gabuar.
1045 - Prdoruesit t cekur i refuzohet konektimi n server. Fjalkalim i gabuar.
1049 - Databaz e panjohur. Emri i databazs nuk sht shkruar mir.
91
mysqli
mysqli_connect_error()
Njjt si mysqli_connect_errno(), por raportet jan tekstuale.
2002 - No connection could be made because the target machine actively refused it.
1004 - Access denied for user @localhost to database ickshop
1045 - Access denied for user root@localhost (using password: YES)
1049 - Unknown database ickhshop
mysqli_real_escape_string()
Sintaksa:
1
mysqli_real_escape_string(connection,escapestring);
Prdorimi:
1
mysqli_query()
Ekzekutimi i SQL krkesave.
mysqli_fetch_array()
1
mysqli_num_rows()
Prdorimi: mysqli_num_rows($dbcon);
Tregon sa rekorde t tabels jan lexuar me ekzekutimin e nj urdhri SELECT.
mysqli
92
mysqli_affected_rows()
Prdorimi: mysqli_affected_rows($dbcon)
Tregon mbi sa rekorde t tabels ka pasur efekt ndonjri prej urdhrave: UPDATE, DELETE apo
INSERT. Pr shembull, sa rekorde jan fshir me ekzekutimin e SQL krkess s fundit q prmban
DELETE.
mysqli_free_result()
Prdorimi:
1
mysqli_free_result($result)
E largon rezultatin e nj SQL krkese t ekzekutuar nga RAM memorja e Web serverit. Shpesh ndodh
q SQL krkesat t lexojn nga ndonj tabel nj sasi t madhe t rreshtave, ku t gjitha ato vendosen
brenda nj variabli, si n shembullin vijues:
1
2
Nse SQL krkesa ka kthyer 1000 rreshta nga tabela products, t gjith ata rreshta jan t ruajtura
brenda variablit $result, efektivisht duke e ngarkuar RAM memorjen. Sapo t procesohen t dhnat
e ruajtura n $result, ai variabl duhet t zbrazet, pr ta liruar RAM memorjen. Kjo sht me
rndsi sepse n Web server mund t jen t vendosur shume Web sajte ku secila mund t ket
shum vizitor, ndrkoh q RAM memorja sht nj resurs q shfrytzohet bashkarisht nga t
gjith, prandaj duhet ta shfrytzojm sa m racionalisht.
mysqli_close()
Prdorimi:
1
mysqli_close($dbcon)`
Shembuj me mysqli
Leximi i t dhnave nga nj SQL tabel
Leximi i t dhnave nga tabela products. Jan lexuar fushat Pro_ID dhe Pro_Name.
1
2
3
4
5
6
7
8
9
10
11
Prepared statements
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$link = mysqli_connect("localhost", "root", "", "ickshop");
if (!$link) {
$error = mysqli_connect_error();
$errno = mysqli_connect_errno();
print "$errno: $error\n";
exit();
}
$query = "SELECT * FROM products WHERE Pro_Cat_ID=?";
$stmt = mysqli_stmt_init($link);
if (!mysqli_stmt_prepare($stmt, $query)) {
print "Failed to prepare statement\n";
} else {
$category = "1";
Shembuj me mysqli
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
echo "<table>";
while ($row = mysqli_fetch_assoc($result)) {
echo "<tr>
<td>" . $row['Pro_ID'] . "</td>
<td>" . $row['Pro_Name'] . "</td></tr>";
}
echo "</table>";
}
mysqli_stmt_close($stmt);
mysqli_close($link);
?>
94
error_reporting
display_errors, log_errors, error_log
$_REQUEST - Rasti 1
Nj ndr masat parandaluese m bazike sht verifikimi i burimit t inputit. Nuk bn t procedojm
me nj input nse ai vie nga nj burim tjetr nga ai q ne presim. E ilustrojm kt me rastin e
superglobalit $_REQUEST.
Superglobali $_REQUEST sht nj varg (array) q n vete prmban vlerat e drguara me $_POST,
$_GET dhe $_COOKIE. Nse e kemi nj formular si vijon:
login.php
1
2
3
4
5
shohim se metoda e drgimit sht POST dhe se drgohet fusha e quajtur fjalekalimi.
Skripta q e lexon kt vler, mund t duket kshtu:
check.php
1
2
3
<?php
$f = $_POST['fjalekalimi'];
?>
1
2
3
96
<?php
$f = $_REQUEST['fjalekalimi'];
?>
Ku qndron dallimi? Dallimi ndrmjet versionit t par t check.php dhe atij t dyt qndron n
faktin se t dyts mund ti japim vler edhe me GET, gjegjsisht me URL, pa pasur nevoj ta
plotsojm formularin n login.php:
1
http://domaini.com/check.php?fjalekalimi=abc5847
Tash, sulmuesi e ka shum m leht t provoj kombinime t ndryshme t fjalkalimit, vetm duke
i ndryshuar vlerat n URL. Apo, nse sht n pyetje mimi i nj produkti - t manipuloj me t n
URL.
$_REQUEST - Rasti 2
N t njjtn mnyr mund t manipulohet edhe me prmbajtjen e cookie, nse nuk e kemi
konfiguruar PHP-n si duhet. Nse n php.ini, n direktivn request_order e shnojm vlern
CGP (COOKIE-GET-POST), e jo GPC (GET-POST-COOKIE) si sht vlera standarde, sht i
mundur ekzekutimi i skriptave vijuese.
test.php
1
2
3
4
<?php
setcookie("anetari", "123456", time() + 3600);
header("Location: test2.php");
?>
test2.php
1
2
3
4
<?php
$s = $_REQUEST['anetari'];
echo $s;
?>
Me nj link si ky:
1
http://domaini.com/test.php
97
http://domaini.com/test2.php?anetari=54847
do t ndryshohet vlera e asaj q sht dashur t lexohet nga cookie me emrin anetari, vler kjo
q m pas do t regjistrohet n databaz, apo do t prdoret pr procesim t mtutjeshm. Kjo pr
shkak se i kemi dhn prioritet metods GET n krahasim me at COOKIE pr leximin e vlers s
variablit me emr t njjt.
Por, sht i mundur edhe skenari i dyt, q ska lidhje me request_order: q skripta test2.php t
thirret direkt, me URL-n e cekur m sipr, por tash n incognito mode apo n browser tjetr, apo
duke i fshir paraprakisht cookies n browserin q jemi duke e prdorur.
N kt situat, skripta nuk sht n dijeni se vlera e krkuar duhet t krkohet n cookie sepse ai
cookie as q ekziston, prandaj me $_REQUEST e lexon vlern e pranuar me GET, pra nga URL-ja.
Kshtu, me nj manipulim t thjesht n URL, do t jemi n gjendje ta ndryshojm vlern e cookie,
me pasoja n rrjedhn e mtutjeshme t programit, varsisht prej asaj se pr ka do t prdoret ajo
vler.
Vrejtje: N konfigurimet e reja t PHP, sht pamundsuar leximi i cookie nga $_REQUEST.
php.ini:
1
request_order = "GP"
Shohim se n $_REQUEST lejohet vetm GET (G) DHE POST (P), ndrsa COOKIE (C) mungon.
Request order prcakton renditjen e leximit t vlerave, n rastet kur variabli n GET ka emr t
njjt me at n POST.
Pra, nse n nj formular e kemi fushn emaili, dhe skriptn q e proceson at formular e thirrim
me nj URL q ka n fund nj query string si kjo:
1
ather, $_REQUEST n skriptn pranuesi i ka dy vlera t quajtura emaili, dhe njra nga kto duhet
t eliminohet.
Me request_order = GP i jepet prparsi variablit q ka ardhur me metodn POST, pra ajo i bn
overwrite variablit me emrin e njjt q ka ardhur me metodn GET. Me kt mundsohet q vlerat
e drguara me formular, t mos mbulohen me vlera t shnuara n URL.
Eliminimi i cookie nga request_order nuk e parandalon skenarin e dyt q u cek m sipr.
Konkluzion: nse presim q nj vler do t vie me metodn GET - e lexojm me $_GET, at me POST
e lexojm me $_POST, dhe n fund, inputet nga COOKIE do ti lexojm vetm me $_COOKIE. N asnj
mnyr nuk duhet t mbshtetemi n $_REQUEST pr shkak t situatave t prmendura m lart.
98
Client-side validation
Shum Web developer nuk i japin aq fort rndsi validimit t t dhnave n PHP, por mjaftohen
me masat e ndrmarra n front-end: HTML dhe JavaScript.
Pr shembull:
Nse sht plotsuar nj fush
Nse emri ka minimalisht x shkronja,
Nse nj vler numerike sht brenda nj intervali t paracaktuar, etj.
N HTML5, te fushat q duhet patjetr t plotsohen shtohet atributi required, me ka do t
pamundsohet drgimi i vlerave t fushave t formularit n server. Por, kjo mbrojtje sht e
dobishme vetm si prkujtues vizitorve t faqes se kan harruar ta plotsojn ndonj fush t
caktuar, dhe vlera e asaj fushs duhet t verifikohet edhe njher: kur t arrij n server, gjegjsisht
n skriptn q e proceson at formular.
Kjo pr shkak se atributi required leht mund t largohet me Inspect element n browser.
JavaScript (e me t edhe jQuery) mund t deaktivizohet nga browseri trsisht, duke pamundsuar
fardo client-side validation.
N kto rrethana, t dhnat q i drgohen serverit do t jen trsisht t pavaliduara dhe skripta jon
nuk guxon ti marr ashtu si jan, por duhet s pari ti validoj dhe pastroj, para se t procedohet
m tutje me to.
Pra, validimi me HTML apo JavaScript duhet t konsiderohet vetm si nj lehtsim pr vizitorin pr
ti parandaluar gabimet e mundshme gjat shnimit t t dhnave, por assesi si t dhna tashm t
verifikuara. Verifikimet e bra n client-side, duhet t prsriten edhe n server-side.
Kodi n JavaScript/jQuery:
1
2
3
4
5
99
$emri = $_POST['emri'];
if (strlen($emri) < 3)
{
echo "Minimum 3 shkronja pr emrin!";
}
shkruajm:
1
apo duke ia shnuar emrin e folderit prpara emrit t skripts, nse skripta gjendet brenda ndonj
folderi. Me kt modifikim, ne do t jemi n gjendje t drgojm t dhna skripts test.php nga
faqja q e kemi ruajtur n kompjuterin ton!
Anti-CRSF token
Pr tu mbrojtur nga situata t tilla, ne duhet formularve tua shtojm nga nj fush t tipit hidden,
n t cilin do t vendosim nj vler t rastsishme (anti-CRSF token). Ajo vler njkohsisht ruhet
edhe n nj variabl sesioni. Skripta q i lexon vlerat nga formulari, duhet ta krahasoj vlern q vjen
nga fusha e fsheht me vlern e ruajtur n variablin e sesionit. Nse kto vlera prputhen, kjo do t
thot se formulari sht plotsuar nga faqja e pamodifikuar. N t kundrtn, skripta sht furnizuar
me t dhna nga nj faqe e modifikuar, nga nj skript ku manipulimet bhen me PHP, apo duke u
prdorur ndonj metod tjetr, si psh me prdorimin e biblioteks cURL (http://curl.haxx.se/), i
cili n mnyr programore mund t drgoj POST request.
form.php
1
2
3
4
5
6
7
8
9
10
11
100
<?php
session_start();
$crsftoken = md5(uniqid(rand(), true));
$_SESSION['token'] = $crsftoken;
?>
<form action='formcheck.php' method="post">
<label for="emri">Emri:</label>
<input type="text" name="emri">
<input type="hidden" name="token" value="<?=$crsftoken;?>">
<input type="submit" value="Submit">
</form>
formcheck.php
1
2
3
4
5
6
7
8
9
10
11
<?php
session_start();
$token = $_POST['token'];
if ($_SESSION['token'] != $token)
{
die("Input jovalid!");
}
$emri = $_POST['emri'];
echo $emri;
Nse formularin do ta kishim t ruajtur lokalisht, ose nse do t prdornim cURL, vlera e fushs
crsftoken do t ishte e zbrazt, kshtu q me krahasimin e asaj vlere me vlern e ruajtur n $_SESSION[token] do t konstatohet se origjina e faqes s formularit nuk sht serveri yn.
Edhe sikur ti jepnim ndonj vler asaj fushe, gjasat jan tejet t vogla, mos t thn inekzistente, se
do ta kishte vlern e hash-it t nj numri t rastsishm, t ciln e gjeneron serveri, seciln her me
vler tjetr, sa her q hapet faqja e formularit.
Duhet t theksohet se kjo mbrojtje ka kuptim vetm pr formulart q jan brenda faqeve t
autentikuara me $_SESSION! Nse faqet jan publike dhe tokeni i pandryshueshm, ather sulmuesi
mund ta gjej tokenin thjesht duke e lexuar nga View Page Source.
Ruajtja e tokenit si variabl sesioni i ka edhe t metat e veta, nse at e gjenerojm sa her hapet
formulari. Kjo vie n shprehje kur e hapim formularin e njjt disa her n browser tabs t ndryshm.
N kt situat, kur hapet tab-i i dyt, vlera e variablit t sesionit ndryshohet, pra zvendsohet me
nj vler t re. Kur kthehemi te tab-i i par pr ta drguar formularin, skripta do ta konsideroj si
CRSF sepse tokeni i ruajtur si fush e fsheht n formular nuk prputhet me vlern e tokenit n
variabln e sesionit.
101
Dispatch Method
Kjo ka t bj me vet arkitekturn e aplikacionit, ku vetm nj skript thirret nga URL-ja, ndrsa,
varsisht nga parametrat e drguar me GET, ajo skript cakton cila skript do t inkludohet/ekzekutohet.
Shembull i URL-s s nj aplikacioni t bazuar n dispatch method:
1
http://domaini.com/index.php?cmd=kontakti
Gjat gjith kohs, thirret vetm dispatch.php, ndrsa brenda saj bhen thirrjet e skriptave t tjera.
1
2
3
4
5
6
7
8
9
10
11
switch ($_GET['cmd'])
{
case 'login':
require 'login.php';
break;
case 'check':
require 'check.php';
break;
.
.
.
Duke i analizuar inputet me switch, ne efektivisht jemi duke i eliminuar inputet q nuk jan t
numruara n case, duke parandaluar kshtu inkludimin arbitrar t skriptave, si ktu:
1
requre($_GET['cmd'].".php");
ku do t tentohej inkludimi i cilitdo fajll q ceket n query string t URL-s, e ku mund t ishte ndonj
fajll me t dhna sensitive, apo edhe nj URL i nj serveri tjetr (nse direktiva allow_url_fopen n
php.ini sht On, e q by default edhe sht. Po t mundsohej inkludimi i nj skripte nga nj URL
jasht domainit ton, pasojat mund t jen shkatrrimtare sepse sulmuesi aty mund t fus kod i cili
do t akomodohej n serverin ton, ku do t mund t ndrmerrte fardo veprimi, si psh: nxjerrja
e t dhnave, fshirja e databazs, etj.
Kjo qasje, n aspektin e siguris e ka nj avantazh t madh: t gjitha masat e siguris q jan t
domosdoshme t ndrmerren pr t gjitha skriptat, mund t implementohen brenda ktij fajlli t
vetm. Nse ato masa do ti zbatonim ve e ve npr t gjitha skriptat, do t na paraqiteshin gabime
aty-ktu, sepse diku mund t harrojm t shtojm at q kemi shtuar n skriptat tjera.
Duke e centralizuar logjikn e siguris, ne e thjeshtsojm punn ton n skriptat tjera, te t cilat do
t jet e nevojshme vetm t fokusohemi n masat e siguris q jan specifike pr ato skripta.
I tr aplikacioni yn sht i bazuar n dispatch method.
102
define("THIRRJA", 1);
Kemi prdorur konstant e jo variabl, n mnyr q vlera e saj mos t ndryshohet aksidentalisht
gjat rrjedhs s ekzekutimit t programit.
Tash, n fillim t secils skript q inkludohet n index.php, duhet t vendoset rreshti i cili verifikon
se a ekziston ajo konstant:
1
http://domaini.com/?cmd=kontakti
ather skripta kontakti.php do t inkludohet dhe ekzekutohet, sepse, duke qen brenda fajllit
index.php, ajo do ta shoh vlern e konstants THIRRJA.
Mirpo, nse e njjta skript thirret me:
1
http://domaini.com/kontakti.php
ajo nuk do t ekzekutohet sepse, duke qen jasht index.php, ajo nuk sht n gjendje ta lexoj
konstantn THIRRJA, dhe kshtu q plotsohet kushti if (!defined('THIRRJA')), pra q konstanta
THIRRJA nuk sht e definuar, n mnyr q m pas t ekzekutohet exit('Nuk keni qasje
direkte'), e cila e ndrpren ekzekutimin e skripts.
1
2
3
4
103
<?php
$emaili = $_POST['emaili'];
$fjalekalimi = $_POST['fjalekalimi'];
?>
Qasja e gabuar:
1
2
3
4
5
<?php
foreach ($_POST as $key=>$value)
{
$$key = $value;
}
<?php
$level = $_SESSION['level']; // le t themi sht lexuar vlera 1
foreach ($_POST as $key=>$value)
{
$$key = $value;
}
if ($level == 2)
{
// Nj veprim destruktiv
}
Ku sht problemi n kt rast? Problemi sht se sulmuesi mund ta ket shtuar nj fush me emrin
level s cils ia jep vlern 2, dhe me kt, $_POST['level'] duke u shndrruar n $level me vlern
2, do ta mbuloj vlern paraprake t variablit $level q ka mundur t jet 1. Kshtu, kur analizohet
vlera me if ($level == 2), prgjigja do t jet pozitive, edhe pse n fakt, ai prdorues nuk e ka pasur
at vler kur sht lexuar vlera nga sesioni. Thn m qart, nga nj antar i thjesht u shndrrua
n administrator!
104
Pastrimi i inputit
do input duhet t konsiderohet si potencialisht i rrezikshm, pa marr parasysh burimin. Rreziqet
q vijn nga inputi i papastruar ndahen n dy grupe kryesore:
XSS (Cross site scripting)
SQL injection
Me XSS nnkuptohet futja e kodit potencialisht t rrezikshm (HTML, JavaScript) brenda tekstit q
drgohet me POST ose GET. Kjo rndom bhet kur kemi textarea n t cilat na lejohet t fusim tekst
t gjat.
106
E tr logjika e programit bazohet n struktura t tilla dhe fardo shkputja nga nj struktur
e till monolitike diku n ndonj rresht, si pasoj do t sjell rrnimin e programit - situata kur
programi ekzekutohet ndryshe nga ajo q sht planifikuar. N situata t tilla programi ose ndalet
sepse ka hasur n gabim, ose bn veprime t gabuara q rezultojn n rezultate t gabuara n fund.
Gjat ekzekutimit t nj programi t till, gjithmon sht i qart dallimi ndrmjet kodit dhe
variablave. Variablat ruajn vlera, kodi kryen nj veprim.
Nj stil i ktill i programimit sht i prshtatshm ather kur kemi t bjm me ndonj aplikacion
t thjesht. Me rritjen e kompleksitetit t aplikacionit, programuesi do ta ket gjithnj e m vshtir
ta mirmbaj kodin, pr arsye t ndryshme:
Shum kod i pasistemuar n nj vend,
Prdorimi i numri t madh t variablave, ku shum prej tyre mund t ken emra t njjt dhe
me kt, n mnyr t pahetueshme - e ndryshojn vlern gjat ekzekutimit t programit, gj
q e bn shum t vshtir gjetjen e gabimeve,
Prsritje e blloqeve t njjta t kodit npr skripta t ndryshme
Prfshirja e nj numri t madh t funksioneve, ku nj pjes e tyre as q prdoren brenda
aplikacionit
sht vshtir t shtohen gjra t reja n kod e t mos ndikohet pjesa tjetr e programit. Pra,
do shtojc e re mund t sjell probleme t reja.
sht i vshtir ristrukturimi i kodit sepse nxjerrja e nj blloku t kodit nga nj vend dhe
vendosja e tij n nj vend tjetr, mund t sjell probleme me rrjedhn e ekzekutimit t
programit.
E bn nj ndryshim qoft edhe t vogl diku dhe pasojat mund t shkojn n form t efektit
t ortekut teposht. Si shembull: nj ndryshim i emrit apo vlers s variablit, mund shkaktoj
pasoja n rreshtat vijues, sepse i gjith kodi vepron si nj trsi kompakte.
OOP sht nj metodologji q mbshtetet n marrdhniet ndrmjet objekteve, duke mundsuar
nj nivel t abstraksionit gjat prpilimit t programit. Nse pr shembull, aplikacioni yn sht nj
e-commerce site, me OOP do t izolohen n trsi t veanta objekti i blersit, objekti i produktit,
objekti i shports, etj.
Brenda objektit t shports do t ket: - Veti (properties), dhe - Metoda
Vetia sht nj emrtim tjetr pr variablat si i kemi msuar deri tash, ndrsa metoda sht nj
emrtim tjetr pr funksion. T dy kto shprehje prdoren n kontekst t OOP.
Vetit dhe metodat koekzistojn brenda objektit t njjt, pr dallim nga programimi procedural,
ku variablat dhe funksionet ishin qartsisht t ndara. N OOP, vlerat e variablave dhe funksionet
prkatse i shohim si nj objekt t vetm.
Objekti i shports q u morr si shembull, mund t ket kto veti (properties):
ID-n e produktit,
107
mimin e produktit,
Sasin e produktit, etj.
Poashtu mund t ket metoda:
Pr llogaritjen e vlers s produktit (sasia x mimi),
Pr llogaritjen e TVSH-s,
Pr llogaritjen e uljes s mimit pr konsumator t caktuar, etj.
Krijimi i nj klase
1
2
3
4
5
<?php
class Produkti {
}
Kjo klas sht plotsisht valide, por nuk kryen kurrfar pune (pr momentin).
Kt klas duhet ta ruajm me emrin produkti.php. Pra, parimi i prgjitshm sht: do klas
ruhet si fajll i veant dhe emri i fajllit duhet ti korrespondoj emrit t klass. Kjo praktikohet
pr ta mundsuar inkludimin automatik t klasave t nevojshme brenda nj skripte. Nse flasim me
terminologjin e MVC, kjo do t mundsoj leximin automatik t klasave brenda kontrollerve.
Ti deklarojm disa variabla.
1
2
3
4
5
6
7
<?php
class Produkti {
public $sasia;
public $cmimi;
protected $tvsh = 16;
private $vlera = 0;
}
108
vetis si t mbrojtur, ne parandalojm ndryshimin aksidental t atyre vlerave nga ana e kontrollerit.
Vetit e mbrojtura nuk jan plotsisht t izoluara: vlerat e tyre shihen nga nnklasat e nj klase, pra
nga fmijt e saj.
Vetia private (private) sht identike me at t mbrojtur, me at dallim q vlerat e vetis private nuk
shihen as nga nnklasat e asaj klase.
Nse dshirojm q kontrolleri ti shoh vlerat e vetive t mbrojtura dhe t atyre private, por
pa mundsin e ndryshimit t tyre, ne mund t ndrtojm funksione (gjegjsisht metoda, sipas
terminologjis s OOP), detyr e t cilave do t jet q ta tregojn vlern e nj vetie.
1
2
3
4
5
6
7
8
9
10
11
<?php
class Produkti {
public $sasia;
public $cmimi;
protected $tvsh = 16;
private $vlera = 0;
public function tregoTVSH() {
return $this->tvsh;
}
}
<?php
include("produkti.php");
$p = new Produkti;
$p->sasia = 5;
echo $p->tregoTVSH();
Vetia sasia mund t ndryshohet nga kontrolleri, por edhe mund t lexohet. Mirpo, n rastin e vetis
tvsh, ne nuk mund t shnojm $p->tvsh=10, sepse tvsh sht veti e mbrojtur, dhe si e till nuk
mund t ndryshohet direkt nga jasht klass. Ajo as nuk mund t lexohet direkt me echo $p->tvsh,
prap, pr shkak se sht veti e mbrojtur.
Megjithat, kontrolleri yn ka qasje n vlern e vetis tvsh duke e prdorur metodn tregoTVSH():
1
echo $p->tregoTVSH();
PHP frameworks
do zhvillues i PHP aplikacioneve, me kalimin e kohs fillon t ndrtoj funksione pr tu prdorur
n projekte t ndryshme. Mund t jen pr shembull funksione:
pr filtrimin e inputit
pr drgimin e emailave
pr analizimin e URL-s, etj.
Kto funksione nuk jan specifike pr nj projekt, por jan t nevojshme n secilin projekt t ri.
N vend t ruajtes s skriptave n nj folder, fillon ta organizoj n folder t veant, si psh:
controllers
models
views
configuration
libraries
helpers, etj.
ka karakter t prgjithshm,
ofron zgjidhje pr t cilat ka nevoj do aplikacion
ka nj struktur t caktuar t organizimit t fajllave,
mund t zgjerohet me module t reja, sipas nevojs
PHP frameworks
110
Symfony
Zend Framework
Laravel
CodeIgniter
Fuel PHP
YII
Micro frameworks:
Silex
Framework si PHP ekstension:
Phalcon
Cilin ta prdor?
N przgjedhjen e framework-ut ndikojn disa faktor:
PHP frameworks
111
Pr enterprise-level aplikacione prdoren Symfony dhe Zend Framework. T dyja kto jan shum
komplekse dhe krkojn njohje t shklqyeshme t OOP programimit.
Nj framework q po bhet mjaft i popullarizuar sht Laravel. At mund ta klasifikojm diku
ndrmjet CodeIgniter dhe Symfony, aq m tepr q mjaft komponente huazon nga Symfony.
Laravel karakerizohet me sintaks elegante dhe komponente t shklqyeshme, si jan:
Eloquent ORM, pr komunikim me databaza
Blade templating engine, pr ndrtimin e template-ve
Elixir, etj.
Nj framework q veohet nga t tjert sht Phalcon. Ky framework nuk sht i shkruar n PHP
si kto q u prmendn m sipr, por sht i shkruar n C dhe prdoret si PHP ekstension. Kjo
mundson q ai framwork t jet m i shpejti nga t gjith sepse kodi i tij nuk interpretohet por
sht i kompajluar.
GIT
git init
Komanda git init bn krijimin e nj Git depoje t re. Me t mund ta shndrrojm nj folder t
zbrazt n depo, apo edhe nj folder i cili tashm ka fajlla brenda. Me ekzekutimin e ksaj kmente
krijohet nj .git nnfolder brenda folderit kryesor t projektit, brenda t cilit do t vendosen t dhna
n lidhje me depon. Struktura ekzistuese e folderit nuk pson ndryshim.
N rreshtin komandues shfaqet raporti:
Initialized empty Git repository in E:/emri_i_folderit/.git/
Brenda folderit .git do t krijohen kta fajlla/folder;
.git folder
Referenca e funksioneve/urdhrave
t prdorura
array()
Krijimi i nj vargu, gjegjsisht matrice. N versionet e reja t PHP mund t shkruhet edhe si [ ].
checkdate()
Verifikon nse data sht valide.
Kthen TRUE nse sht valide, FALSE n t kundrtn.
1
2
3
<?php
var_dump(checkdate(2, 29, 2001));
?>
date()
Formatimi i dats.
1
2
3
<?php
echo "<p>Sot eshte data: ".date("d.m.Y")."</p>";
?>
die()
Ndrprerja e ekzekutimit t programit, po apo pa raportim.
Teksti i raportit vendoset si argument i funksionit.
1
echo
E printon nj tekst, numr, vler t variabls.
114
error_log()
error_reporting()
Nprmes ktij funksioni prcaktojm se cilat kategori t gabimeve t shfaqen n Web faqe.
error_reporting(0) - Nuk do t raportohet asnj gabim.
error_reporting(E_ALL) - Do t raportohen t gjitha gabimet.
error_reporting(E_ERROR | E_WARNING | E_PARSE) - do t raportohen vetm kategorit e
cekura.
error_reporting(E_ALL & E_NOTICE) - do t raportohen t gjitha prve ato t kategoris
notice.
exit()
E ndrpren ekzekutimin e skripts.
extract()
filter_var()
Bn pastrimit dhe validimin e inputit.
floatval()
for
Formon struktur ciklike, gjegjsisht iteracione. Kjo mundson prsritjen e ekzekutimit t nj blloku
t kodit.
header()
Drgimi i nj HTTP request.
if...else
Degzimi i programit, varsisht prej asaj a sht plotsuar ndonj kusht.
115
ignore_user_abort()
ini_set()
intval()
Konvertimi i nj vlere numerike n numr t plot (integer). Prve t tjerash, i dobishm pr
pastrimin e inputit, n rastet kur vlera e pritur sht integer.
isset()
Verifikon nse ekziston nj variabl.
mktime()
Si rezultat jep UNIX timestamp, n baz t parametrave t dhn.
1
2
3
4
5
<?php
date_default_timezone_set('UTC');
echo "<p>".date("d.m.Y h:i:s", mktime(19, 45, 12, 3, 8, 2012, 0))."</p>";
echo "<p>".date("d.m.Y h:i:s", mktime(19, 45, 12, 3, 8, 2012, 1))."</p>";
?>
nl2br()
Konvertimi i new line ne br, q mundson paraqitjen n HTML t rreshtave t rinj t textarea.
phpinfo()
Informata gjithprfshirse mbi ambientin e serverit.
print_r()
1
2
3
4
5
116
<?php
$ditet = array("E hn", "E mart", "E mrkur", "E enjte", "E premte", "E shtun\
", "E diel");
print_r ($ditet);
?>
session_start()
Fillimi i nj sesioni t ri, apo vazhdimi i nj sesioni t nisur.
setcookie()
Krijimi i nj cookie.
strip_tags()
Eliminon HTML tagat nga inputi, n trsi apo n mnyr selektive, varsisht nga opsionet e
prdorura.
strlen()
Tregon numrin e shkronjave t nj teksti.
1
2
3
4
<?php
$emri = "Innovation Centre Kosovo";
echo "<p>".$emri." ka ".strlen($emri)."shkronja.</p>";
?>
strval()
substr()
Shkput nj pjes t tekstit.
117
time()
E tregon kohn aktuale t matur si numr sekondash nga fillimin i UNIX Epoks (January 1 1970
00:00:00 GMT)
Shembull:
1
2
3
4
5
6
<?php
$javatjeter = time() + (7 * 24 * 60 * 60);
echo "<p>Tash:
". time()."</p>";
echo '<p>Tash:
'. date('d.m.Y')."</p>";
echo '<p>Pas 1 jave: '. date('d.m.Y', $javatjeter)."</p>";
?>
trim()
Eliminon whitespace nga inputi.
urlencode()
E bn tekstin t prshtatshm pr tu bartur n URL, duke eliminuar problemet me shenjat speciale.
var_dump()
Tregon prmbajtjen e nj variabli apo vargu. I dobishm gjat debugging.
1
2
3
4
5
<?php
$ditet = array("E hn", "E mart", "E mrkur", "E enjte", "E premte", "E shtun\
", "E diel");
var_dump ($ditet);
?>
Paraqet informata t strukturuara mbi variablat, duke prfshir tipin dhe vlern.
Matricat dhe objektet shqyrtohen n mnyr rekurzive.