0% found this document useful (0 votes)
316 views124 pages

Phpdhemysqlperfillestare

phpdhemysqlperfillestare

Uploaded by

NderimGuri
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
316 views124 pages

Phpdhemysqlperfillestare

phpdhemysqlperfillestare

Uploaded by

NderimGuri
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 124

PHP dhe MySQL pr fillestar

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

Tweet This Book!


Please help Tahir Hoxha by spreading the word about this book on Twitter!
The suggested tweet for this book is:
Libr shqip pr zhvillimin e Web aplikacioneve PHP dhe MySQL pr fillestar
The suggested hashtag for this book is #phpdhemysql.
Find out what other people are saying about the book by clicking on this link to search for this
hashtag on Twitter:
https://twitter.com/search?q=#phpdhemysql

Prmbajta
Parathnie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Hyrje n PHP . . . . . . .
Arkitektura klient/server
Web servert . . . . . . .
HTTP . . . . . . . . . .
1. sht PHP? . . . . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

2
2
2
2
3

Prgatitja e ambientit t puns . . . . . . . . . . . .


Instalimi dhe konfigurimi i LAMP/WAMP serverit
AMP stack . . . . . . . . . . . . . . . . . . . . . .
AMP stack: Cross-platform . . . . . . . . . . . . .
AMP stack: Linux . . . . . . . . . . . . . . . . . .
AMP stack: Mac . . . . . . . . . . . . . . . . . . .
AMP stack: Windows . . . . . . . . . . . . . . . .
IDE . . . . . . . . . . . . . . . . . . . . . . . . . .
Ekzekutimi i php skriptave . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

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

SEO friendly URLs . . . . . . . . . . .


mod_rewrite.so . . . . . . . . . . .
.htaccess . . . . . . . . . . . . . . .
Leximi nga superglobali $_SERVER
router . . . . . . . . . . . . . . . .

.
.
.
.
.

70
70
71
72
73

Template Engine - Twig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

Aspekte t siguris n PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

95

Object Oriented Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105


Krijimi i nj klase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
PHP frameworks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Lista e PHP frameworks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Cilin ta prdor? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
GIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
git init . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Referenca e funksioneve/urdhrave t prdorura
array() . . . . . . . . . . . . . . . . . . . . . .
checkdate() . . . . . . . . . . . . . . . . . . . .
date() . . . . . . . . . . . . . . . . . . . . . . .
die() . . . . . . . . . . . . . . . . . . . . . . . .
echo . . . . . . . . . . . . . . . . . . . . . . . .
error_log() . . . . . . . . . . . . . . . . . . . .
error_reporting() . . . . . . . . . . . . . . . .
exit() . . . . . . . . . . . . . . . . . . . . . . .
extract() . . . . . . . . . . . . . . . . . . . . .
filter_var() . . . . . . . . . . . . . . . . . . .
floatval() . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

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

Me burim t hapur (open source)


Pa pages
I instaluar n miliona Web server
Platform pr edhe m tepr Web sajte
I ngjashm me C pr nga sintaksa
Mund t zgjerohet me biblioteka n gjuht e tjera

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

Kjo gjuh programore sht gjuh tejet e sofistikuar.


Ka sintaks t qart dhe konzistente.
Prmban mbi 5000 funksione.
Dokumentacioni sht i begatshm dhe mbulon do aspekt t programimit.
sht i leht pr msim.
Mundson zhvillim rapid t aplikacioneve.

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.

Ndrlidhja me aplikacionet tjera


PHP mund t lidhet me nj numr t konsiderueshm t sistemeve pr menaxhimin e databazave
relacionale, si jan: MySQL, PostgreSQL, Oracle, dhe Microsoft SQL Server.
Versionet m t reja t PHP prkrahin mbi 15 sisteme t ndryshme t databazave, duke poseduar
edhe nj API t prbashkt pr t gjitha.
Prve databazave, PHP mund t lexoj dhe krijoj XML dokumente, ti qaset strukturs s XML
me XPath, si dhe t kryej transformimet gjegjse me XSLT.

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.

Funksionimi i Web faqes


N momentin q nj vizitor i sajtit, bn krkes pr hapjen e nj HTML dokumenti, Web serveri ia
prcjell HTML dokumentin e ruajtur, paraprakisht duke e interpretuar bllokun e kodit n PHP dhe
shndrruar rezultatin n pjes integrale t faqes.
Mund t thuhet se kodi n PHP i jep gjallri faqes, duke e ndryshuar prmbajtjen n mnyr
inteligjente duke iu prgjigjur zgjedhjeve q bn vizitori me an t klikimit apo plotsimit t t
dhnave.

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.

Inkorporimi i PHP kodit n HTML


Shembull i inkorporimit t PHP kodit brenda nj HTML dokumenti:
1
2
3
4
5
6
7
8
9
10
11

<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>

Prgatitja e ambientit t puns


Instalimi dhe konfigurimi i LAMP/WAMP serverit
Nj fillestar ka nevoj t njihet me tr procesin e instalimit dhe konfigurimit t programeve t
nevojshme, pr t qen n gjendje pastaj ti testoj shembujt e dhn n manual.
Nse kodin nga shembulli i par do t tentonim ta ekzekutonim duke e hapur fajllin leksioni1.php
drejtpsdrejti nga shfletuesi, ai fajll do t na ofrohej pr shkarkim dhe nuk do t hapej si Web faqe,
si do t prisnim nga prvojat e mhershme me HTML dokumente.
Kjo ndodh pr shkak se faqja q prmban PHP kod duhet s pari t procesohet n Web server,
pr tu transformuar n HTML dokument t cilin pastaj mund ta kuptoj nj shfletues. Derisa
nuk procesohet, sht fajll i tipit t panjohur pr shfletuesin, prandaj ai ofron vetm mundsin e
shkarkimit.
Pr t qen n gjendje pr t zhvilluar PHP aplikacione n kompjuterin tuaj, nevojitet t instalohen
disa aplikacione t cilt veprojn n koordinim me njri-tjetrin. Programet e nevojshme jan:
Apache Server
PHP
MySQL
T gjitha kto aplikacione mund t shkarkohen nga Web faqe prkats e t tyre dhe t instalohen
secili vemas, mirpo pastaj nevojitet konfigurimi i tyre pr ti br q t funksionojn si nj trsi.
Ky proces di t jet i ndrlikuar dhe i vshtir pr fillestart, prandaj zgjidhja sht n shkarkimin
dhe instalimin e t ashtuquajturve ApacheMySQLPHP packages (AMP), t cilat kan instalues q
i bn kto konfigurime n mnyr automatike, ku krkohen intervenime minimale t prdoruesit.

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

Prgatitja e ambientit t puns

10

AMP stack: Cross-platform

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)

AMP stack: Linux


LAMP
Bitnami LAMPStack (Open Source License, Apache 2/1.3, PHP 4.x/5.x, MySQL 4.1/5, Python
2.3/2.4)
Bitnami LAPPStack (Open Source License, Apache 2, PHP 5.x, PostgreSQL 8.1, Python 2.4)
AMPPS
XAMPP for Linux

AMP stack: Mac

AMPPS
MAMP
DAMP
Bitnami MAMPStack (Open Source License, Apache 2, PHP 5.x, MySQL 5, Python 2.4)
XAMPP for OS X

AMP stack: Windows

AMPPS
EasyPhp
Bitnami WAMP Stack
WAMPServer
XAMPP
Uniform Server
UwAmp
WT-NMP
WPN-XM Server Stack

Prgatitja e ambientit t puns

IDE
Komerciale:
1.
2.
3.
4.
5.
6.
7.
8.
9.

