1.24.2014

Krajnje vrijeme za mysqli

PHP podrzava MYSQL koristeći svoju mzsql ekstenziju. Tako da danas postoje hiljade aplikacija napisanih u PHP-u, ako ne i milioni. Ali PHP tim je objavio planove sredinom 2011 da napuštaju MySQL ekstenziju. Tako je stara MySQL ekstenzija oficijelno označena kao zastarila od PHP-a verzije 5.5.0 i u budućnosti će biti potpuno uklonjena. Alternative od PHP-a verzije 5 i više su MySQLi ("i" znači "improved" unapređen) i PDO (PHP Data Objects). U ovom postu ja ću govoriti o MySQLi.

MySQL ekstenzija nije podržavala "Prepared Statements" koje MySQLi podržava (pored Transactions, Stored precedures....). "Prepared Statements" su veoma bitne pri izradi php aplikacija jer imaju sigurnosnu ulogu jer sprečavaju SQL injekciju. Njihovim korišćenjem nije neophodno pripremati ili eskejpovati stringove prije unosa u bazu.

Instalacija

MySQLi ekstenzija je u većini slučajeva automatski instalirana kada se instalira php mysql paket (Linux,Windows).

Na Debian Linux-u i Ubuntu dovoljno je izvršiti:

apt-get install php5-mysql

Dok na CentOS-u ili RedHat-u treba izvršiti:

yum install php-mysql

Detaljne instrukcije za svaki OS možete naći ovde.

Nakon instalacije prilikom poyivanja phpinfo(); treba da imate sličan rezultat.

Konektovanje


MySQLi podržava objektni i proceduralni način konekcije, preporučen je objektni način.

Prvo definišete parametre za konekciju.

$server = "naziv servera ili ip adresa"; // npr `localhost` ili `192.168.0.26`
$username = "korisnik";
$password = "lozinka";
$db="naziv baze";

$conn = new mysqli($server,$username,$password,$db);

//provjera konekcije

if($conn->connect_error){
 trigger_error("Konekcija neuspješna: ".$conn->connect_error, E_USER_ERROR);
}

Kako se iz primjera gore vidi mysql je klasa pa se može pozvati koristeći new. Prilikom pozivanja potrebno je navesti parametre slično kao i pri korištenju mysql ekstenzije.

SELECT

Koristeći sledeću sintaksu:

$sql = "SELECT col1,col2 FROM table WHERE condition";
$result = $conn->query($sql);
if ($result === false) {
  trigger_error("Neispravan SQL ".$sql." Greška: ".$conn->error,E_USER_ERROR);
} else{
  $rows_returned = $result->num_rows;
}

Iz dijela koda iznad vidimo da za upit na bazu koristeći mysqli izvršavamo koristeći metod query()  kome prosljeđujemo sql upit. 

Iteracija kroz zapise

Koristeći nazive kolona:

$result->data_seek(0);
while ($row = $result->fetch_assoc()){
  echo $row[`col1`]."<br>";

Koristeći indekse kolona:

$rs->data_seek(0);
while($row = $rs->fetch_row()){
    echo $row[0] . '<br>';
}
 
 
Samo da napomenem da se preporučuje da koristite nazive kolona .


Smještanje svih rezultata u niz


$rs=$conn->query($sql);
 
if($rs === false) {
  trigger_error('Neispravan SQL: ' . $sql . ' Greška: ' . $conn->error, E_USER_ERROR);
} else {
  $arr = $rs->fetch_all(MYSQLI_ASSOC);
}
foreach($arr as $row) {
  echo $row['co1'];
}

Koristeći parametar MYSQL_ASSOC rezultat dobijate kao asocijativan niz, a korištenjem MYSQL_NUM rezultat će biiti vraćen kao numerički niz. Takođe ako upotrebite MYSQL_BOTH rezultat će biti vraćen i kao numerički ali i kao asocijativni niz.

NAPOMENA: fetch_all je moguće koristiti samo sa "MySQL Native Driver".

Smještanje vrijednosti reda u niz

  Sledeći primjer će vratiti niz koji sadrži prvi red (koristeći $rs->data_seek(n); možemo vratiti bilo koji red ako uzmemo da je n broj reda )

$rs=$conn->query($sql);
 
if($rs === false) {
  trigger_error('Neispravan SQL: ' . $sql . ' Greška: ' . $conn->error, E_USER_ERROR);
} else {
  $rs->data_seek(0);
  $arr = $rs->fetch_array(MYSQLI_ASSOC);
}
 
 

 Broj redova

Broj redova rezultata možemo dobiti koristeći 
$rows_returned = $rs->num_rows;

Kretanje kroz set rezultata

$rs->data_seek(10);

Koristeći data_seek(); i navodeći broj reda kao parametar vraća nam se odgovarajući red.

INSERT

Koristite sledeću sintaksu :
real_escape_string se koristi da se izbjegnu (escape) specijalni znakovi  NUL (ASCII 0), \n, \r, \, ', ", i Control-Z u  vrijednostima string-ovima prije unosa u bazu  ( najčešće da se izbjegne tzv. SQL injection).
NAPOMENA: real_escape_string ne dodaje navodnike, to morate sami da uradite.

$v1="'" . $conn->real_escape_string('col1_value') . "'";
 
$sql="INSERT INTO tbl (col1_varchar, col2_number) VALUES ($v1,10)";
 
if($conn->query($sql) === false) {
  trigger_error('Neispravan SQL: ' . $sql . ' Greška: ' . $conn->error, E_USER_ERROR);
} else {
  $last_inserted_id = $conn->insert_id;
  $affected_rows = $conn->affected_rows;
}

UPDATE

Da bi izmjenili neki zapis koristite sledeću sintaksu:

$v1="'" . $conn->real_escape_string('col1_value') . "'";
 
$sql="UPDATE tbl SET col1_varchar=$v1, col2_number=1 WHERE id>10";
 
if($conn->query($sql) === false) {
  trigger_error('Nesipravan SQL: ' . $sql . ' Greška: ' . $conn->error, E_USER_ERROR);
} else {
  $affected_rows = $conn->affected_rows;
}

DELETE

Brisanje se izvršava koristeći :

$sql="DELETE FROM tbl WHERE id>10";
 
if($conn->query($sql) === false) {
  trigger_error('Neispravan SQL: ' . $sql . ' Greška: ' . $conn->error, E_USER_ERROR);
} else {
  $affected_rows = $conn->affected_rows;
}

Ovo su samo osnovni primjeri za korištenje mysqli ekstenzije. Postoje tu još i transakcije, pripremljene procedure i slično.
Tako da ukoliko se niste upoznali sa njenim metodama , mislim da je krajnje vrijeme da to učinite.

Нема коментара:

Постави коментар