1.29.2014

Funkcije i klase u PHP-u

Php kao jezik može da se piše proceduralno (što se ne preporučuje) i objektno.
Klase se sastoje od funkcija koje nazivamo metode klase. U mnogo slučajeva sam viđao da početnici pišu ogromne funkcije koje rade sve i svašta, tako reći sve "strpaju" u jednu funkciju, što za posljedicu ima noćnu moru kada je riječ o održavanju. Tako da mala izmjena može da dovede do velikih problema.

Za početak volio bi predložiti nekoliko stvari kada je riječ o pisanju PHP-a.


Funkcije treba da rade samo ono za šta su namjenjene, ništa više i ništa manje. 

Na primjer ako fnkcija treba da pronadje osobu po imenu, onda samo to i radi, uzme ime kao parametar, izvrši pretragu i vrati podatke o toj osobi. Da vrati podatke, ne ispiše ih. Podatke vraćate korištenjem komande return. Podatke ispisuje logika za prikaz.

Ako neki dio koda pišete na više mjesta identično, bilo bi dobro da od toga napravite fuunkciju, tj. metod jer umjesto da pišete nekoliko linija koda pišete jednu. A samim tim je i čitljivije.

Komentarišite vaše funkcije.

 Komentari tome i služe, da sebi pojasnite šta vam koja funkcija radi. Zamislite da nakon nekog dužeg perioda imate potrebu da se vratite u taj kod i napravite ispravku. Samo je potrebno da obratite pažnju na vaše komentare i veoma lako se prisjetite šta koja funkcija radi.

Dajite smislena imena funkcijama i promjenjivim.

Ukoliko date smislena imena vašim funkcijama i promjenjivim, utoliko će vam lakše biti da pratite tok radnje.
Ako proomjenjive nayivate $a i $b, a nije u pitanju jednostavan matematički problem, postoji veoma velika mogućnost da sami sebe zbunite i počnete praviti greške. Pogotovo ako nakon nekog vremena gledate kod koji ste pisali ranije i treba da odgonetnete šta bi trebalo da sadrži promjenjiva $bla. Ili ako je $bla objekat koji ima atribut $sss. Pa izgleda ovako $bla->sss . Lakše bi bilo da piše na primjer. $article->title.

Pišite nazive funkcija i promjenjivih na engleskom

Ovo vam dajem kao savjet, jer ukoliko počnete da radite u firmi a vaš dio aplikacije je da kažemo "šaren". Šaren zato što je php sastavljen od engleskog jezika, a vaši nazivi recimo na Srpskom. Takav kod je lako razumljiv samo vama, a ne i vašem kolegi koji je u vašem timu, ili kolegi koji je stranac. 

Ovo su samo neki primjeri kako bi to trebalo, naravno svako ima svoj stil i način pisanja. Kao i pisci romana i pisci programa se razlikuju po stilovima. Sve je u redu dok se međusobno razumiju i mogu nesmetano da rade.

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.