JetBrains PhpStorm (http://www.jetbrains.com/phpstorm/)


Zend Studio (http://www.zend.com/products/studio/)
NuSphere PhpED (http://www.nusphere.com/products/phped.htm)
NetBeans IDE (https://netbeans.org/features/php/)
phpDesigner (http://www.mpsoftware.dk/phpdesigner.php)
Embarcadero RadPHP
WaterProof PHPEdit (http://www.waterproof.fr/)
Komodo IDE (http://www.activestate.com/komodo-ide)
Adobe Dreamweaver (http://www.adobe.com/products/dreamweaver.html)

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)

Folderi n Web server


www (c:\wamp\www)
public_html (/home/icksite/public_html)
htdocs (c:Program Files (x86)ZendApache2\htdocs)
URL n shfletues:
http://localhost/
ose
http://127.0.0.1
Nse zhvillojm m tepr aplikacione, secili aplikacion duhet t vendoset n folder t veant:
c:\wamp\www\cms
N shfletues, ky folder thirret me:
http://localhost/cms
ose
http://127.0.0.1/cms

11

Prgatitja e ambientit t puns

12

Porti standard pr protokolin HTTP sht 80.


Mirpo, nse instalojm edhe ndonj Web server n hostin e njjt, nevojitet t prdoret nj port i
ri.
Portet e prdorura m s shpeshti pr HTTP:
80, q sht vler standarde e nnkuptuar (default)
8080, etj.
Pr HTTPS: 443
Portet pr serviset/protokolet e tjera:
21 FTP
22 - SSH
25 SMTP
110 POP
143 Incoming IMAP
3306 MySQL
Folderin e aplikacionit mund ta krijojm drejtprsdrejti brenda folderit n serverin lokal
1

www public_html htdocs

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.

Ekzekutimi i php skriptave


PHP skriptat mund t ekzekutohen n dy mnyra:
Duke e kopjuar fajllin e skripts n folderin publik t serverit

Prgatitja e ambientit t puns

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.

Shkrimi dhe ekzekutimi i skriptave


Skriptat n PHP jan fajlla tekstual q prmbajn kode n PHP, shpesh t kombinuara edhe me
kode n HTML, CSS, JavaScript, etj. Me prdorimin e nj editori t rndomt t tekstit (Notepad),
shkruani:
1
2
3

<?php
echo Skripta ime e par!';
?>

Ruajeni kt dokument n folderin prkats s Web serverit dhe emrojeni skripta1.php


Hapeni shfletuesin dhe shnojeni adresn korresponduese t dokumentit.

Procesi i gjenerimit t faqes rezultuese


Kur krkojm ekzekutimin e fajllit skripta1.php:
Web serveri e pranon krkesn
Duke qen se sht fajll me ekstension .php, ky fajll i prcillet PHP interpreterit (parserit) pr
prpunim t mtejm
PHP parseri i ekzekuton kodet brenda , e merr rezultatin, e bashkon me pjesn HTML t faqes
n vendet prkatse dhe dokumentin final ia kthen Web serverit
Web serveri e drgon faqen e prpunuar n drejtim t shfletuesit.
N rastin konkret, rezultati i kthyer sht teksti: Skripta ime e par!

Ndrprerja e ekzekutimit t skriptave


Gjat testimit t nj PHP skripte, mund t ndodh q ajo t mos ekzekutohet, gjegjsisht t mos
ekzekutohet deri n fund.
Kjo mund t ndodh pr disa arsye:
Gabime n instalimin apo konfigurimin e Web serverit, PHP parserit apo t ndonj komponente
tjetr, kshtu q skripta as nuk mund t ekzekutohet.
Ka gabime n vet kodin e PHP skripts dhe n kt rast, PHP parseri nuk mund t vazhdoj
m tutje me ekzekutim.
Ekzekutimi i skripts ka marr shum koh.
Ekzekutimi i skripts ka konsumuar shum RAM memorje, m tepr se lejon PHP.

Prgatitja e ambientit t puns

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

Przierja e PHP me HTML


Kur PHP parseri e lexon skriptn, ai e ekzekuton vetm pjesn q gjendet brenda PHP etiketave.
Gjith sht jasht ktyre zonave, prcillet m tutje pa kurrfar ndryshimi.
Me kt mundsohet futja e kodeve PHP prbrenda dokumentit HTML, pr t krijuar faqe q
prmban t gjitha ato q ofron HTML n aspektin e prmbajtjes dhe strukturs, duke i shtuar edhe
kalkulime, veprime me databazn, apo ndonj gj tjetr.
Pra, rezultat prfundimtar i ktij miksimi sht nj dokument krejtsisht n HTML/CSS.
Po t shikohet kodi burimor me View Source, n asnj vend nuk do t ket kode t PHP.
do echo drgon rezultate n form tekstuale apo t formatuar n HTML/CSS

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.

Prgatitja e ambientit t puns

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:

Tento t konektohesh n server


Nse dshton, ndrpreje ekzekuzimin, duke raportuar se nuk u realizua koneksioni.
Nse ke sukses, vazhdo m tutje n rreshtin vijues
Tento t lexosh t dhnat nga nj tabel
Nse dshton, ndrpreje ekzekutimin, duke raportuar se nuk u lexuan t dhnat nga tabela

Strukturat

17

Nse ke sukses, kontrollo sa rezultate kan arritur


Nse rezultate ka 0, pra nuk ka rezultate, ndrpreje ekzekuzimin dhe raporto se tabela nuk ka
t dhna
Nse ka rezultate, ather paraqiti n form tabelare.
Ktu tash shohim se programi e ndrpren ekzekutimin n 3 raste:
Dshtoi koneksioni n server
Dshtoi leximi nga tabela
Tabela nuk ktheu rezultate
N shembullin e msipr, analiza nse-kjo-ather-ajo mundson degzimin e programit, ku njra
deg e ndal ekzekutimin, ndrsa tjetra e vazhdon.
Degzimi nuk bhet vetm kur duhet t ndalet ekzekutimi i programit, por m shpesh prdoret pr
degzimin e logjiks s tij. Nj veprim mund t nevojitet nse sht plotsuar kushti, ndrsa veprim
tjetr nse nuk sht plotsuar. Pra, me nj kusht nse do t kemi dy rrjedha paralele t programit.
Se cila rrjedh do t zgjedhet, varet nga kushti i parashtruar.

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>";
?>

N shembullin e msiprm, fillimisht lexohet vlera e $_POST['emri'] dhe vendoset n variablin


$emri.
Pastaj me if jepet kushti: $emri == "", me ka verifikohet a sht ai variabl i zbrazt. Dy thonjza
t njpasnjshme simbolizojn tekstin e zbrazt.
Nse kushti plotsohet, pra nse $emri nuk e prmban asnj shkronj, ather paraqitet raporti: Nuk
e keni shnuar emrin. N t kundrtn, pra, nse kushti nuk sht plotsuar, ekzekutimi vazhdon
m tej npr rreshtat vijues programor.
Si n rastin kur plotsohet kushti, ashtu edhe ather kur nuk plotsohet, programi i msiprm do
ta vazhdoj ekzekutimin te rreshti vijues: 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)

Cilado t jet e sakt, do t bj q krejt shprehja t rezultoj e sakte.


TRUE || TRUE = TRUE TRUE || FALSE = TRUE FALSE || TRUE = TRUE FALSE || FALSE = FALSE
Pr krahasimin e dy vlerave prdoret barazimi i dyfisht == dhe jo =. Shenja = sht operator i
caktimit t vlers (asignment), si n rastin:
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

echo "E premte ";


break;
default:
echo "Fundjave ";
}
?>

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

Nj implementim i thjesht i patternit MVC.

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

'emri' => $row['Pro_Name'],


'cmimi' => $row['Pro_Price']);
}
return $rreshti;
}
else
{
return NULL;
}
}

Funksioni pr thirrjen e View


func.php
1
2
3
4
5
6

<?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>

Kontrollerin e startojm me: produkti.php?id=2, nse dshirojm ti shohim detajet e produktit t


dyt.
Si shohim, gjithka fillon nga kontrolleri, pastaj t dhnat nxirren nga modeli, q pas prpunimit
(llogaritjes s TVSH), drgohen n produkti_view.php kur kemi rezultate, ose n raporti_view.php
kur nuk kemi rezultate.

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

Nse dshirojm t prcjellim m shum variabla, ato i bashkangjesim me &:


1

http://localhost/lajmet.php?id=5&category=2

me ka po specifikojm se e krkojm lajmin numr 5 n kategorin numr 2.


Kufizim i metods GET sht gjatsia e tekstit q mund t bartet, sepse address bar i browserit lejon
vendosjen e nj numri t kufizuar t karaktereve. M shum se 2000 karaktere do t shkaktojn
probleme n shumicn e browserve.
Problem tjetr me GET sht fakti se tekstet q prmbajn karaktere me kuptim special pr browserin
mund t shkaktojn probleme, duke e br URL-n e till t paprdorshme.
Karakteret e lejuara n URL jan:
1
2

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~:/?#[]@!$&'()*\
+,;=

T gjitha karakteret tjera duhet paraprakisht t enkodohen me urlencode(), pr t mos shkaktuar


keqkuptim nga ana e browserit.
Pra, n prgjithsi, me metodn GET nuk sht i mundur drgimi n skriptn tjetr i nj sasie t
madhe t tekstit, plus problemet me karakteret speciale t paenkoduara.

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

Ktu caktuam q maksimumi t jet 50 Mb.


Metoda POST prdoret te formulart:
komentet.html
1
2
3
4

<form method="POST" id="regjistrimi" action="/regjistro.php">


<input type="text" name="titulli">
<textarea name="mesazhi"></textarea>
</form>

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>";
?>

Me kt do t eliminohet mundsia q bashk me tekstin benjinj, n skriptn ton t prcillen edhe


kodet malinje.
T dhnat e drguara me POST, mund t lexohen edhe nga superglobali $_REQUEST, por kjo nuk
sht praktik e mir pr shkaqe sigurie.
Pr t drguar t dhna me metodn POST pa prdorimin e formularve, mund t prdoren funksione
t PHP, ekstensioni cURL, si dhe funksione t caktuara t JavaScript.
Drgimi me JavaScript sht i lejuar vetm brenda domainit t njjt, kshtu q mund t konsiderohet
m pak i rrezikshm se ajo me cURL, me t cilin potencialisht mund t drgojm POST krkesa n
cilindo domain.

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

<form action="dergo.php" method="post" enctype="multipart/form-data">


<p>Fajlli: <input type="file" name="fajlli"></p>
<input type="submit" value="Dergo">
</form>

Ktu duhet t veojm dy detaje:


Brenda tagut <form> e shtojm atributin enctype me vlern multipart/form-data. Kjo i
tregon skripts pranuese se prve fushave normale t formularit, do t drgohen edhe t
dhna n form t fajllave.
Tipi i fushs duhet t jet file, i cili n browser do t shfaqet si buton Browse..., i cili pasi t
klikohet, na mundsohet ta zgjedhim fajllin e dshiruar. Nse ksaj fushe ia shtojm atributin
multiple, do t mundsohet selektimi i m shum fajllave.
N rastet kur dshirojm t prfshijm disa fajlla me nj fush, emri i fushs te atributi name duhet
t shkruhet me [] n fund. Shtohet edhe atributi multiple. Pra:
1

<p>Fajlli: <input type="file" multiple name="fajlli[]"></p>

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

Ktu shohim se superglobali $_FILES ka nj antar dhe ai quhet fajlli.


M tej, antari fajlli edhe vet sht varg dhe ka 5 antar:

name. Emri i fajllit, n kt rast d2.jpg.


type. MIME tipi i fajllit, n kt rast image/jpeg.
tmp_name. Emri i prkohshm i fajllit n direktoriumin tmp.
error. Numri i gabimit. E ka vlern 0 nse nuk sht paraqitur asnj gabim.
size. Madhsia e fajllit n bajt.

do fajll t bhet upload, fillimisht vendoset prkohsisht n nj direktorium t veant, n rastin


ton n C:\wamp\tmp\php266D.tmp.
Fajlli vendoset n direktoriumin e prkohshm sepse, varsisht prej kritereve q i caktojm n
program, mund t ndodh q t mos na nevojitet fare ai fajll.
Vetm fajllat q i plotsojn kriteret e caktuara do t vendosen n destinacionin final, gjegjsisht n
folderin q e kemi caktuar pr vendosjen e fajllave.
Cilat mund t jen ato kritere?
Mund t jet tipi i fajllave. Nse na nevojiten vetm fajlla q prmbajn fotografi, ather do t
kufizohemi n tipet e caktuara, psh: JPG, GIF, PNG.
Kriter tjetr mund t jet madhsia sepse mund t dshirojm q ta caktojm nj madhsi maksimale
t fajllit, psh ato deri n 1 Mb.

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

<form action="dergo.php" method="post" enctype="multipart/form-data">


<input type="hidden" name="MAX_FILE_SIZE" value="1048576" />
<p>Fajlli: <input type="file" name="fajlli"></p>
<input type="submit" value="Dergo">
</form>

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.

post_max_size dhe upload_max_filesize


Direktiva upload_max_filesize tham se cakton madhsin maksimale t fajllit q ngarkohet.
Vlera e ksaj direktive gjithmon duhet t jet m e vogl se ajo e direktivs post_max_size.

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.

Kontrollimi i MIME type t fajllit


Bashk me t dhnat tjera, browseri i drgon serverit edhe MIME type t fajllit. Disa nga MIME
type:

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

i Wordit, i tipit .DOCX.


Skriptn ton do ta lejojm t pranoj vetm fajlla JPEG dhe PNG:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

<?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

echo "Fajlli teper i madh. Lejohet maks. 1 Mb.";


}
}
else
{
echo "Gabim gjat drgimit t fajllit!";
}
?>

