Title: Leksion 13
1Aksesimi i bazes se te dhenave MySQL nepermjet
PHP-se
2Arkitektura e nje baze te dhenash ne web
- Veprimi baze i nje web serveri tregohet ne
figure. Sistemi perbehet nga dy objekte nje Web
server dhe nje Web browser. Ndermjet tyre
kerkohet nje linje komunikimi Nje web browser
ben nje kerkese ne web server dhe web serveri
kthen pergjigjen. - Kjo arkitekture perdoret per shperndarjen e
faqeve statike. Ndersa per web sitet me nje baze
te dhenash, arkitektura eshte pak me komplekse
3Arkitektura e nje baze te dhenash ne web
- Nje transaksion tipik i bazes se te dhenave web
perbehet nga etapat e meposhtme - Web browseri i nje perdoruesi dergon nje kerkese
HTTP per nje faqe web te caktuar. Psh mund te
beje nje kerkim per te gjithe librat ne bazen e
te dhenave Books te shkruar nga Laura Thomson,
duke perdorur nje forme HTML. Faqja e rezultateve
te kerkimit quhet results.php - Web serveri merr kerkesen per results.php, merr
skedarin dhe ia dergon ate motorit te PHP-se per
procesim.
4Arkitektura e nje baze te dhenash ne web
- Motori PHP fillon duke analizuar (parsing)
skriptin. Brenda skriptit eshte nje komande per
tu lidhur me bazen e te dhenave dhe per te
ekzekutuar nje query (kryen kerkimin per librat).
PHP hap nje lidhje me serverin MySQL dhe i dergon
query-n e duhur. - Serveri MySQL e merr query-n e bazes se te
dhenave dhe e perpunon ate, dhe dergon
rezultatet, nje liste librash, ne motorin e
PHP-se - Motori i PHP-se perfundon ekzekutimin e skriptit,
i cili zakonisht do te perfshije formatimin e
rezultateve te query-t, ne menyre te kendeshme ne
HTML. Ai me pas i kthen rezultatet HTML ne Web
server. - Web Serveri e kalon HTML-ne ne browser, ku
perdoruesi mund te shohe listen e librave qe ka
kerkuar.
5Percaktimi se cilen Pakete MySQL duhet te perdorni
- Paketa mysqli (MySQL Improved) u be e
disponueshme me PHP 5 dhe eshte dizenjuar qe te
punoje me versionin 4.1.3 te MySQL-se dhe me
versionet e mevonshme. - Versionet me te hershme duhet te perdorin paketen
mysql - Paketa mysqli eshte paketa ekuivalente e
orientuar nga objektet (object-oriented) e
paketes mysql, por mund te perdoret edhe ne
menyre procedurale. - Paketa mysqli ka permiresuar shpejtesine,
sigurine dhe kompatibilitetin me librarite.
6Hapja dhe mbyllja e nje lidhjeje MySQL
- Per te hapur nje lidhje me nje server databaze
MySQL perdoret funksioni mysql_connect() - Funksioni mysql_connect() kthen nje numer te
plote pozitiv nese ai lidhet me databazen ne
menyre te suksesshme, perndryshe kthen FALSE - Vlera e kthimit te funksionit mysql_connect()
duhet ti jepet si vlere nje variabli ne menyre
qe te aksesoni databazen brenda skriptit tuaj.
7Hapja dhe mbyllja e nje lidhjeje MySQL (vazhd.)
- Sintaksa e mysql_connect() eshte
- connection mysql_connect("host" , "user",
"password") - Parametri host percakton emrin e hostit ku eshte
i instaluar serveri i databazes suaj MySQL - Parametrat user dhe password percaktojne emrin
perdoruesit dhe passwordin e nje llogarie MySQL
8Hapja dhe mbyllja e nje lidhjeje MySQL (vazhd.)
- Lidhja me databazen i jepet si vlere variablit
DBConnect - DBConnect mysql_connect("localhost",
"dongosselin ", "rosebud") - Lidhja me databazen mund te mbyllet me ane te
funksionit mysql_close() - mysql_close(DBConnect)
9Hapja dhe mbyllja e nje lidhjeje MySQL (vazhd.)
10Hapja dhe mbyllja e nje lidhjeje MySQL (vazhd.)
- Figure 8-1 MySQLInfo.php ne nje Web browser
11Hapja dhe mbyllja e nje lidhjeje MySQL (vazhd.)
- Nje funksion tjeter qe ben pothuajse te njejten
gje si funksioni mysql_connect eshte funksioni
mysql_pconnect(). Ndryshimi eshte se
mysql_pconnect kthen nje lidhje te qendrueshme me
bazen e te dhenave. - Nje lidhje normale me bazen e te dhenave do te
mbyllet kur skripti e perfundon ekzektutimin ose
kur skripti therret funksionin mysql_close(). Nje
lidhje e qendrueshme mbetet e hapur pasi
perfundon ekzekutimi i skriptit dhe nuk mund te
mbyllet me funksionin mysql_close(). - Lind pyetja Pse mund te na duhet kjo? Lidhja me
nje baze te dhenash kerkon njefare kohe. Kur
thirret mysql_connect(), perpara se te perpiqet
te lidhet me bazen e te dhenave, ai do te kerkoje
automatikisht nese ka ndonje lidhje te
qendrueshme qe eshte hapur qe me pare. Nese po,
ai do te perdore ate lidhje ne vend qe te hape
nje lidhje tjeter. Kjo kursen kohen dhe ngarkesen
e serverit.
12Hapja dhe mbyllja e nje lidhjeje MySQL (vazhd.)
- Cilen te perdorim mysql_connect apo
mysql_pconnect? - Mendimet jane te ndryshme Disa mendojne se eshte
me mire te perdoret mysql_connect, sepse
mysql_pconnect() u dizenjua per te siguruar nje
mekanizem per reduktimin e kostos se hapjes dhe
mbylljes se lidhjeve me serverin MySQL.
Fatkeqesisht, per shkak te bashkeveprimit
ndermjet arkitektures se serverit Apache dhe
arkitektures se PHP-se, trafiku i larte ne nje
site qe perdor lidhje te qendrueshme (pconnect)
shpejt mund ta mbushe serverin MySQL me shume
lidhje te paperdorura, gje qe do te ndalonte
shume lidhje aktive qe te aksesonin databazen.
13Raportimi i gabimeve MySQL
- Arsyet per te mos u lidhur me nje server databaze
perfshijne - Serveri i databazes nuk eshte ne pune.
- Privilegje te pamjaftueshme per te aksesuar
burimin e te dhenave - Username dhe/ose password i pasakte
14Raportimi i gabimeve MySQL (vazhd.)
- Funksioi mysql_errno() kthen kodin e gabimit nga
perpjekja e fundit e thirrjes se nje funksioni
MySQL, ose 0 nese nuk ka ndodhur asnje gabim. - mysql_error() Kthen tekstin e mesazhit te
gabimit nga veprimi i meparshem MySQL - Funksionet mysql_errno() dhe mysql_error()
kthejne rezultatin e funksionit te meparshem
mysql()
15Zgjedhja e nje Databaze
- Sintaksa e funksionit mysql_select_db() eshte
- mysql_select_db(database , connection)
- Funksioni kthen nje vlere TRUE nese e ka zgjedhur
me sukses databazen , ose FALSE ne te kundert - Per qellime sigurie, ju mumd te zgjidhni te
perdorni nje skedar te perfshire per tu lidhur
me nje server MySQL dhe per te zgjedhur nje
databaze.
16Shembull
- lt?php
- host"localhost"
- userName "root"
- password ""
- database "test"
- db mysql_connect(host,userName,password)
- if (!db)
-
- die("Could not connect ".mysql_error())
-
- echo("Connected successfully")
- mysql_close(db)
- ?gt
- Funksioni die, ne kete shembull, printon nje
mesazh dhe del nga skripti aktual. Ky funksion
eshte nje pseudonim i funksionit exit(). Sintaksa
eshte die(message)
17Shembull
- lt?php
- db mysql_connect("localhost","root","")
- if (!db)
-
- die("Could not connect ".mysql_error())
-
- echo("Connected successfully")
- db_selected mysql_select_db("test", db)
- if (!db_selected)
- die ("Can\'t use test ".mysql_error())
-
- mysql_close(db)
- ?gt
18Kapercimi i gabimeve me operatorin e Kontrollit
te Gabimeve
- Ne menyre default, funksionet ne paketen mysql i
shfaqin gabimet dhe lajmerimet kur ato ndodhin - Perdorni operatorin e kontrollit te gabimeve (_at_)
per te kapercyer mesazhet e gabimeve - Ky operator mund ti shtohet çdo shprehjeje
19Ekzekutimi i shprehjeve SQL
- Perdorni funksionin mysql_query() per te derguar
shprehje SQL tek MySQL - Sintaksa e funksionit mysql_query() eshte
- mysql_query(query , connection)
20Ekzekutimi i shprehjeve SQL (vazhd)
- Funksioni mysql_query() kthen nje nga tri vlerat
- 1) Per shprehjet SQL qe nuk kthejne rezultate
(CREATE DATABASE dhe CREATE TABLE) kthen nje
vlere TRUE nese shprehja u ekzekutua me sukses - 2) Per shprehjet SQL qe kthejne rezultate
(SELECT) funksioni mysql_query() kthen nje
shenjues rezultati qe perfaqeson rezultatet e
query-t - Nje shenjues rezultati eshte nje tip i veçante
variabli qe i referohet rreshtit aktual te
zgjedhur ne nje bashkesi rezultatesh (resultset) - 3) Funksioni mysql_query() kthen nje vlere FALSE
per çdo shprehje SQL qe deshton, pavaresisht nese
ato kthejne rezultate apo jo.
21Shembull
- lt?php// This could be supplied by a user, for exa
mplefirstname 'fred'lastname 'fox'//
Formulate Query. This is the best way to perform
an SQL queryquery sprintf("SELECT firstname, l
astname, address, age FROM friends WHERE firstname
's' AND lastname's'", mysql_real_escape_st
ring(firstname), mysql_real_escape_string(la
stname))// Perform Queryresult mysql_query(
query)// Check result This shows the actual que
ry sent to MySQL, and the error. Useful for debugg
ing.if (!result) message 'Invalid quer
y ' . mysql_error() . "\n" message . 'Whol
e query ' . query die(message)// Use r
esult. Attempting to print result won't allow ac
cess to information in the resource// One of the
mysql result functions must be used.
See also mysql_result(), mysql_fetch_array(), mys
ql_fetch_row(), etc.while (row mysql_fetch_ass
oc(result)) echo row'firstname' ech
o row'lastname' echo row'address'
echo row'age'// Free the resources associat
ed with the result set . This is done automaticall
y at the end of the scriptmysql_free_result(resu
lt)?gt
22Shtimi, Fshirja dhe Modifikimi i Rekordeve
- Per te shtuar rekorde ne nje tabele, perdrni
fjalet kyçe INSERT dhe VALUES me funksionin
mysql_query() - Per te shtuar shume rekorde ne nje databaze,
perdorni shprehjen LOAD DATA bashke me emrin e
skedarit tekst lokal qe permban rekordet qe doni
te shtoni - Per te modifikuar rekordet ne nje tabele perdorni
shprehjen UPDATE
23Shtimi, Fshirja dhe Modifikimi i Rekordeve
- lt?phpcon mysql_connect("localhost","peter","ab
c123")if (!con) die('Could not connect
' . mysql_error()) mysql_select_db("my_db",
con)mysql_query("INSERT INTO Persons
(FirstName, LastName, Age)VALUES ('Peter',
'Griffin', '35')")mysql_query("INSERT INTO
Persons (FirstName, LastName, Age) VALUES
('Glenn', 'Quagmire', '33')")mysql_close(con)
?gt
24Shtimi, Fshirja dhe Modifikimi i Rekordeve
- Per te fshire rekordet ne nje tabele perdorni
shprehjen DELETE me funksionin mysql_query() - Per te fshire te gjithe rekordet ne tabele,
hiqeni pjesen WHERE
25Shtimi, Fshirja dhe Modifikimi i Rekordeve
- lt?phpcon mysql_connect("localhost","peter","a
bc123")if (!con) die('Could not connect
' . mysql_error()) mysql_select_db("my_db",
con)mysql_query("UPDATE Persons SET Age
'36'WHERE FirstName 'Peter' AND LastName
'Griffin'")mysql_close(con)?gt
26Marrja e rekordeve ne nje vektor te indeksuar
- Funksioni mysql_fetch_row() kthen fushat ne
rreshtin aktual te bashkesise se rezultateve ne
nje vektor te indeksuar dhe e con shenjuesin e
rezultatit ne rreshtin tjeter. - echo "lttable width'100 border'1'gt"
- echo "lttrgtltthgtMakelt/thgtltthgtModellt/thgt
- ltthgtPricelt/thgtltthgtQuantitylt/thgtlt/trgt"
- Row mysql_fetch_row(QueryResult)
- do
- echo "lttrgtlttdgtRow0lt/tdgt"
- echo "lttdgtRow1lt/tdgt"
- echo "lttd align'right'gtRow2lt/tdgt"
- echo "lttd align'right'gtRow3lt/tdgtlt/trgt"
- Row mysql_fetch_row(QueryResult)
- while (Row)
27Shembull
- lt?phpconn mysql_connect("localhost", "mysql_u
ser", "mysql_password")if (!conn) echo "
Unable to connect to DB " . mysql_error() ex
it if (!mysql_select_db("mydbname")) e
cho "Unable to select mydbname " . mysql_error()
exitsql "SELECT id as userid, fullnam
e, userstatus FROM sometable WH
ERE userstatus 1"result mysql_query(sql)
if (!result) echo "Could not successfull
y run query (sql) from DB " . mysql_error()
exitif (mysql_num_rows(result) 0)
echo "No rows found, nothing to print so am exitin
g" exit// While a row of data exists, pu
t that row in row as an associative array// Note
If you're expecting just one row, no need to use
a loop// Note If you put extract(row) inside
the following loop, you'll then create userid,
fullname, and userstatuswhile (row mysql_fetc
h_assoc(result)) echo row"userid" e
cho row"fullname" echo row"userstatus"
mysql_free_result(result)?gt
28Funksioni mysql_affected_rows()
- Me query qe kthejne rezultate (query SELECT),
perdorni funksionin mysql_num_rows() per te
gjetur numrin e rekordeve qe kthehen nga query - Me query qe modifikojne tabelat por nuk kthejne
resultate (query te tipit INSERT, UPDATE, dhe
DELETE), perdorni funksionin mysql_affected_rows()
per te percaktuar numrin e rreshtave te prekur.
29Funksioni mysql_affected_rows() (vazhd.)
- SQLstring "UPDATE company_cars SET
mileage50112.3 WHERE license'AK-1234'" - QueryResult _at_mysql_query(SQLstring,
DBConnect) - if (QueryResult FALSE)
- echo "ltpgtUnable to execute the query.lt/pgt"
- . "ltpgtError code " . mysql_errno(DBConnect)
- . " " . mysql_error(DBConnect) . "lt/pgt"
- else
- echo "ltpgtSuccessfully updated "
- . mysql_affected_rows(DBConnect) . "
record(s).lt/pgt"
30Funksioni mysql_affected_rows() (vazhd.)
Figure 8-5 Output of mysql_affected_rows()
function for an UPDATE query
31Funksioni mysql_info()
- Per query qe shtojne ose modifikojne rekorde, ose
modifikojne strukturen e nje tabele, perdorni
funksionin mysql_info() per te kthyer
informacion rreth query-t. - Funksioni mysql_info() kthen numrin e veprimeve
per tipe te ndryshme query-sh. - Funksioni mysql_info() kthen informacion rreth
query-t te fundit te ekzekutuar ne lidhjen me
databazen.
32Funksioni mysql_info() (vazhd.)
- Funksioni mysql_info() kthen informacion rreth
query-ve qe te nje nga formateve te meposhtme - INSERT INTO...SELECT...
- INSERT INTO...VALUES (...),(...),(...)
- LOAD DATA INFILE ...
- ALTER TABLE ...
- UPDATE
- Per query te tjera, qe nuk pershtaten me keto
formate, funksioni mysql_info() kthen nje string
bosh. ì
33Funksioni mysql_info() (vazhd.)
- SQLstring "INSERT INTO company_cars " .
- " (license, model_year, make, model,
mileage) " . - " VALUES " .
- " ('CPQ-894', 2011, 'Honda', 'Insight',
49.2), " . - " ('CPQ-895', 2011, 'Honda', 'Insight',
17.9), " . - " ('CPQ-896', 2011, 'Honda', 'Insight',
22.6)" - QueryResult _at_mysql_query(SQLstring,
DBConnect) - if (QueryResult FALSE)
- echo "ltpgtUnable to execute the query.lt/pgt"
- . "ltpgtError code " . mysql_errno(DBConnect)
- . " " . mysql_error(DBConnect) . "lt/pgt"
- else
- echo "ltpgtSuccessfully added the
record.lt/pgt" - echo "ltpgt" . mysql_info(DBConnect) .
"lt/pgt" -
34Funksioni mysql_info() (vazhd.)
Figure 8-6 Output of mysql_info() function for
an INSERT query that adds multiple records
35Funksioni mysql_info() (vazhd.)
- Funksioni mysql_info() gjithashtu kthen
informacion per query te tipit LOAD DATA - SQLstring "LOAD DATA INFILE 'company_cars.txt'
- INTO TABLE company_cars"
- QueryResult _at_mysql_query(SQLstring,
DBConnect) - if (QueryResult FALSE)
- echo "ltpgtUnable to execute the query.lt/pgt"
- . "ltpgtError code " . mysql_errno(DBConnect)
- . " " . mysql_error(DBConnect) . "lt/pgt"
- else
- echo "ltpgtSuccessfully added the
record.lt/pgt" - echo "ltpgt" . mysql_info(DBConnect) .
"lt/pgt"
36Funksioni mysql_info() (vazhd.)
Figure 8-7 Output of mysql_info() function for a
LOAD DATA query
37Puna me rezultatet e Query-ve
38Marrja e rekordeve me nje vektor te indeksuar
- Funksioni mysql_fetch_row() kthen fushat ne
rreshtin aktual te bashkesise se rezultateve dhe
i vendos ato ne nje vektor te indeksuar dhe e
leviz shenjuesin e rezultateve ne rreshtin
tjeter.
39Marrja e rekordeve me nje vektor te indeksuar
- SQLstring "SELECT FROM company_cars"
- QueryResult _at_mysql_query(SQLstring,
DBConnect) - echo "lttable width'100' border'1'gt\n"
- echo "lttrgtltthgtLicenselt/thgtltthgtMakelt/thgtltthgtModellt/
thgt - ltthgtMileagelt/thgtltthgtYearlt/thgtlt/trgt\n"
- while ((Row mysql_fetch_row(QueryResult)) !
FALSE) - echo "lttrgtlttdgtRow0lt/tdgt"
- echo "lttdgtRow1lt/tdgt"
- echo "lttdgtRow2lt/tdgt"
- echo "lttd align'right'gtRow3lt/tdgt"
- echo "lttdgtRow4lt/tdgtlt/trgt\n"
-
- echo "lt/tablegt\n"
40Marrja e rekordeve me nje vektor te indeksuar
Figure 8-8 Output of the company_cars table in a
Web Browser
41Marrja e rekordeve me nje vektor te shoqeruar
- Funksioni mysql_fetch_assoc() kthen fushat ne
rreshtin aktual te bashkesise se rezultateve dhe
i vendos ato ne nje vektor te shoqeruar dhe e
leviz shenjuesin e rezultateve ne rreshtin
tjeter. - Ndryshimi ndermjet mysql_fetch_assoc() dhe
mysql_fetch_row() eshte qe ne vend te kthimit te
fushave ne nje vektor te indeksuar, funksioni
mysql_fetch_assoc() i kthen fushat ne nje vektor
te shoqeruar dhe perdor secilin emer fushe si
çeles te vektorit.
42Mbyllja e Rezultateve te Query-ve
- Kur te keni mbaruar punen me rezultatet e
query-ve te marra nga funksioni mysql_query(),
perdorni funksionin mysql_free_result() per te
mbyllur bashkesine e rezultateve - Per te mbyllur bashkesine e rezultateve,
kalojini funksionit mysql_free_result()
variablin qe permban shenjuesin e rezultatit nga
funksioni mysql_query()
43Aksesimi i Informacionit te Rezultatit te Query-ve
- Funksioni mysql_num_rows() kthen numrin e
rreshtave ne rezultatin e nje query - Funksioni mysql_num_fields() kthen numrin e
fushave ne rezultatin e nje query - Te dy funksionet pranojne si argument nje
variabel te lidhjes me databazen.
44Aksesimi i Informacionit te Rezultatit te
Query-ve (vazhd.)
- SQLstring "SELECT FROM company_cars"
- QueryResult _at_mysql_query(SQLstring,
DBConnect) - if (QueryResult FALSE)
- echo "ltpgtUnable to execute the query.lt/pgt"
- . "ltpgtError code " . mysql_errno(DBConnect)
- . " " . mysql_error(DBConnect) . "lt/pgt"
- else
- echo "ltpgtSuccessfully executed the
query.lt/pgt" - NumRows mysql_num_rows(QueryResult)
- NumFields mysql_num_fields(QueryResult)
- if (NumRows ! 0 NumFields ! 0)
- echo "ltpgtYour query returned " .
mysql_num_rows(QueryResult) . " rows and " - . mysql_num_fields(QueryResult) . "
fields.lt/pgt" - else
- echo "ltpgtYour query returned no
results.lt/pgt" - mysql_close(DBConnect)
45Aksesimi i Informacionit te Rezultatit te
Query-ve (vazhd.)
Figure 8-10 Output of the number of rows and
fields returned from a query
46 47Reference
- Per informacione me te detajuara mund te
kosultoheni me manualin e MySQL ne adresen - http//www.php.net/manual/en/ref.mysql.php