Fun Zone = Distractie 100 %
Doriti să reactionati la acest mesaj? Creati un cont în câteva clickuri sau conectati-vă pentru a continua.

Acces usor la MySQL prin clase

In jos

Acces usor la MySQL prin clase Empty Acces usor la MySQL prin clase

Mesaj  cristiano_ronaldo Vin Mai 30, 2008 4:08 pm

In incercarea noastra de a scrie cat mai putin cod pentru aceleasi lucruri, ne aplecam destul de des asupra problemei query-urilor catre baza de date. Avem cateva tipuri de query-uri pe care le repetam de fiecare data cand vrem ceva din baza de date. Poate ca unii dintre voi au deja cateva functii standard prin care isi fac treaba cu SQL-ul. Si mai multi insa prefera framework-uri consacrate, cum ar fi PEAR:Very HappyB in combinatia uluitoare si flexibila cu DB::FormBuilder. Daca insa sunteti printre cei care nu vor o solutie atat de complicata, dar totusi, zic eu, fiabila, stati cu mine.

PEAR:Very HappyB si FB au dezavantajele lor, printre care viteza redusa, numarul mare de variabile si parsari ale FB. Despre probleme ca acestea, si in special cea a parsarii template-urilor, vom discuta cu alta ocazie. Ceea ce intereseaza acum este o clasa care ne va oferi acces usor la baza noastra de date. Vom denumi clasa noastra DBFrame. Ea este un exemplu real de lucru si este deja folosita in dezvoltarea LifeCMS.

Am furat o idee de la PEAR:Very HappyB. Fiecare baza de date va fi instantiata intr-un obiect al clasei noastre (nu fiecare tabel, ca in PEAR). Astfel, vom putea lucra cu baze multiple, daca este nevoie.

Prima functie de care ne vom ocupa este constructorul clasei, cel care va realiza conexiunea cu baza de date. Cu siguranta, codul va este cunoscut:


class DBFrame
Cod:
{

function __construct($host,$user,$pass,$database)
$con = mysql_connect($host,$user,$pass)
or die("Conectare nereusita:".mysql_error());

$db = mysql_select_db("$database", $con)
or die("Nu pot selecta baza de date ".$database.":".mysql_error());
}



Vom instantia bazele de date folosind urmatoarea linie. Trebuie sa aveti grija insa ca liniile de instantiere sa fie scrise intr-un fisier sigur, pentru ca vor contine datele de conectare la baza.


Cod:
$baza_de_date1 = new DBFrame("localhost","user","parola","tabel1");



Dupa ce ne-am conectat, urmeaza sa scriem o functie care sa execute variatele query-uri de care vom avea nevoie.


Cod:
function execute_query($q){
$handle=mysql_query($q);
return $handle;
}


Aceasta functie nu face decat sa execute query-ul primit si sa ii intoarca rezultatul brut. Pentru a putea folosi insa datele intoarse va trebui sa le formatam intr-un fel. De aceea, mai avem nevoie de inca o functie.


Cod:
function query($q){
$result=$this->execute_query($q);
$ret=Array();
while($ret[]=mysql_fetch_assoc($result));
array_pop($ret);
return $ret;
}



Functia query() foloseste execute_query(), prima functie pe care am creat-o, pentru a obtine un handle pentru query-ul primit, si apoi formateaza datele in array-ul $ret, pe care il intoarce. Linia array_pop($ret); este necesara, deoarece functia mysql_fetch_assoc() intoarce intotdeauna un camp gol in plus, la sfarsitul array-ului.

Ce putem realiza pana acum? Putem instantia foarte usor mai multe baze de date si putem executa query-uri pe ele printr-o singura linie:


Cod:
$baza_de_date=new DBFrame("localhost","user","parola","tabel");
$tabel=$baza_de_date->query("SELECT * FROM tabel");