Pra, deri tash kemi verifikuar:


Nse sht paraqitur ndonj gabim
Nse madhsia e fajllit sht m e vogl ose baras se 1 Mb
Nse tipi i fajllit sht JPG/JPEG ose PNG.

Bartja e fajllave n destinacionin final


Tash e prdorim funksionin move_uploaded_file() pr ta vendosur fajllin n destinacionin final,
psh. n nj folder pr fotografit e produkteve, t quajtur products, brenda folderit public.
Fajllat mund t vendosen n cilindo lokacion brenda fajll-sistemit, mirpo nse ato duhet t shfaqen
n Web faqe, duhet t jen t vendosura n folderin publik, pra n at folder ku t gjith vizitort
kan qasje.
Pr shembull, nse fotografit e produkteve i vendosim brenda /home/site/public_html/assets/images/,
ndrsa fajlli q do ti shfaq gjendet n /home/site/public_html/, ta zm i quajtur show.php,
ather linqet pr source brenda show.php do t dukeshin kshtu:
1
2

<img src='/assets/images/foto1.jpg' >


<img src='/assets/images/foto2.jpg' >

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

chmod -Rf 755 ./folderi

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:

Klikojm emrin e folderit


Klikojm butonin e djatht dhe zgjedhim Properties
Klikojm tab-in Security
Klikojm emrin e prdoruesit
Klikojm Edit
Te rreshti Write zgjedhim checkbox-in e kolons Allow

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!";
}
?>

Si parametr i par i funksionit move_uploaded_files() prdoret emri i prkohshm i fajllit, q


sht nj emr unik i rastsishm i fajllit n folderin tmp. Prdoret nj emr unik n mnyr q t
mos e bjn overwrite njri-tjetrin dy fajlla me emr dhe tip t njjt.
Si parametr i dyt prdoret path-i i folderit ku do t ruhet fajlli (path relativ ndaj lokacionit t
skripts), bashkangjitur me emrin e fajllit:
1

"assets/images/".$fajlli['name']

Nse funksioni move_uploaded_files() e transferon me sukses fajllin, fajlli i prkohshm fshihet.


Ajo n ka duhet t kemi kujdes n kt faz sht se nse fajlli i sapongarkuar ka emr dhe tip t
njjt me ndonj fajll q tashm sht n at folder, ky i dyti do ta bj overwrite t parin. Prandaj,
pr t parandaluar situata t ktilla, shtohet kodi q njher kontrollon a ekziston fajll me emr t
njjt (me funksionin file_exists()), n mnyr q fajllit ti ndryshohet emri para se t vendoset
n at folder.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

<?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

bool setcookie ( string $name


[, string $value
[, int $expire = 0
[, string $path
[, string $domain
[, bool $secure = false [, bool $httponly = false ]]]]]] )

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'];
?>

Natyrisht, n praktik, si vler do t prdoret nj variabl, si psh:


1

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

setcookie('company', 'Apple', time() + 7*24*60*60);

me ka astit aktual i shtohen 604800 sekonda, pra aq sa ka nj jav.


Pra, brenda ksaj periudhe, skripta jon do t ket asje vlers s indeksit/elsit company dhe ajo
do ta jap vlern Apple, por me kalimin e ktij afati, cookie do t fshihet dhe me t edhe vlera e
ruajtur.
setcookie() kthen vlern TRUE nse ka sukses n krijimin e cookie-t, ndrsa FALSE n t kundrtn.
Nj cookie do t fshihet nse si parametr t jetgjatsis shnojm vler m t vogl se koha aktuale,
psh time()-3600 e bn cookie-n 1 or t vjetr dhe me kt shkakton fshirjen e tij.
Nse jepet vlera 0, cookie do t jetoj vetm deri n fund t sesionit, pra do t fshihet me mbylljen
e browserit.
Aspekti i jetgjatsis s cookie-t varet edhe nga opsionet e zgjedhura n browser.
Path
Parametri i katrt paraqet shtegun ku cookie do t jet disponabl. Vlera e nnkuptuar, pra kur nuk
shnohet ky parametr fare, sht direktoriumi ku gjendet skripta e cila e ka krijuar cookie-n. N
kt rast, skriptat n direktoriumet tjera nuk do t jen n gjendje ta lexojn vlern e cookie-t.
Nse si vler shnohet /, ather vlera e cookie-t mund t lexohet brenda gjith domainit.
Nse si vler shnohet emri i nj direktoriumi, si psh /admin/, vlera e cookie do t jet n dispozicion
t atij direktoriumi dhe t gjitha niveleve t nndirektoriumeve brenda saj.
Domain
Parametri i pest sht domaini ku vlen ky cookie, me ka at e lidhim pr nj domain t caktuar.
Secure
Indikon q cookie mund t drgohet vetm nse ndrmjet browserit dhe serverit sht vendosur SSL
koneksion, pra nse lidhja sht e enkriptuar.
httponly
Kufizon prdorimin e cookie vetm brenda HTTP protokolit, duke pamundsuar aksesin n t
nga JavaScript. Me kt n mas t konsiderueshme rritet siguria e cookie, meq kshtu mund t
parandalohet nj numr i XSS sulmeve (cross-site scripting). Pr ta aktivizuar kt mundsi, shnohet
vlera TRUE.

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

