mysqli

## Konektimi me databazë

Për konektim me databaza, PHP përdor tri API të ndryshme:

  • PHP’s MySQL Extension
  • PHP’s mysqli Extension
  • PHP Data Objects (PDO)

Ne do ta përdorim ekstensionin mysqli (MySQL Improved), meqenëse ekstensioni MySQL nuk rekomandohet të përdoret për arsye të sigurisë.

Ekstensioni mysqli mundëson përdorimin në stilin procedural dhe stilin OOP (Object Oriented Programming), prej të cilave ne do ta përdorim të parën për spjegim më të thjeshtë.

Veprimi i parë që duhet të bëhet është akti i lidhjes, gjegjësisht konektimit në databazë.

Me këtë rast duhet të ofrohen të dhënat vijuese:

  • Host, pra adresa e kompjuterit ku është i instaluar MySQL serveri
  • Emri i përdoruesit të databazës (user)
  • Fjalëkalimi i databazës (password)
  • Emri i databazës (name)

Ata që përdorin WAMP, nëse nuk e kanë konfiguruar ndryshe, do t’i përdorin këto vlera:

  • Host: 127.0.0.1 ose localhost
  • User: root
  • Password: nuk ka fjalëkalim
  • Name: emri i databazës që dëshirohet të përdoret, në rastin tonë ickshop.

Për konektim përdoret funksioni mysql_connect(), të cilit i jepen 4 vlerat e cekura:

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

Natyrisht, në serverët e produksionit, pra në remote host, në asnjë mënyrë nuk lejohet krijimi i përdoruesit pa fjalëkalim. Fjalëkalimi duhet të jetë i gjatë dhe kompleks, për shkaqe sigurie.

Meqenëse shumë skripta të aplikacionit mund të kenë nevojë për t’u konektuar me databazën, nuk do të ishte praktike që në secilën thirrje të funksionit mysqli_connect() t’i shënojmë direkt të dhënat e kërkuara (host, name, user, password). Kjo për arsye se kur dëshirojmë ta ndryshojmë ndonjërën nga këto vlera, ndryshimet do të duhej t’i bënim në secilën prej skriptave.

Për këtë shkak, rekomandohet që të dhënat për konektim në databazë të vendosen në një fajll të veçantë, i cili fajll do të inkludohet (me require ose include) kudo të jetë nevoja. Nëse duhet të ndryshohen parametrat, ndryshimet bëhen vetëm te ai fajll.

db.php

1 define("DB_HOST", "localhost");
2 define("DB_USER", "root");
3 define("DB_PASS", "");
4 define("DB_NAME", "ickshop");

skriptat:

1 include("db.php");
2 $dbcon = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
3 .
4 .
5 .

Funksionet kryesore

mysqli_connect()

Hapja e një koneksioni të ri me MySQL serverin. Si vlerë kthyese e jep një objekt i cili e përfaqëson atë koneksion.

Sintaksa:

1 mysqli_connect(host,username,password,dbname,port,socket);

Katër argumentet e para i pamë në shembullin e mëparshëm.

Argumenti “port” cakton TCP portin e MySQL serverit. Nëse nuk shënohet, nënkuptohet vlera 3306.

Argumenti “socket”, që tregon emrin e “MySQL socket file”, një fajll i formatit të veçantë për transmetimin e të dhënave në server dhe nga serveri. Krijohet automatikisht dhe lokacionin përcaktohet në my.ini, me direktivën socket.

Në Windows: C:\wamp\bin\mysql\mysql5.6.17\my.ini

1 socket		= /tmp/mysql.sock

Në rast se konektimi dështon, vlera kthyese e funksionit është FALSE. Kjo vlerë mund të shfrytëzohet për të verifikuar nëse konektimi ka qenë i suksesshëm.

 1 <?php
 2 $dbcon = mysqli_connect("localhost","root","","ickshop");
 3 
 4 if (!$dbcon)
 5 {
 6 echo "Konektimi dështoi!";
 7 die();
 8 }
 9 .