Putem simplifica query-urile si mai mult. Putem scrie o functie care sa execute query-uri de tip SELECT, alta care sa faca numai DELETE, EMPTY sau DROP, alta pentru INSERT etc. Dintre toate, cea din urma pare cea mai cu probleme. Sa vedem cum facem usor un insert cu mica noastra DBFrame.

in primul rand, este de observat ca, in afara de SELECT, nici un tip de query nu intoarce nimic. in scrierea functiei pentru SELECT vom utiliza functia query(), pentru ca ea intoarce datele formatat. Pentru INSERT si toate celelalte vom folosi execute_query(), pentru ca este mai rapida, in cazul in care nu avem nevoie de datele returnate. Si, in plus, nu va mai da eroare. Sunteti liberi sa incercati Wink

Sa ne gandim la inserarea in baza de date. De obicei, este nevoie de asa ceva atunci cand exista un form de inserare a datelor in baza. Aproape toate insert-urile de pe web au un front-end, care este aproape intotdeauna un form. Atunci vom construi functia noastra de insert direct adapdata la un form.

M-am gandit ca nu as vrea sa scriu o functie separata pentru UPDATE, asa ca o sa punem cateva conditii in plus si ne vom face functia sa updateze automat. De fapt, aproape automat: vom include in formular un camp ascuns in care vom stoca primary key. Daca acesta este gol, inseamna ca se va face insert. Daca nu, atunci inseamna ca userul a folosit butonul de edit si atunci facem update. Si deci functia:


Cod:
function insert($table_name,$values,$primary='id'){
if(!empty($values[$primary]) && isset($values[$primary])) $q="UPDATE ".$table_name." SET ";
else $q="INSERT INTO ".$table_name." SET ";
foreach($values as $key=>$value)
if($key!=$primary) $q.=$key.'="'.$value.'",';
$q=substr($q,0,-1); // scoate virgula in plus de la ultima iterare a lui foreach
if(!empty($values[$primary]) && isset($values[$primary])) $q.=' WHERE '.$primary.'="'.$value.'"';
$this->execute_query($q);
}



Dupa cum am spus, intai stabilim daca este vorba de un INSERT sau un UPDATE si apoi cream query-ul, conform valorilor din arrayul $values. Ceilalti parametrii sunt $table_name pentru numele tabelului pe care se va executa query-ul si $primary pentru primary key, in caz ca aceasta nu are ca nume obisnuitul "id". La sfarsitul query-ului adaugam o clauza WHERE in cazul in care exista "id" si apoi executam query-ul folosind execute_query(), deoarece nu avem nevoie de rezultat.

Acum ramane de vazut cum vom construi formularul. Fiecare camp va trebui sa poarte numele asociat din baza de date. De ce? Pentru a nu ne complica. Daca facem asta, tot ce trebuie sa-i servim functiei noastre insert() va fi $_POST. Desigur, $_POST va contine si butonul de submit, dar problema se poate rezolva simplu:


Cod:
if(isset($_POST['submit'])){
array_pop($_POST);
insert('tabel',$_POST);
}


Daca este vorba de un edit, scriptul ar trebui sa stie. Pentru asta, nu trebuie decat sa introducem campul cu numele primary key-ului din tabel si sa-i atribuim o valoare, de obicei din $_GET:

Desi clasa poate capata imbunatatiri serioase, cred ca ramane o solutie viabila, in special pentru un proiect mic sau pentru incepatori. Mica si viabila, nu? in plus, nu avem pretentii sa fie foarte rapida, insa nu am complicat-o intr-atat incat sa fie probleme.
cristiano_ronaldo
cristiano_ronaldo
Level 2
Level 2

masculin
Numarul mesajelor : 80
Warn :
Acces usor la MySQL prin clase Left_bar_bleue0 / 1000 / 100Acces usor la MySQL prin clase Right_bar_bleue

Puncte : 0
Reputatie : 0
Data de inscriere : 22/05/2008

Sus In jos

Sus

- Subiecte similare

 
Permisiunile acestui forum:
Nu puteti raspunde la subiectele acestui forum