Prmbajtja e cookie t sesionit:


PHPSESSID=pd6fqjdm7rc8d7ho5claukmv66
PHPSESSID sht emri i cookie, ndrsa pd6fqjdm7rc8d7ho5claukmv66 sht ID-ja e sesionit. N
Web server ekziston fajlli me emrtimin sess_pd6fqjdm7rc8d7ho5claukmv66 ku ruhen vlerat e
variablave t prdorura gjat ktij sesioni.
Me echo session_save_path(); mund t verifikojm se n cilin direktorium ruhen fajllat e sesionit.
N rastin e WAMP, ky lokacion do t jet c:/wamp/tmp:

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:

Kur vizitori e mbyll browserin


Kur vizitori sht inaktiv brenda nj periudhe kohore
Kur vizitori e klikon butonin prkats pr lajmrim
Kur fshihet session cookie nga browseri

Mbyllja e nj sesioni:
1
2
3

$_SESSION = array();
session_destroy();
setcookie('PHPSESSID', ", time()-3600,'/', ", 0, 0);

Session hijacking
//

Menaxhimi i sesioneve nga databaza


Sesionet mund t menaxhohen edhe nga databaza.

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

function dd($arg, $message="") {


var_dump($arg);
die($message);
?>

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

Pr kt arsye, zgjidhja m praktike sht q funksionin ta vendosim n nj fajll t veant dhe ta


bjm include n t gjitha skriptat ku na nevojitet.
funksionet.php
1
2
3
4
5

<?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.

Dallimi ndrmjet argumentit dhe parametrit


Jo rrall krijohet konfuzion me terminologjin e prdorur pr prshkrimin e funksioneve, ku
ngatrrohen kuptimet e fjals argument me at parametr.
Kur e thrrasim nj funksion, ne atij i prcjellim argumente:
1

$cmimi_tvsh = tvsh(56);

Numri 56 sht argument q i jepet funksionit.


Te rreshti ku e definojm funksionin, i shnojm parametrat.
1
2
3

function tvsh($cm) {
}

Variabli $cm ktu sht parametr.


Renditja e parametrave duhet t jet krejtsisht e njjt me renditjen e argumenteve, si dhe duhet t
jen t tipit t njjt. Pra, argumenti i par i prgjigjet parametrit t par dhe t dyja duhet ta ken
tipin e njjt (integer, float, array, ). Emrat e parametrave nuk sht e thn t jen t njjt me
ato t argumenteve, mund t prdorim fardo emrash, me rndsi sht vetm renditja e tyre.
1
2
3

$cmimi = 100;
$tvsh = 16;
echo tvsh($cmimi, $tvsh);

1
2
3

function tvsh($cm, $shk) {


. . .
}

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

function tvsh($cm, $shk=16) {


$cmt = $cm+($cm*$shk/100);
return $cmt;
}

55

N kt rast, funksioni thirret me vetm nj argument, por funksioni i ka dy parametra. Argument i


dyt n kt rast sht opcional. N munges t vlers pr parametrin e dyt, vendoset default
value, n kt rast 16. Pra, nse dshirojm t llogarisim me bazn 16% t TVSH, funksionin e
thrrasim duke i dhn vetm argumentin e par. Nse krkojm llogaritje me ndonj baz tjetr,
ather e shnojm edhe argumentin e par, edhe argumentin e dyt.
Pra, $shk e merr vlern 16, vetm ather kur mungon argumenti i dyt gjat thirrjes s funksionit,
prndyshe, n prezenc t argumentit t dyt - parametri i dyt e merr vlern e atij argumenti.
Funksioni kthen vetm nj vler: nj string, nj numr, nj boolean, Nse dshirojm t kthejm
m tepr vlera, e prdorim nj varg (array), brenda s cils i kemi vendosur vlerat e dshiruara.
N shembullin e mposhtm, funksioni do t na kthej dy vlera: vlern e TVSH-s dhe mimin me
TVSH.
1
2
3
4
5
6
7
8
9
10
11

<?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

Jetgjatsia e variablave brenda funksioneve


Variablat q prdoren brenda funksionit, kan nj dallim me variablat n pjesn tjetr t skripts:
ato jetojn aq sa jeton funksioni, dhe me kryerjen e ekzekutimit t funksionit - ato vlera fshihen.
Variablat e tilla quhen variabla lokale. Kto variabla nuk do t bijn n kolizion me variablat me
emrtim t njjt q jan jasht funksionit.

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;
}
?>

Rezultati: [Skripta] Cmimi pa TVSH:100


[Funksioni] Cmimi me TVSH:116
[Skripta] Cmimi pa TVSH:116
N rreshtin e tret shohim se edhe skripta sht duke e par vlern e ndryshuar t variablit $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:

krijimin e PDF dokumenteve


leximi apo krijimin e Excel tabelave
pr gjenerimin e XML fajllave
pr manipulim me fotografit, etj.

Pr t gjitha kto krkesa nevojitet prfshirja e bibliotekave t veanta t funksioneve.


Njra mnyr sht me shtimin e PHP ekstensioneve. Ekstensionet jan programe t shkruara
n gjuhn programore C, t cilat bjn zgjerimin e funksioneve t PHP. Pra, bazs ekzistuese t
funksioneve i shtohet edhe nj numr i caktuar i funksioneve t reja.
Nse jemi n dedicated host, ne vet caktojm cilat ekstensione t shtohen apo hiqen. Problem m i
madh jan shared host, ku vetm administratorit i serverit mund t manipuloj me ekstensionet.
Ndr ekstensionet m t rndsishme t PHP jan: - php_mysql - php_mysqli - php_pdo_mysql php_gd2 - php_curl, etj
Secili prej ktyre ekstensioneve i shton funksione t reja PHP-s, ndrsa mungesa e tyre mund t
shkaktoj mosfunksionimin e ndonj skripte e cila e prdor ndonj funksion t nj ekstensioni t
caktuar.
Me WAMP t instaluar, Ekstensionet i gjejm n folderin C:\wamp\bin\php\php5.5.12\ext. 5.5.12
sht versioni i PHP, mund t jet ndryshe n kompjuterin tuaj.

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

N kt gjendje. ne do t mund ta prdorimin Composer-in vetm duke e shkruar n command


prompt derisa jemi brenda atij folderi, ose duhet ta shnojm pathin para komands:
1
2

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

C:\bin>echo @php "%~dp0composer.phar" %*>composer.bat

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

Inkludimi i pakove n aplikacionin ton


Pas instalimit t nj pakoje, brenda folderit ton libraries do t jet formuar folderi vendor, q
sht folderi brenda t cilit do t vendosen pakot e autorve t ndryshm.
Brenda vendor do ta gjejm folderin q prmban emrin e autorit, t firms apo projektit q e ka
krijuar at pako.
Brenda folderit me emrin e vendor-it, do ta gjejm folderin me emrtimin e pakos.
Krejt ka duhet t bjm n aplikacionin ton sht q ta bjm include apo require fajllin
autoloade.php nga folderi vendor:
1
2

<?php
require 'vendor/autoload.php';

N rastin e aplikacionit ton, do t jet:


1
2

<?php
require '..libraries/vendor/autoload.php';

Pas ksaj, mund ti prdorim klasat e pakove t instaluara.


Nse dshirojm ti prditsojm t gjitha pakot, hapim command prompt, vendosemi te folderi
prkatse (te ne sht libraries), dhe shnojm:

Composer

composer update

Nse dshirojm ta prditsojm vetm nj pako, e cekim emrin e tij:


1

composer update vendor/package

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:

Emri mund t ket vetm shkronja


