Në guidën e parë rreth MySQL me PHP ju tregova si të bëni disa nga veprimet themelore për t’ju hapur rrugën drejt përdorjes së një baze të dhënash në aplikacionet që kodoni. Nëse jeni fillestar absolut në MySQL (dhe SQL në përgjithësi) ju këshilloj ta lexoni atë guidë një herë, përndryshe nuk do kuptoni shumë këtu.
Qëllimi i kësaj guide është që ta përdorim një databazë për më tepër se disa veprime të thjeshta selektimi apo ndryshimi. Do t’ju tregoj disa komanda të thjeshta, por ndërkohë mjaft të nevojshme për të: Renditur, grupuar, limituar, numëruar, gjetur maksimumin e minimumin, gjetur mesataren dhe shumën. Më duhet t’ju them se disa nga këto komanda mund të replikohen thjeshtë me funksionet e PHP, por do ishte një praktikë vërtetë e keqe. MySQL është optimizuar që ti kryejë këto veprime me maksimumin e efikasitetit, prandaj pse mos ti përdorim?!
Si fillim do krijoj një tabelë dhe do e mbush me disa të dhëna për ti ilustruar shembujt me vlera reale.
Tabela “perdoruesit”
————————
id – INT – PRIMARY – AUTO INCREMENT
emri – TINYTEXT
roli – ENUM(‘normal’, ‘moderator’, ‘admin’)
postime – INT
Disa të dhëna imagjinare në tabelë:
id – emri – roli – postime
—————————-
1 – Genci – admin – 544
2 – Tani – moderator – 312
3 – Zana – moderator – 253
4 – Genti – normal – 109
5 – Mandi – normal – 247
6 – Linda – normal – 392
Me tabelën e krijuar dhe të dhënat në vendin e tyre, mund të nisim menjëherë me komandat që na interesojnë për ti manipuluar këto të dhëna.
Renditja (ORDER BY)
Renditjen e të dhënave e ilustrova kalimthi që në guidën e parë, megjithatë mendoj se meriton një vend të dedikuar për ta shpjeguar pak fare më mirë. Komanda për ti renditur informacionet sipas një kolone të caktuar është ORDER BY.
Shembulli më poshtë i rendit të dhënat alfabetikisht (a-z) sipas emrit.
| PHP | | Kopjo Kodin | | ? |
| 1 | <?php |
| 2 | $rezultatet = mysql_query("SELECT emri, postime FROM perdoruesit ORDER BY emri"); |
| 3 | while($vlerat = mysql_fetch_array($rezultatet)){ |
| 4 | echo $vlerat['emri'] . ' - ' . $vlerat['postime'] . '<br />'; |
| 5 | }?> |
Kodi i mësipërm do prodhojë rezultatet e mëposhtme. Pra, si ç’e shikoni, emrat janë renditur alfabetikisht nga a-z.
Genci – 544
Genti – 109
Linda – 392
Mandi – 247
Tani – 312
Zana – 253
Po sikur të duam që rezultatet të shfaqen në rend zbritës? Le të themi që na duhet ti rendisim përdoruesit sipas numrit të postimeve, nga personi me më shume postime në atë me më pak. Shumë e thjeshtë! Mjafton të shtojmë komandën DESC (Descending – Zbritës) dhe këtë e kam ilustruar më poshtë.
| PHP | | Kopjo Kodin | | ? |
| 1 | <?php |
| 2 | $rezultatet = mysql_query("SELECT emri, postime FROM perdoruesit ORDER BY postime DESC"); |
| 3 | while($vlerat = mysql_fetch_array($rezultatet)){ |
| 4 | echo $vlerat['emri'] . ' - ' . $vlerat['postime'] . '<br />'; |
| 5 | } |
| 6 | ?> |
Kodi i mësipërm do të prodhojë rezultatin e mëposhtëm. Përdoruesit janë renditur sipas numrit të postimeve në rend zbritës (i madhi deri tek i vogli).
Genci – 544
Linda – 392
Tani – 312
Zana – 253
Mandi – 247
Genti – 109
Duke përdorur komandën ORDER BY arritëm ti rendisim të dhënat në rend rritës dhe zbritës, duke i shfaqur të dhënat nga tabela në mënyrën që donim. Kjo është një nga komandat e përdorura më shpesh në aplikacione sepse logjikisht të dhënat duhen renditur para se të shfaqen.
Limitimi (LIMIT)
Limitimi është gjithashtu një komandë që do e përdorni shumë shpesh në aplikacione. Sintaksa është vërtetë e thjeshtë dhe do e shpjegoj me vetëm dy raste.
Veprimi që dua të kryej është shfaqja e 3 përdoruesve me më shumë postime në tabelën tonë. Për këtë do përdor edhe ORDER BY.
| PHP | | Kopjo Kodin | | ? |
| 1 | <?php |
| 2 | $rezultatet = mysql_query("SELECT emri, postime FROM perdoruesit ORDER BY postime DESC LIMIT 3"); |
| 3 | while($vlerat = mysql_fetch_array($rezultatet)){ |
| 4 | echo $vlerat['emri'] . ' - ' . $vlerat['postime'] . '<br />'; |
| 5 | } |
| 6 | ?> |
Kodi mësipër i rendit përdoruesit sipas numrit të postimeve në rend zbritës (pra më i madhi në fillim) dhe i limiton rezultatet me vetëm 3 rreshta. Pra përfitojmë vetëm 3 rreshtat e parë të rezultatit të kthyer.
Limitimi mund të marrë gjithashtu formë tjetër, ku përcaktojmë rreshtin e nisjes dhe atë të përfundimit. Po ju jap një shembull. Në tabelën e përdoruesve dua të marr vetëm 3 përdorues, duke filluar nga përdoruesi i 2. Dua të marr përdoruesit me id 2, 3 dhe 4. Realizimi është shumë i thjeshtë.
| PHP | | Kopjo Kodin | | ? |
| 1 | <?php |
| 2 | $rezultatet = mysql_query("SELECT emri, postime FROM perdoruesit LIMIT 1,3"); |
| 3 | while($vlerat = mysql_fetch_array($rezultatet)){ |
| 4 | echo $vlerat['emri'] . ' - ' . $vlerat['postime'] . '<br />'; |
| 5 | } |
| 6 | ?> |
Besoj e vini re sintaksën e ndryshuar dhe 2 numrat e vendosur pas LIMIT. Numri i parë përcakton rreshtin fillestar; kini parasysh që rreshti i parë në databazë përcaktohet me numrin 0, prandaj kam shkruar 1 dhe jo 2 për të filluar tek rreshti i dytë. Ndërsa numri i dytë përcakton sa rreshta më pas (përfshirë rreshtin fillestar) duam të zgjedhim (në këtë rast 3). Kodi i mësipërm do të shfaqë rezultatet e mëposhtme.
Tani – 312
Zana – 253
Genti – 109
Numërimi (COUNT)
Numërimi është një funksion fare i thjeshtë i cila përdoret vetëm për një qëllim – e gjetët, është pikërisht për të numëruar të dhënat. Nëse do donim të dinim sa përdorues ka tabela jonë, atëherë do shkruanim kodin e mëposhtëm:
| PHP | | Kopjo Kodin | | ? |
| 1 | <?php |
| 2 | $rezultatet = mysql_query("SELECT COUNT(*) FROM perdoruesit"); |
| 3 | $vlerat = mysql_fetch_array($rezultatet); |
| 4 | echo $vlerat['COUNT(*)']; |
| 5 | ?> |
Kodi i mësipërm shfaq numrin 6, që është numri i përdoruesve në tabelë. Më thjeshtë se kaq nuk ka ku të shkojë, sidoqoftë do ju tregoj edhe 2 shembuj të tjerë për t’ju ofruar pak më tepër mësim. Shembulli i parë prodhon egzaktësisht të njëjtin rezultat si ai më sipër, por do të përdor një variabël në MySQL për të ruajtur vlerën e COUNT(*). Në këtë mënyrë kodi është paksa më i bukur e më i thjeshtë për tu përdorur; ndoshta në këtë shembull nuk bie aq shumë në sy, por në kode të avancuara variablat të “shpëtojnë jetën”.
| PHP | | Kopjo Kodin | | ? |
| 1 | <?php |
| 2 | $rezultatet = mysql_query("SELECT COUNT(*) AS totali FROM perdoruesit"); |
| 3 | $vlerat = mysql_fetch_array($rezultatet); |
| 4 | echo $vlerat['totali']; |
| 5 | ?> |
Në shembullin e dytë do kombinojmë funksionin COUNT dhe komandën WHERE për të numëruar sa moderatorë kemi në tabelë.
| PHP | | Kopjo Kodin | | ? |
| 1 | <?php |
| 2 | $rezultatet = mysql_query("SELECT COUNT(*) AS totali FROM perdoruesit WHERE roli='moderator'"); |
| 3 | $vlerat = mysql_fetch_array($rezultatet); |
| 4 | echo $vlerat['totali']; |
| 5 | ?> |
Kjo është praktikisht gjithçka që ju duhet të dini rreth numërimit. Si ekstra po ju them se është provuar me teste se COUNT është më e shpejtë se funksioni i PHP mysql_num_rows(), edhe prej vetë arkitekturës së MySQL, por edhe prej faktit se query-t ruhen në cache dhe ripërdoren pa pasur nevojë të ripërpunojë tabelën.
Minimumi (MIN) dhe Maksimumi (MAX)
Minimumi dhe maksimumi janë funksione që në praktikë nuk gjejnë përdorim masiv (të paktën sipas eksperiencës time), por atëherë kur duhen, e bëjnë punën më së miri. Përdorimi është fare i thjeshtë dhe për ti ilustruar do ju jap 2 shembuj.
Shembulli i parë gjen përdoruesin me më pak postime në tabelë.
| PHP | | Kopjo Kodin | | ? |
| 1 | <?php |
| 2 | $rezultatet = mysql_query("SELECT MIN(postime) AS min FROM perdoruesit"); |
| 3 | $vlerat = mysql_fetch_array($rezultatet); |
| 4 | echo $vlerat['min']; |
| 5 | ?> |
Rezultati do të jetë 109. Me egzaktësisht të njëjtën ide, do gjejmë përdoruesin me numrin më të lartë të posimeve duke përdorur funksionin MAX().
| PHP | | Kopjo Kodin | | ? |
| 1 | <?php |
| 2 | $rezultatet = mysql_query("SELECT MAX(postime) AS maks FROM perdoruesit"); |
| 3 | $vlerat = mysql_fetch_array($rezultatet); |
| 4 | echo $vlerat['maks']; |
| 5 | ?> |
Si ju tregova, në MySQL është shumë e lehtë të gjendet minimumi dhe maksimumi i disa vlerave.
Mesatarja (AVG) dhe Shuma (SUM)
Për ti kompletuar njohuritë e veprimeve të thjeshta matematike, do merremi me funksionet e mesatares dhe shumës. Përsëri përdorimi është shumë i thjeshtë dhe ngjason me COUNT, MIN dhe MAX.
Le të shkruajmë një kod që gjen mesataren e postimeve në tabelën e përdoruesve.
| PHP | | Kopjo Kodin | | ? |
| 1 | <?php |
| 2 | $rezultatet = mysql_query("SELECT AVG(postime) AS mes FROM perdoruesit"); |
| 3 | $vlerat = mysql_fetch_array($rezultatet); |
| 4 | echo ceil($vlerat['mes']); |
| 5 | ?> |
Me një query të ngjashme me ato që kemi përdorur deri tani, gjeta mesataren e postimeve. Mund ta keni parë funksionin ceil() dhe ndoshta po pyesni veten çfarë është! Funksioni ceil() e rrumbullakos numrin në vlerën e plotë më të lartë (tavan – ceiling). Pa funksionin ceil(), rezultati do ishte: 309.5000, ndërsa me ceil() vlera është: 310.
Në shembullin në vijim do ilustroj se si mund të gjejmë shumën e të gjitha postimeve me vetëm një query duke përdorur funksionin SUM. Sintaksa është përsëri e ngjashme me ato që kemi përmendur deri tani, prandaj s’duhet të ketë asgjë të re përveç SUM.
| PHP | | Kopjo Kodin | | ? |
| 1 | <?php |
| 2 | $rezultatet = mysql_query("SELECT SUM(postime) AS shuma FROM perdoruesit"); |
| 3 | $vlerat = mysql_fetch_array($rezultatet); |
| 4 | echo ceil($vlerat['shuma']); |
| 5 | ?> |
Grupimi (GROUP BY)
Përmes grupimit i mbledhim të dhënat në grupe (sigurisht) sipas një karakteristike të caktuar. Në teori mund të mos ketë shumë sens, prandaj le të kalojmë menjëherë në shembuj.
Dua të di sa përdorues kemi për çdo rol. Pa përdorur groupim, do më duhej të bëja 3 query të ndryshme (SELECT COUNT(*) FROM perdoruesit WHERE roli=’x'), 1 për secilin rol. Po sikur të kisha 20 role të ndryshme? Do më shtohej kodi pa arsye. Me grupim e realizojmë me vetëm një query, të ilustruar më poshtë.
| PHP | | Kopjo Kodin | | ? |
| 1 | <?php |
| 2 | $rezultatet = mysql_query("SELECT COUNT(*) AS totali, roli FROM perdoruesit GROUP BY roli"); |
| 3 | while($vlerat = mysql_fetch_array($rezultatet)){ |
| 4 | echo $vlerat['roli'] . ' -> ' . $vlerat['totali'] . '<br />'; |
| 5 | } |
| 6 | ?> |
Më thjeshtë se kaq nuk bëhet. I kam grupuar të dhënat sipas rolit dhe kam afishuar totalin e rreshtave për secilin rol. Kodi i mësipërm prodhon rezultatin e mëposhtëm:
normal -> 3
moderator -> 2
admin -> 1
Ky është përdorimi bazë i GROUP BY dhe nuk ka më shumë për tu diskutuar. Mund të përdorni funksionet e treguara më sipër për të llogaritur Shumën, Mesataren, Minimumin dhe Maksimumin e postimeve për secilin grup. Mund të përdorni gjithashtu edhe komandën WHERE për të filtruar të dhënat apo ORDER BY për ti renditur.
Përfundimi
Ky ishte mësimi i dytë i serisë “Bazat e MySQL me PHP”. Kam akoma për t’ju mësuar rreth MySQL, por njohuritë që keni marrë deri tani do ju lejojnë të bëni shumë veprime me baza të dhënash dhe janë funksionet/komandat më të përdorura. Në mësimet e ardhshme, do ju tregoj komanda të reja për lidhjen e tabelave dhe për të kryer funksione përgjithësisht më të avancuara.
Mësim të mbarë.






Shume Faleminderit per kete tutorial, se me ka hyre shume ne pune.
Shpresoj qe tutorialet ne vijim te jene te nje niveli te tille dhe me te shpeshta.
Ky eshte Feniksi…
Shumë artikull i mirë nga një sy i shpejt që i hodha. Kisha një pyeta:
Ku ndryshon myslq_ nga mysqli_? Kam lexuar ca gjëra kohet e fundit dhe aty komandat kishin atë i-në pas mysql.
MySQLi eshte ekstension i PHP-se, i menduar te ofroje funksionalitetet e MySQL Server pas versionit 4.1.3. Praktikisht zevendeson “MySQL extension” dhe keshillohet nga vete manuali i PHP-se te perdoret per servera MySQL 4.1.3+. Shto ne listen e avantazheve edhe funksionimin me objekte, prepared statements, transaksionet, etj dhe kuptohet qe eshte alternative shume me e mire se ekstensioni baze.
Ne kete guide kam perdorur mysql_ sepse nuk po bej asgje me te vecante se disa veprime baze, keshtu qe nuk ja vlente ta nderlikoja. Por tani qe ma kujtove, mund te nevojitet nje seri guidash kastile per MySQLi
Tani është koha për një “MySQL me PHP 3″ ku mund të mbulosh dika të përafërt me këtë gjënë e frikshme këtu poshtë:
$query = "SELECT p.*
FROM wp_posts AS p
INNER JOIN wp_postmeta AS p1
ON (p.ID = p1.post_id)
CROSS JOIN
wp_postmeta AS p2
USING (post_id)
CROSS JOIN
wp_postmeta AS p3
USING (post_id)
CROSS JOIN
wp_postmeta AS p4
USING (post_id)
CROSS JOIN
wp_postmeta AS p5
USING (post_id)
WHERE
$location
AND
$bedrooms
AND
$price
AND
$bathrooms
AND
$rob
ORDER BY convert(p3.meta_value, signed)
";
lol. Goxha e madhe si query, por nuk eshte realisht shkence. Leksionin tjeter per MySQL e kam parashikuar dhe pikerisht per JOINs do flase. Por jane disa guida te tjera me prioritet me te larte nderkohe, keshtu qe thjeshte pak durim
Me durimin jam goxha lartë – flm për lajmin e mirë