10 .
11 .
12 ?>

mysqli_set_charset()

Caktimi i character set të koneksionit.

Përdoret vlera “utf8” për kompatibilitet me shumicën e alfabeteve botërore.

Gjatë krijimit të databazës, si vlerë për Collation mund të përdoret utf8_unicode_ci.

Në HTML dokumente, meta tagu charset duhet të jetë <meta charset="utf-8">.

Me këto veprime sigurohet që të mos shfaqen karaktere të gabuara nëpër faqet e sajtit, që mund të jenë pasojë e mospërputhjes së character set.

1 mysqli_set_charset($dbcon, 'utf8');

mysqli_connect_errno()

Tregon kodin e gabimit që paraqitet në rastet kur dështon konektimi në server.

  • 2002 - Serveri e refuzon konektimin. Hosti nuk ekziston ose porti i gabuar.
  • 1044 - Përdoruesit të cekur i refuzohet konektimi në server. Emër i gabuar.
  • 1045 - Përdoruesit të cekur i refuzohet konektimi në server. Fjalëkalim i gabuar.
  • 1049 - Databazë e panjohur. Emri i databazës nuk është shkruar mirë.

mysqli_connect_error()

Njëjtë 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);

Përdorimi:

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

Çdo e dhënë që duhet të regjistrohet në databazë, me INSERT apo me UPDATE, duhet paraprakisht të pastrohet, për të parandaluar futjen e të dhënave që potencialisht mund të jenë të rrezikshme, psh. ato që mund të shkaktojnë SQL injection.

Funksioni mysqli_real_escape_string() bën konvertimin karaktereve speciale (NUL, \n, \r, \, ‘, “ dhe Control-Z) në escape code, të sigurta për t’u ruajtur në databazë. Merret parasysh charset i databazës, prandaj është më i sigurtë se funksionet korresponduese të PHP, si addslashes. Nuk mund të thirret nëse nuk është vendosur koneksioni me MySQL serverin.

mysqli_query()

Ekzekutimi i SQL kërkesave.

mysqli_fetch_array()

1 $row= mysqli_fetch_array($result, MYSQLI_ASSOC);

mysqli_num_rows()

Përdorimi: mysqli_num_rows($dbcon);

Tregon sa rekorde të tabelës janë lexuar me ekzekutimin e një urdhëri SELECT.

mysqli_affected_rows()

Përdorimi: mysqli_affected_rows($dbcon)

Tregon mbi sa rekorde të tabelës ka pasur efekt ndonjëri prej urdhërave: UPDATE, DELETE apo INSERT. Për shembull, sa rekorde janë fshirë me ekzekutimin e SQL kërkesës së fundit që përmban DELETE.

mysqli_free_result()

Përdorimi:

1 mysqli_free_result($result)

E largon rezultatin e një SQL kërkese të ekzekutuar nga RAM memorja e Web serverit. Shpesh ndodh që SQL kërkesat të lexojnë nga ndonjë tabelë një sasi të madhe të rreshtave, ku të gjitha ato vendosen brenda një variabli, si në shembullin vijues:

1 $q = "SELECT * FROM products";
2 $result = mysqli_query($dbcon, $q);

Nëse SQL kërkesa 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ë dhënat e ruajtura në ‘$result’, ai variabël duhet të zbrazet, për ta liruar RAM memorjen. Kjo është me rëndësi sepse në Web server mund të jenë të vendosur shume Web sajte ku secila mund të ketë shumë vizitorë, ndërkohë që RAM memorja është një resurs që shfrytëzohet bashkarisht nga të gjithë, prandaj duhet ta shfrytëzojmë sa më racionalisht.

mysqli_close()

Përdorimi:

1 mysqli_close($dbcon)`

E mbyll koneksionin e zgjedhur. Në fund të procesimit të të dhënave të lexuara nga databaza, rezultatet duhet të fshihen me mysqli_free_result() dhe koneksioni të mbyllet me mysqli_close().