Emaili duhet ta ket nj shenj @, nj tekst para asaj shenje dhe nj domain name pas shenjs.
Telefoni mund ta ket formatin +377(44)123-456
Data mund ta ket formatin 28.03.2015, pra dita.muaji.viti, ku dita dhe muaji jan numra dy
shifror, ndrsa viti sht katr shifror.
etj.
Aplikacioni yn nuk duhet t lejoj q t dhnat t ruhen nse ato nuk jan t formatuara si duhet.
Pr ti parandaluar gabimet e tilla, n ndihm na vijn regular expressions, me an t cilave do t
jemi n gjendje ta analizojm t dhnn dhe t konstatojm nse i plotson kriteret e caktuara. Pr
shembull, nse emri prmban vetm shkronja.

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

Natyrisht, n vend t projekti1 mund t shnohet fardo emrtimi i prshtatshm pr at projekt,


psh onlineshop.
Gjersa kjo zgjidhje sht e leht pr tu kuptuar, ajo n vete prmban disa probleme. Problemi kryesor
sht shtja e linqeve absolute t shnuara brenda HTML/PHP fajllave t aplikacionit, t cilat mund
t mos prputhen me strukturn n remote host.
Ta zm se faqja gjendet n www/projekti1 dhe duhet t linkohet me nj CSS fajll q gjendet n
/assets brenda direktoriumit projekti1.
1

<link href="/assets/style.css" rel="stylesheet" type="text/css">

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

<link href="/projekti1/assets/style.css" rel="stylesheet" type="text/css">

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

pr qasje direkte t vizitorve, pra jo

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

ndrsa n at lokal nse shnohet si


1

/projekti1/assets/style.css

Na duhet q direktoriumi ku gjendet aplikacioni yn t trajtohet si sajt n vete, e jo si direktorium i


www.
Me kt do t na lehtsohej puna gjat zhvillimit dhe testimit t aplikacionit, sepse nuk do t hasnim
n probleme si u cek m sipr. Shum m mir sht nse aplikacionin e mbaj n ndonj folder t
veant dhe t mos ket lidhje me www, sepse nj fshirje aksidentale e www do ti fshinte t gjith
foldert e projekteve t tjera q i kemi.
Pr ta realizuar kt izolim t folderit si sajt n vete dhe pr ta thirrur nga nj domain i veant
fiktiv, duhet tu kryejm disa veprime, disa n kuadr t Windows e disa n kuadr t serverit
Apache.
Shum m bukur do t ishte sikur aplikacionin ta startonim me :
1

http://kursi.app

se sa me
1

http://localhost/kursi

S pari ta caktojm nj domain pr aplikacionin ton.


Hapim me nj edit teksti fajllin (si Administator):
1

C:\Windows\System32\drivers\etc\hosts

N fund t fajllit shtojm:

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

dhe me nj editor teksti, e hapim fajllin httpd-vhosts.conf.


N fund t fajllit e shtojm kt kod:
1
2
3
4
5

<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>

Te ServerAdmin e shnojm email adresn e administratorit t serverit, n kt rast emailin vetanak.


N DocumentRoot e shnojm direktoriumin ku e kemi vendosur aplikacionin.
Vrejtje: Nuk sht e thn q projektet tuaja ti vendosni pikrisht brenda C:\wamp\www. Mund
ta prdorni cilindo direktorium n sistem, mjafton ta vendosni shtegun (path) n DocumentRoot.
N ServerName e shnojm domainin q e kemi zgjedhur n C:WindowsSystem32\drivers\etc\hosts,
n rastin konkret kursi.app.
Shkojm n panelin e WAMP-it dhe zgjedhim Restart All Services.
Pas ksaj, kur n browser e hapim adresn *http://kursi.app, do t hapet prmbajtja e aplikacionit
q gjendet n C:\wamp\www\kursi.
Pr do folder/direktorium t ri q dshirojm ti qasemi n kt mnyr, duhet ta prsrisim
procedurn e njjt - duke e shtuar domainin n C:WindowsSystem32\drivers\etc\hosts, e pastaj
duke e krijuar hostin virtual pr at domain n C:\wamp\bin\apache\apache2.4.9\conf\extra\httpdvhosts.conf.

SEO friendly URLs


Gjat zhvillimit t aplikacioneve n PHP, URL-t dijn t bhen mjaft komplekse. Shembull:
1

http://localhost/test/index.php?cmd=produkti&id=3

Nj URL e till do t rezultonte nse aplikacioni yn sht ruajtur n C:\wamp\www\test.


Me an t virtual hosts, mund ta eliminojm fare emrin e folderit test, ashtu q linku i ri do t jet:
1

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

Por, kjo krkon nj procedur m t ndrlikuar, q do t shqyrtohet n kapitujt e mvonshm.


Pjesa ?cmd=produkti&id=3 quhet query string, dhe m s miri sht q n URL-t e aplikacionit
ton t mos figurojn fare, nse sht e mundur.

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:

SEO friendly URLs

71

Apache - Apache modules - rewrite_module

Kjo realizohet edhe duke e edituar httpd.conf, me heqjen e shenjs # para rreshtit:
1

#LoadModule rewrite_module modules/mod_rewrite.so

Pas heqjes s #, e ristartojm serverin me Restart All Services n WAMP.

.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]

Kodi n rrestin 1 e aktivizon RewriteEngine.


Kodi n rreshtin 2 do t mundsoj q me rastin e thirrjes s cilitdo fajll n aplikacionin ton,
(prve kur thirren: index.php, favicon.ico, robots.txt dhe folderit assets), Apache do ta thrras
fajllin index.php.
Pra, nse shkruajm psh:
1
2
3
4
5

http://localhost/kontakti.php
http://localhost/login
http://localhost/produktet/produkti.php

n t gjitha rastet, Apache do ta servoj fajllin index.php.


Nse krkohet ndonj fajll nga folderi /assets, ather do t ofrohet fajlli i krkuar, e jo index.php.
Psh.
1

http://localhost/assets/style.css

Me kt do t lexohet prmbajtja e style.css drejtprsdrejti.


Kodi n rreshti 3 do t mundsoj q fardo q kemi shkruar n URL pas domainit, ti bashkangjitet
fajllit index.php, duke e ndar me shenjn /. Pra, nse kemi shkruar:

SEO friendly URLs

72

http://localhost/kontakti

kjo do t prkthehet si:


1

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.

Leximi nga superglobali $_SERVER


Superglobali $_SERVER prmbajn variabla t ndryshme t cilat tregojn parametra t ndryshm
dinamik t serverit. Psh.:
Cili URL sht krkuar,
Cila skript sht duke u ekzekutuar,
Prej cilit IP po qaset nj vizitor, etj.
T gjitha kto informata mund ti marrim me funksionin phpinfo(). Neve na intereson vetm kjo
pjes nga lista e phpinfo():
REQUEST_URI: /kontakti
SCRIPT_NAME: /index.php
PATH_INFO: /kontakti
E shohim se REQUEST_URL dhe PATH_INFO na ka dhn informatn e njjt, por varsisht nga
konfigurimi i serverit, mund dhe t mos e japin, gjegjsisht njra mund t jet e zbrazt fare. Prandaj,
pr t vendosur ciln do ta prdorim, s pari duhet t testohet serveri. Ne po e prdorim PATH_INFO.
Kjo vler n aplikacion lexohet me:
1

$_SERVER['PATH_INFO']

URL-ja mund t ket m tepr segmente, psh:

SEO friendly URLs

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

$url = explode("/", $_SERVER['PATH_INFO']);

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

SEO friendly URLs

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

Pr leximin e segmentit t dyt do t prdoret $url[2], pr t tretin $url[3], e kshtu me radh.

Template Engine - Twig


N kapitullin pr MVC, sqaruam arsyet prse nj aplikacion ndahet n tri njsi. Nj ndr njsit ishte
View, ku vendoseshin faqet e punuara n HTML/PHP, t cilat jan fokusi i nj front-end developeri.
Nse nuk shrbejemi me ndonj mjet ndihms, si sht Twig, faqet q shrbejn si view, pra
shabllonet e faqeve, domosdo do t ken n vete t ndthurrur edhe kod n PHP. Kjo e kufizon frontend developerin n shprehjen e kreativitetit t tij, sepse ai prve HTML/CSS/JavaScript, duhet ta
njoh edhe PHP-n.
Ve ksaj, HTML dokumentet e ndrthurrura me PHP jan m t vshtira pr lexim dhe kryerjen e
korigjimeve eventuale.
Template engine jan aplikacione q mund ti shtohen si komponent aplikacionit ton, nprmes
t cilave do ti gjenerojm HTML dokumentet, asisoj q brenda tyre nuk do t ket asgj nga
PHP. Megjithat, HTML dokumentet ende do t jen n gjendje ti shohin vlerat e variablave t
drguara nga kontrolleri, si dhe t zbatojn disa nga strukturat, si jan ato pr degzim dhe iteracion.
Kjo bhet duke e shfrytzuar sintaksn e template engine, e cila shpesh sht m koncize dhe m
gjithprfshirse se ato t PHP.

