Izvajanje poizvedb s pomočjo PDO razreda

Pred nekaj dnevi, natančneje 20.6.2013, je bila uradno izdana nova verzija PHP in sicer 5.5.0, kjer so med drugim odstranili funkcijo mysql_query() in tako je sedaj potrebno uporabljati drug razred za izvajanje poizvedb in sicer PHP Data Objects (v nadaljevanju PDO). PDO med drugim tudi zagotavlja varnejše poizvedbe, varnejše v smislu zaščite pred morebitnimi injection napadi, in posledično uporablja tudi druge funkcije in prav te funkcije si bomo ogledali v nadaljevanju na praktičnih primerih.

Torej funkcije, ki nam jih ponuja PDO razred za izvajanje poizvedb na podatkovni bazi so naslednje:

  • prepare() – funkcijo uporabimo na objektu in sicer za pripravo povpraševalnega stavka
  • bindValue() – s funkcijo “bindamo” – kaj pravzaprav to pomeni in kako to storimo v nadaljevanju
  • execute() – izvede povpraševalni stavek določen s pomočjo funkcij prepare() in bindValue()
  • exec() – izvede povpraševalni stavek in vrne število, ki predstavlja število vrstic s katerimi se poizvedba ujema
  • query() – izvede povpraševalni stavek in vrne rezultat v obliki objekta
  • fetchAll() – vrne polje z vsemi rezultati
  • fetch() – vrne prvi rezultat, ki se ujema s pogoji v povpraševalnem stavku
  • rowCount() – vrne število vrstic oziroma zapisov v podatkovni bazi, ki se ujemajo s povpraševalnim stavkom.

Zgoraj navedene funkcije niso vse funkcije katere ponuja PDO razred, ampak so zgolj tiste osnovne za katere predvidevam da se jih največ uporablja in zato se bom sam posvetil zgolj tem.

Povezava na bazo

Ker je vedno pred poizvedovanjem potrebno tudi vzpostaviti povezavo s podatkovno bazo je v spodnjem primeru prikazan primer povezovanja.

Kot je razvidno iz zgornje kode smo povezovanje na podatkovno bazo ustvarili v try-catch bloku, kateri nam v primeru da pride do kakršnekoli napake vrne opozorilo – ‘Database error’, v nasprotnem primeru pa vzpostavi povezavo in določi charset na utf-8.

Uporaba funkcij prepare(), bindValue() in execute()

Kot smo že zgoraj omenili je prepare() funkcija namenjena za pripravo povpraševalnega stavka. Funkcija bindValue() nam omogoča, da bindamo vrednost za določen parameter, z execute() pa na koncu še izvedemo povpraševalni stavek. Npr. da želimo s povpraševalnim stavkom izpisati vse osebe, ki so stare 25 let to storimo tako:

Torej bindValue() funkcija nam omogoča, da namesto da bi v povpraševalnem stavku imeli WHERE starost = $starostOsebe, da raje uporabimo ? in nato prav s pomočjo bindValue() funkcije temu vprašaju, ki je parameter, določimo samo vrednost.Kot tretji parameter lahko dodamo funkciji bindValue() še tip parametra, ki ga podajamo, v našem primeru bi lahko uporabili PDO::PARAM_INT, saj je starost podana kot število.

Uporaba exec() funkcije

Funkcija exec() se od execute() razlikuje zgolj po tem, da na koncu vrne še število vrstic za katere je bilo poizvedovanje uspešno. Primer: želimo spremeniti cene vsem artiklom dodanim pred 1.7.2013.

Funkcija query()

Funkcijo uporabljamo večinoma takrat, ko želimo takoj po uspešni poizvedbi izpisati dobljene rezultate. Npr. želimo izpisati vse predmete na urniku.

Rezultat tega bi bil izpis:

Podatkovne baze Boris Poizvedba Predavalnica_1 10:0
Matematika Tatjana Enačba Predavalnica_2 08:00

Funkcije fetchAll(), fetch() in rowCount()

Funkciji fetchAll() in fetch() uporabljamo za vračanje rezultatov poizvedb s tem, da obstaja ena razlika in sicer fetchAll() vrne vse rezultate fetch() pa samo prvega. Funkcija rowCount() pa kot že samo ime pove vrača število vrstic, za katere je bilo poizvedovanje uspešno.