Instalimi i Twig
Twig instalohet me Composer, ku n composer.json e shtojm rreshtin:
1

"twig/twig": "1.18.0"

Fajlli composer.json do t duket kshtu:


1
2
3
4
5
6

{
"require": {
"swiftmailer/swiftmailer": "5.3.*@dev",
"twig/twig": "1.18.0"
}
}

E zgjedhim versionin m t fundit q e kemi n dispozicion.


Pas dhnies s komands composer update, brenda folderit t zgjedhur do t shkarkohet Twig dhe
do t vendoset n folderin vendor/twig/twig.

Template Engine - Twig

76

Composer do ta prditsoj edhe fajllin autoload.php q gjendet brenda folderit vendor. Me kt


mundsohet prfshirja e Twig n mnyr automatike n aplikacionin ton, sa her t paraqitet nevoja
pr t. Thn m sakt, do t lexohen n mnyr automatike klasat e Twig, sa her q krkohet krijimi
i ndonj objekti t tij. Mjafton q n index.php ta kemi rreshtin i cili e inkludon fajllin autoload.php:
1

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
));

Si argument pr klasn Twig_Loader_Filesystem jepet lokacioni ku do ti ruajm shabllonet e


faqeve tona, dhe n shembullin konkret sht folderi views, brenda folderit app.
Klasa Twig_Environment mund t ket disa variabla, e n shembullin ton i kemi prdorur dy:
cache. Ktu shnohet lokacioni i Cache, folder ku do t ruhen kopjet e faqeve t gjeneruara
me Twig. Kjo do ta prshpejtoj n mas t madhe prgjigjen e serverit ndaj krkesave nga
browsert, sepse kto jan kopje statike t faqeve dinamike, dhe si t tilla nuk kan nevoj
t gjenerohen pas secils krkes nga browseri. Pra, hern e par kur thirret nj faqe, ajo
gjenerohet n mnyr dinamike, ruhet kopja e saj n cache dhe pastaj i drgohet browserit.
Kur t vij krkesa e dyt pr t njjtn faqe, Twig do ta kthej kopjen e ruajtur. Fajllat n cache
riprtrihen brenda intervaleve t caktuara, por mund edhe t rigjenerohen nse e fshijm
prmbajtjen e folderit cache. Kt folder e krijojm n lokacionin e dshiruar dhe i japim
write permissions.
debug. Nse e vem vlern TRUE, Twig do t raportoj mbi gabimet eventuale npr faqe.
Kjo sht e dobishme gjat fazs s zhvillimit dhe testimit, ndrsa kur sajtin e vendosim n
serverin e produksionit, e kthejm vlern n FALSE.

Template Engine - Twig

77

Prdorimi i Twig npr kontroller


Si kemi cekur edhe her t tjera, brenda kontrollerve e kemi t ndaluar t bjm echo sepse
prmbajtja e tekstit do t shfaqet para se t thirret template. Vetm imagjinoni kontrollerin si di
q rri sipr, ndrsa view sht posht. fardo echo mbi view, do ta paraqes tekstin para tagut
<!DOCTYPE html> t templates! Prandaj, n vend se ti bjm menjher echo, ne duhet ti ruajm
tekstet, vlerat, numrat n ndonj variabl, t cilin pastaj do ta printoj template. Pra, echo-t do
t bhen ekskluzivisht nga template-t, pr ta parandaluar shfaqjen e tekstit para HTML-s.
Nse kemi m tepr variabla pr tia drguar Twig-ut, ather e formojm nj varg (array), brenda
t cilit do ti vendosim vlerat q duam ti ojm n template.
Pr shembull:
1
2

$data['titulli'] = "Faqja e produkteve";


$data['cmimi'] = 125.00;

Arsyeja e dyt pr prdorimin e variablave n vend t echo, ka t bj me procesin e drgimit t


HTTP headers, si n rastin kur e prdorim funksionin header(). Nse pr shembull, dshirojm
ta bjm nj redirektim me header("Location: /kontakti");, ky redirektim do t dshtoj nse
funksionit header() i ka paraprir ndonj echo. N kt rast do t shfaqet raporti: Warning: Cannot
modify header information - headers already sent dhe nuk bhet redirektimi.
Ky problem shfaqet edhe kur i prdorim sesionet n kombinim me header(). Nse pr shembull i
kemi dhn ndonj vler nj variabli t sesionit, si:
1

$_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:

Template Engine - Twig

78

echo $twig->render('raporti.html', $data);

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.

Struktura e nj view fajlli


View fajllat, gjegjsisht template-t/shabllonet prdorim nj markup q sht specifik pr Twig.
Ato fillojn me:
1
2

{% extends "layout.html" %}
{% block content %}

ndrsa mbarojn me:


1

{% 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

{% block content %}{% endblock %}

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.

Template Engine - Twig

79

N div-in ku do t futet prmbajtja e nnfaqeve, e vendosim kodin {% block content %}{%


endblock %}

do nnfaqe do t filloj me {% extends "layout.html" %}{% block content %}, ndrsa


do t mbaroj me {% endblock %}. Ndrmjet tyre futet prmbajtja specifike e asaj faqeje. Pr
shembull, te faqja e kontakeve do ti vendosim t dhnat kontaktuese.
Nnfaqet duhet ta prmbajn vetm HTML kodin q e prshkruan at nnfaqe, por nuk duhet
t prmbaj DOCTYPE, HEAD, BODY Pra, n nnfaqen pr login, ne do ta vendosim vetm
HTML-n pr ndrtimin e formularit, por nuk do t kemi nevoj pr strukturn komplete t
nj faqeje.
Kur me echo $twig->render('raporti.html', $data) thirret nj nnfaqe, Twig do ta
bashkangjes automatikisht at nnfaqe faqes layout.html dhe ashtu t bashkuar do tia
drgoj browserit. Pra, vizitori gjithmon do ta shoh faqen si nj trsi, e jo n dy pjes, si
i kemi struktuaruar ne gjat procesit t zhvillimit t aplikacionit.

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

Template Engine - Twig

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

Pra, nga stringu ick2015 fitohet hash-i:


1488c61e22f54e75d43ac3935fea5e85451eb6be
Gjatsia e stringut rezultues te sha1() sht 40 karaktere, pa marr parasysh sa ka qen gjatsia e
stringut origjinal!
Teorikisht, pr do tekst t ndryshm do t gjenerohet nj hash tjetr. Pra, nuk duhet q dy tekste t
ndryshme ta japin hash-in e njjt. Kjo vetm n teori, gjersa n praktik kemi raste t evidentuara
t kolizioneve (collisions), pra t rasteve kur dy tekste q skan kurrfar ngjashmrie me njritjetrin - kan dhn hash t njjt. M shum kolizione ka te algoritmet q kan hash m t shkurtr.
Funksioni md5() gjeneron hash 32 karaktersh, gjersa sha1(), si u prmend m sipr - gjeneron
hash 40 karaktersh. Kjo sht arsyeja q ndrmjet md5() dhe sha1(), gjithmon zgjedhet ky i dyti.
Rekomandim i ekspertve t siguris si dhe t institucioneve t ndryshme sht q md5() t nxirret
krejtsisht nga prdorimi.
Pr thjeshtim t spjegimit, le ta kuptojm hash-in si nj nnshkrim t nj teksti. Sikur do njeri q
ka nnshkrim q dallon prej t tjerve, ashtu edhe do tekst, teorikisht, duhet ta ket hash-in e vet
unik.
Pyetja q vie vetvetiu sht: si e fitoj prmbajtjen origjinale t tekstit duke u bazuar vetm n 40
karaktere? Si e kthej nj tekst me 10000 karaktere nga nj hash 40 karaktersh? Prgjigja sht: hash
as nuk prdoret pr kthimin e prmbajtjes origjinale! Pra, prmbajtja e hash-it ska kurrfar lidhje
prmbajtsore me tekstin origjinal, sht vetm nj nnshkrim unik dhe n vete nuk prmban
asgj q mund t asocoj n prmbajtjen e tij.
Thn ndryshe, prej nnshkrimit nuk mund ta rikonstruktojm njeriun, por dijm se nnshkrimi i
kujt sht kur ai njeri nnshkruhet prap! Kur ai nnshkruhet prap, i krahasojm me nnshkrimet
e t gjith t nnshkruarve, dhe kur ta gjejm nnshkrimin e njjt - konstatojm se sht ai njeri
ka qen ktu m par.

Prdorimi i hash-it n Web aplikacion


Ti kthehemi Web aplikacionit ton. T gjith antart e regjistruar e Web faqes, i kan t dhnat t
regjistruara n nj MySQL tabel, n rastin ton t quajtur users. Disa nga fushat e tabels jan:

Kriptimi

83

ID-ja unike e antarit, q sht nj numr rendor, i ndryshm pr secilin antar


Emri dhe mbiemri i antarit
Email adresa e antarit
Fjalkalimin i antarit, etj.

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:

Fjalkalimet e shkurtra: sesame (084a3501edef6845f2f1e4198ec3a2b81cf5c6bc)


Fjalkalimet q prmbajn vetm shkronja, qoft uppercase, qoft lowercase: prishtinacity
(16c952e331eb893de13258bafe24e0d126d3e7c1)
Fjalkalimet q prmbajn vetm numra, psh datlindjet: 27031990 (9aa1c46a255d9b308bda1197a67757a63b05c
Fjalkalimet t fardo gjatsie por q prmbajn fraza t njohura: hastalavistababy (5541202440b69214af1f24f
https://crackstation.net

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

Vazhdojm me hashin q e fituam m sipr. Ai hash, pra c720ec040d745b38e97df275130c801d7af344aa


ruhet n tabeln e prdoruesve, n rreshtin e dedikuar pr prdoruesin konkret. Duke qen se sht
hash i dy teksteve t kombinuara, ne duhet ta ruajm edhe salt-in n t njjtin rresht (record), n
nj fush t veant. Kjo do t na nevojitet gjat procesit t login, ku fjalkalimit t shnuar n
formularin e login duhet tia shtojm salt-in nga databaza, pr ti br hash dhe pr ta krahasuar me
hash-in e ruajtur n databaz pr at antar.
Spjeguar step-by-step:
Antari regjistrohet, duke i dhn kto informata: emri dhe mbiemri, email adresa, dhe dy
her fjalkalimi. Dhnie e fjalkalimit dy her ska lidhje me hash, por bhet pr tu siguruar
se mos ka gabuar antari gjat shkrimit t fjalkalimit n formular, ku shkronjat e shkruara
nuk shihen. Nse e shkruan dy her njjt, kjo do t thot se ai di sakt ka ka shkruar dhe
se do ta mbaj n mend. Por, nse ai e shkruan dy her fjalkalimin e njjt por ai fjalkalim
nuk sht fjalkalimi q ka menduar se sht duke e shkruar, ai nuk do t ket qasje m von
me at fjalkalim q mendon se e ka shkruar. Kjo ndodh psh kur prdoruesi mendon se sht
duke e prdorur tastiern amerikane, e n fakt e ka pasur t aktivizuar at shqipe. N kt
rast, fjalkalimi i supozuar prizreni do t drgohet n fakt si priyreni, meq Y dhe Z i kan
vendet e ndrruara n tastier, kur e prdorim tastiern shqipe! Prdoruesi nuk do ta dij e ka
gabuar, sepse t dy herat e ka shnuar t njjt dhe sistemi do t raportoj se gjithka sht
n rregull.
Lexohen POST data nga skripta pr regjistrim dhe gjersa t gjitha fushat tjera do t
regjistrohen n databaz t pandryshuara, fusha e fjalkalimit s pari duhet t prgatitet.
Me kt prgatitje nnkuptojm gjenerimin e nj numri t madh (apo vargu tekstual) t
rastsishm, psh. nj numr ndrmjet 1000000 deri 9999999.
Numri i rastsishm bashkangjitet me fjalkalimin e drguar nga formulari i regjistrimit dhe
prej ksaj nxirret hash-i. Pra, $pass1 = trim($_POST[password1]);
1

$pass1 = trim($_POST['password1']);

$random = rand(1000000, 9999999); $passhash = sha1($random.$pass1);


Ky hash tash ruhet n tabeln e antarve, bashk me t dhnat e tjera.
Pra, n databaz nuk u ruajt hash-i origjinal, por hashi i ri i kombinimit salt + fjalkalimi.
Ky ishte spjegimi i procesit t regjistrimit. Hashi dhe salt-i tash e tutje do t na hyjn n pun gjat
procesit t identifikimit, gjegjsisht gjat login. - Antari klikon linkun pr login, e plotson fushn
pr email e pastaj at pr fjalkalim, pastaj butonin pr drgimin e formularit. - Skripta pr verifikim
(n rastin ton: check.php), i lexon t dhnat e drguara me POST. - Merret email adresa dhe bhet
nj SQL query pr t verifikuar a ekziston ajo email adres n tabeln e prdoruesve. - Nse nuk
ekziston jepet raporti se nuk ekziston dhe ofrohet mundsia q vizitori t shkoj prap te skripta
pr login. - Nse ekziston ai email, ather lexohen t gjitha t dhnat nga record-i i atij antari:
ID-ja, emri dhe mbiemri, hashi i ruajtur gjat regjistrimit, si dhe salt-i. - Merret fjalkalimi i lexuar

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

if (isset($_SESSION['auth']) && $_SESSION['auth'])

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:

Host, pra adresa e kompjuterit ku sht i instaluar MySQL serveri


Emri i prdoruesit t databazs (user)
Fjalkalimi i databazs (password)
Emri i databazs (name)

Ata q prdorin WAMP, nse nuk e kan konfiguruar ndryshe, do ti prdorin kto vlera:

Host: 127.0.0.1 ose localhost


User: root
Password: nuk ka fjalkalim
Name: emri i databazs q dshirohet t prdoret, n rastin ton ickshop.

Pr konektim prdoret funksioni mysql_connect(), t cilit i jepen 4 vlerat e cekura:

89

mysqli

$dbcon = mysqli_connect("localhost", "root", "", "ickshop");

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);

Katr argumentet e para i pam n shembullin e mparshm.


Argumenti port cakton TCP portin e MySQL serverit. Nse nuk shnohet, nnkuptohet vlera 3306.

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

$emri = mysqli_real_escape_string($dbcon, $_POST['emri']);

do e dhn q duhet t regjistrohet n databaz, me INSERT apo me UPDATE, duhet paraprakisht


t pastrohet, pr t parandaluar futjen e t dhnave q potencialisht mund t jen t rrezikshme, psh.
ato q mund t shkaktojn SQL injection.
Funksioni mysqli_real_escape_string() bn konvertimin karaktereve speciale (NUL, \n, \r, \, ,
dhe Control-Z) n escape code, t sigurta pr tu ruajtur n databaz. Merret parasysh charset
i databazs, prandaj sht m i sigurt se funksionet korresponduese t PHP, si addslashes. Nuk
mund t thirret nse nuk sht vendosur koneksioni me MySQL serverin.

mysqli_query()
Ekzekutimi i SQL krkesave.

mysqli_fetch_array()
1

$row= mysqli_fetch_array($result, MYSQLI_ASSOC);

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

$q = "SELECT * FROM products";


$result = mysqli_query($dbcon, $q);

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)`

E mbyll koneksionin e zgjedhur. N fund t procesimit t t dhnave t lexuara nga databaza,


rezultatet duhet t fshihen me mysqli_free_result() dhe koneksioni t mbyllet me mysqli_close().

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

$q = "SELECT Pro_ID, Pro_Name FROM products";


$result = mysqli_query($dbcon, $q);
echo "<table>";
while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
echo "<tr>
<td>" . $row['Pro_ID'] . "</td>
<td>" . $row['Pro_Name'] . "</td>
</tr>";
}
echo "</table>";

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_bind_param($stmt, "i", $category);


// i - integer
// d - double
// s - string
// b - blob

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

Aspekte t siguris n PHP


do zhvillues i Web aplikacioneve gjithmon duhet t niset nga fakti se Web-i sht ambient i
pasigurt dhe se do input nga cilido burim - sht i ndotur. Nuk ka rndsi nse inputi ka ardhur
nga HTTP requests (GET, POST, COOKIE), apo sht lexuar nga databaza apo nga ndonj fajll. N
t gjitha rrethanat, inputi fillimisht duhet t pastrohet (sanitize) dhe t validohet (validate), para
se t procedohet m tutje me t.

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

<form action='test.php' method="post">


<label for="fjalekalimi">Fjalekalimi:</label>
<input type="password" name="fjalekalimi">
<input type="submit" value="Submit">
</form>

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'];
?>

Por, n dukje efekti i njjt arrihet edhe me:

Aspekte t siguris n PHP

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

q redirekton n test2.php, ku m pas e shtojm nj query string: ?anetari=54847

Aspekte t siguris n 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

[email protected]

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.

Aspekte t siguris n PHP

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:

Aspekte t siguris n PHP

1
2
3
4
5

99

var emri = $('#emri').val()


if (emri.length < 3)
{
alert("Minimum 3 shkronja pr emrin!")
}

duhet ta ket ekuivalentin e vet edhe n PHP skriptn ton:


1
2
3
4
5

$emri = $_POST['emri'];
if (strlen($emri) < 3)
{
echo "Minimum 3 shkronja pr emrin!";
}

Nj mnyr tjetr e eliminimit t client-side validation arrihet me ruajtjen e faqes me formular n


disk, pra duke zgjedhur Save As n browser e duke e ruajtur faqen pr shembull n Desktop. Pasi
t jet ruajtur, e hapim faqen e formularit me nj tekst editor dhe fshijm gjithka q ka t bj me
validim, si n HTML, ashtu edhe n JavaScript. Pr t na funksionuar ky formualr, mjafton q n
action ta shnojm URL-n e plot, pra n vend t:
1

<form action="test.php" method="POST">

shkruajm:
1

<form action ="http://domaini.com/test.php" method="POST">

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

Aspekte t siguris n 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

Aspekte t siguris n PHP

Elaborimi i mtejm i skenarve t mundshm pr zgjidhjen e ktyre situatave i tejkalon suazat e


ktij manuali.

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.

Aspekte t siguris n PHP

102

Parandalimi i thirrjes direkte t skriptave


Nse aplikacionin ton e kemi organizuar sipas dispatch method, ne duhet t ndalojm thirrjen
direkte t skriptave, sepse thirrja e tyre duhet t bhet vetm n mnyr t centralizuar nga
index.php.
Kjo realizohet n at mnyr q n index.php definohet nj konstant, s cils i jepet nj vler
fardo, psh:
1

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

<?php if (!defined('THIRRJA')) exit('Nuk keni qasje direkte'); ?>

Pra, nse kjo skript thirret me:


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.

Kufizimi i variablave t inputit


Gjat leximit t vlerave t inputit, ne nuk duhet t lejojm q do vler e arritur t prdoret
automatikisht nga skripta. Psh. n rastin e $_POST, do ti lexojm vetm vlerat e fushave t pritshme,
psh n login na intereson email adresa dhe fjalkalimi, gjersa fushat tjera eventuale nuk na
interesojn.

Aspekte t siguris n PHP

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;
}

Me kt mundsohet q nga do antar t vargut $_POST t krijohet nga nj variabl me emrin e


indeksit t vargut e me vlern e atij antari t vargut.
Pra:
Pr $_POST['emri'], krijohet variabli $emri,
Pr $_POST['fjalekalimi'], krijohet variabli $fjalekalimi,
e kshtu me radh, deri te antari i fundit i $_POST
Po prej nga do t vinin antart e tjer t $_POST, kur n formular i kemi vetm dy fusha? Do t
vinin nga nj formular i modifikuar, apo nj skript e sulmuesit.
Ja nj shembull se si mund t ndrrohen vlerat e variablave t skripts, duke u ndikuar nga vlerat e
lexuar nga $_POST, me konverzion automatik si n shembullin e msiprm:
1
2
3
4
5
6
7
8
9
10
11

<?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!

Aspekte t siguris n PHP

104

Kufizimi i vlerave t inputit


//

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.

Object Oriented Programming


N PHP mund t programojm n dy mnyra:
Programim procedural
Programim i bazuar n objekte
Shembujt q jan dhn n libr, t gjitha kan qen t bazuara n programim procedural.
ka nnkuptohet me programim procedural?
Ta marrim si shembull nj faqe pr paraqitjen e produkteve. Pr ta shfaqur at faqe duhen t kryhen
disa veprime:

Konektimi me MySQL server


Drgimi i SQL krkess
Ekzekutimi i SQL krkess
Pranimi i rezultateve
Analiza nse ka apo ska rezultate
Nse ka - formohet cikli i cili i lexon nj nga nj rreshtat me t dhna t pranuara nga SQL
tabela
Kryhen llogaritjet e nevojshme
Shfaqen rezultatet n shfletues
Mbyllet koneksioni me server
Ktu shohim se rreshtat programor ekzekutohen njri pas tjetrit n mnyr sekuencionale, me nj
renditje t paracaktuar se ka vjen para e ka pas.
Nj program i till mund t degzohet dhe mund t ket iteracione (prsritje, cikle) t blloqeve
t rreshtave programor (programim procedural i strukturuar_. Sido q t jet strukturuar kodi, ai
gjithmon e ndjek nj sekuenc t paradefinuar t ekzekutimit t rreshtave programor.
Mund t themi se jan tri konstrukte kryesore t programimit procedural:
Sekuenca. Ekzekutimi i urdhrave njri pas tjetrit.
Degzimi. Ndarja e rrjedhs s ekzekutimit n deg.
Iteracioni. Prsritja e nj blloku t rreshtave programor.

Object Oriented Programming

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,

Object Oriented Programming

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;
}

Me kt kemi caktuar vizibilitetin e variablave (respektivisht t vetive. n terminologjin e OOP).


Vetia publike (public), mund t lexohet dhe ndryshohet nga kontrolleri, pra mund t ndryshohet nga
jasht klass. Si publike i zgjedhim ato veti t cilat jan vlera me t cilat ne e furnizojm klasn
pr t kryer llogaritje t mtejme.
Vetia e mbrojtur (protected) nuk sht e dukshme jasht klass, pra kontrolleri yn as nuk mund ta
shoh, as ta ndryshoj. T tilla e deklarojm variablat t cilat prdoren brenda klass pr llogaritjen
e vlerave t ndrmjetme, vlerat e t cilave nuk kan ndonj rndsi pr kontrollerin. Me deklarimin e

Object Oriented Programming

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;
}
}

Tash, n kontrollerin ton mund t shkruajm kshtu:


1
2
3
4
5
6

<?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();

q do t shfaq n browser numrin 16.

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.

Kshtu gradualisht e ndrton nj struktur t aplikacionit q do ta prdor n projektet e veta t reja.


Problemi i vetm sht cilsia e vet funksioneve; nuk mund t pritet q nj autor ti njoh t gjitha
aspektet e problemeve n zhvillimin e Web aplikacioneve dhe i vetm t ballafaqohet me t gjitha
situatat.
Nj prej zgjidhjeve t gatshme pr shum aspekte t nj aplikacioni sht prdorimi i Composer/Packagist,
ku mund t gjejm me mijra pako q zgjidhin probleme nga m t ndryshmet.
Megjithat, si baz pr nj projekt t ri duhet t prdoret nj aplikacion i cili n vete i ka t prfshira
t gjitha zgjidhjet pr gjrat q nevojiten m s shpeshti. Ktu vijn n shprehje PHP frameworks.
Pra, PHP framework sht nj Web aplikacion i gatshm, i cili:

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

Lista e PHP frameworks


Ndr PHP frameworks m t prdorur jan:

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:

Kompleksitet i aplikacionit q do ta zhvillojm


Skalabiliteti i aplikacionit
Koha e nevojshme pr kompletimin e aplikacionit
Prvoja dhe niveli i njohurive e programuesit n aspekte t ndryshme t programimit n PHP.
si jan njohja e koncepteve t OOP, etj.

Pr fillestart, m s shpeshti rekomandohet CodeIgniter, pr shkak se:

sht platform e dshmuar


Msohet relativisht leht
Ka baz t gjer t prdoruesve
Dokumentacionin e ka gjithprfshirs dhe t qart

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

die("Nuk keni te drejte ta vizitoni kete faqe!")

echo
E printon nj tekst, numr, vler t variabls.

Referenca e funksioneve/urdhrave t prdorura

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.

Referenca e funksioneve/urdhrave t prdorura

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>";
?>

Ora, Minutat, Sekondat, Muaji, Dita, Viti, Koha_verore


Koha verore = 1

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()

Referenca e funksioneve/urdhrave t prdorura

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);
?>

Prezanton t dhnat mbi nj variabl n form t lexueshme.

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.

Referenca e funksioneve/urdhrave t prdorura

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>";
?>

Koha aktuale + (7 dit * 24 or * 60 minuta * 60 sekonda)

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.

You might also like