traži:  
 php.com.hr >

(...nastavak)
 


Objašnjenje :

Evo nas na malo kompleksnijem primjeru. SELECT upiti su najopširniji. Razlog tome je prilično očit, jer uz obavljanje upita moramo te podatke i pribaviti tj. u ovom slučaju ispistai u obliku tablice. No idemo reddom.

function pretvoriDatum($mysqlDatum)

{

$tmp=explode("-", $mysqlDatum);

$datum=$tmp[2] . "." . $tmp[1] . "." . $tmp[0];

return $datum;

}

Prva stavr koja se nalazi u dokumentu je funckija za obradu datuma. Kao što je vć bilo govora u vodiću, MySql pohranjuej datume u obliku GGGG-MM-DD dok nama treba DD.MM.GGGG. radi bolje čitljivosti i razumljivosti. Ova funckija pretvara MySql datum u datum kojeg smo navikli gledati. Radi se o prilično jednostavnoj operaciji.

$tmp=explode("-", $mysqlDatum);

Prvo u neku privremenu varijablu pomoću explode funkcije razbijemo datum u njegove sastavne dijelove. Za detalje explode funckije pogledajte PHP manual, no ukoliko ste lijeni to sada raditi objasnit ću ukratko što ona radi. Ona kao ulazne podatke dobija dva stringa. Prvi je znak ili string koji služi kao uvijet razdijele drugpog ulaznog argumenta. Drugim rijećima, string koji se proslijeduje kao drugi argument funkcije biva „razbijen“ na više dijelova na taj način da prvi element rezultatnog niza sadrži znakove od početka tog stringa do prvog pojavljivanja znaka ili stringa iz prvog argumenta, drugi element sadrži znakove između prvog i drugog pojavljivanja znaka ili stringa iz prvog argumenta, dok zadnji element rezultata sadrži znakove od zadnjeg pojavljivanja sznaka ili stringa iz prvog argumenta funkcije pa do kraja stringa koji želimo razbiti. No mislim da ovo objašnjenje uopće nije bilo potrebno jer je svejasno iz slijedeće linije koda koja koristi taj razbijeni datum tj. niz stvoren iz njega za stvaranje novog stringa.

return $datum;

Ukoliko niste upoznati sa detaljima ponašanja i izrade funckija u PHP-u, return vraća danu mu vrijednsot u glavni program tako da se ta vrijednost može kasnije koristiti u skripti. Ovo će biti puno jasnije kada vidite kako smo iskoristili funkciju u našem primjeru.

Prvi kod same skripte je spajanje na MySql server te odabir baze, za što opet koristimo dbspoj.php koji smo napravili u prvom primjeru.

include "dbspoj.php";

I evo nas na zabavnom dijelu primjera. Prva stvar koju moramo napraviti je stvoriti upit.

$sql="SELECT idnovost, naslov, datum FROM novosti ORDER BY datum DESC";

Pošto su detalji ovog upita već objašnjenji prije ovog primjera na njemu se neću zadržavati. Reći ću samo da nije obavezno upite upisivati u varijablu te onda tu varijablu proslijeđivati mysql_query() funckiji. Mogli se sam upit napisati ravno u mysql_query() funckiju. Npr. ovako:

mysql_query("SELECT idnovost, naslov, datum FROM novosti ORDER BY datum DESC")

No, moje osobno mišljenje je da pohranom upita dobijamo čišći kod, te kasnije uvijek možemo opet koristiti taj upit recimo pri ispisu nekog error reporta gdje prvo ispišemo upit u kojem je nastala greška te nakon toga ispišemo grešku pomoću mysql_error() funkcije te na taj način dobijemo jasniju sliku što je uzrokovalo grešku u upitu. Ovo dobija na težini kada dođemo do primjera koji će dinamički generirati sam SQL gdje mogu nastatai sintaktičke greške zbog nepravilno upisanih podataka na osonovi kojih se generira sam upit, recimo upisivanje navodnika u polje za pretraživanje sitea.

if (!$q=mysql_query($sql))

{

echo "Nastala je greška pri izvođenju upita<br>" . mysql_query();

die();

}

Kao što vidite, ovog puta je kod koji izvršava SQL upit na serveru nešto drugačiji nego kod drgog primjera. Ovog puta smo pohranili rezultat mysql_query funkcije u varijablu. Ovo je obavezno jedino kod izvršavanja SELECT upita dok kod izvršavanja ostalih tu pohranu možemo komotno izostaviti da se operaciaj uspješno obavi. Naime, da bi nakon izvršenja upita mogli pribaviti podatke koje taj upit vraća moramo sačuvati „pokazivač“ na njegove rezultate tj. detalje. Ovdje se ne bih previše zadržavao na tehničkim detaljima koji to sve uvjetuju, dovoljno je zapamtiti da je potrebno zapamtiti taj pokazivač (u PHP manualu se zove result identifier) ukoliko želimo prihvatiti bilo kakav povratni podataka sa MySql servera nakon izvršenja upita. Iako se kod neSELECT upita može izostaviti da bi se upit izvršio ipak je u nekim situacijama potrebno zapamtiti result identifier. Recimo, nakon UPDATE upita se može provjeriti koliko je redaka u tablici izmjenjeno, i da bi prihvatili taj podatak moramo sačuvati result identifier.

U slučaju SELECT upita link identifier koristimo za provjere vezane uz upit te za pribavljanje skupa rezultata koji je upit pribavio.

Sigurno se pitate koje provjere možemo i trebamo obaviti u vezi samog SELECT upita a da se ne radi o pribavljanju rezultata upita. Radi se o slijedećoj problematici. Mysql_query funckija vraća false samo u slučaju da je nastala neka greška pri obavljanju samog upita. Znaći neka sintaktička pogreška ili nešto tehničke prirode što je obično izvan sfere PHP-a. No mysql_query neće vratiti false ukoliko upit nije vratio niti jedan rezultat u slučaju da uvijeti upita nisu zadovoljeni ili je tablica iz koje pribavljamo podatke prazna. U cilju izrade skripte koja neće ispisivati neke PHP / MySQL errore u toj situaciji moramo prije ispisa samog rezultata upita provjeriti da li ima rezultata za prikaz te ukoliko nema poduzeti odgovarajuće korake da se korisnik obavijesti o tome te mu po potrebi ponuditi opcije što može učiniti u toj situaciji.

Tu provjeru obavljamo sa :

if (mysql_num_rows($q)==0)

{

echo "Nema novosti";

} else {

...

}

Magična funckija koja obavlja samu provjeru je mysql_num_rows() koja kao argument prima result identifier te vraća integer broj koji je jednak ili veći od nule. Normalno, result identifier mora biti valjan, tj. ova funckija će javiti error ukoliko je pri obavljanju upita nastala greška tj. mysql_query() je vratio false vrijednost umjesto result identifiera. Znaći moramo paziti da se ova funckija ne poziva ukoliko skripta nije prošla obavljanje upita. To smo u našoj skripti osigurali die() funckijom ukoliko je nastala greška pri izvršavanju upita.

Logika našeg primjera je poprilično jednostavna. Ukoliko upit nije pribavio niti jedan rezultat korisniku se javlja poruka o tome, a ukoliko je skripta nastavlja sa ispisom rezultata u obliku tablice (zamijenjeno sa ... u gornjem isječku).

I evo nas na glavnom dijelu naše skripte za kojeg smo se pripremali u svim njenim dosadašnjim koracima, a to je ispis samih rezultata upita. Rezultate ispisujemo u tablici radi bolje preglednosti i razumljivosti, što je vrlo bitno kod izrade dinamičkih siteova sa bazama podataka jer sav naš trud i znanje PHP-a i relacijskih baza podataka pada u vodu ukoliko korisniku nije jasno što gleda i kako se to koristi čim to prvi put vidi. No ovo ispada iz sfere ovog vodiča, no ipak je građa za malo samostalnog konstruktivnog razmišljanja.

Idemo malo analzirati ispis podataka.

?>

<table width="760" border="0" cellpadding="1" cellspacing="1">

<tr>

<td><b>Naslov</b></td>

<td><b>Datum</b></td>

<td><b>Opcije</b></td>

</tr>

<?

Kao što vidite, prije samg ispisa smo izašli iz PHP moda u HTML te ispisali prvi redak tablice sa nazivima stupaca. Prvi stupac smo rezervirali za nalsov novosti, drugi za datum njenog upisa a treći za opcije. Opcije su ništa drugo nego linkovi koji pokreću nove operacije nad vijesti koja se nalazi u istom retku tablice kao i opcije. O ovome par redaka kasnije.

Nakon što smo ispisali „headere“ tablice vraćamo se u PHP mode i krećemo sa ispisom podataka.

<?

while ($redak=mysql_fetch_array($q))

{

?>

<tr>

<td><?=$redak["naslov"]?></td>

<td><?=pretvoriDatum($redak["datum"])?></td>

<td>

<a href="uredivanjenovosti.php? idnovost=<?=$redak["idnovost"]?>">Uredi</a>

<a href="?action=obrisi&idnovost=<?=$redak["idnovost"]?> ">Obriši</a>

</td>

</tr>

<?

}

?>

</table>

<?

...

Prije nego krenem sa pojašnjem samog koda potrebno je shvatiti kako se rezultati preuzimaju sa MySQL servera. Rezultate se može prihvatiti samo jedan po jedan i to samo unaprijed. Znaći nije moguće krenuti od zadnjeg rezultata iz skupa već od prvog prema zadnjem. Ukoliko ih se želi prihvatiti obrnutim redoslijedom to se može učiniti izmjenom samog SQL upita ili pohranom svih rezultata u niz pa naknadnim sortiranjem tog niza.

Svaki pojedini redak možemo prihvatiti sa jednom od više mogućih funckija. U našem primjeru se koristi mysql_fethc_array(), a na raspolaganju su nam još mysql_fetch_row(), mysql_fetch_assoc(), mysql_fetch_object(). Sve funckije se pribavljaju cijeli redak rezultata, samo se razlikuju u obliku u kojem ga vraćaju.

Mysql_fetch_array() vraća redak ako niz koji se sastojih od svih polja rezultata s tim da je svako polje indeksirano brojem i svojim imenom. Da ovo ilustriram na našem primjeru. Mi pribavljamo polja : idnovost, naslov, datum. To će reći da će naš niz koji vrati mysql_fetch_array() imati šest elemenata. Za svako polje po dva. Na indeksu 0 i idnovost će se nalaziti vrijednsot koja je pohranjena u stupcu idnovost unutar retka koji smo upravo pribavili pozivanjem funckije nad našim skupom skupom rezultata, na indeksi 1 i naslov će se očito nalaziti vrijednost koaj se nalazi u polju naslov unutar tog retka rezultata te na indeksu 2 i datum će se nalaziti vrijenost stupca datum. Ovdje je vrlo bitno napomenuti da numeričke vrijednosti ovise o poziciji polja u listi polaj za pribavaljanje u samom SQL upitu, tako da ukoliko izmjenimo tu listi izmejnit će se i raspored polja u nizu koji vrati mysql_fetch_array() funckija. No tekstualno indeksiranim poljima nije bitan raspored već samo imena koja smo naveli u toj listi polaj za pribavljanje što ovu metodu čini puno fleksibilnijom za korištenje te ćete taj način naći u svim primjerima u ovom vodiču, ali i u većini skripti koje možete naći na internetu.

Mysql_fetch_row() također vraća niz, sa tom razlikom da u njemu postoje samo numerički indeksi.

Mysql_fetch_assoc() isto vraća niz, no u njemu se nalaze samo tekstualno indeksirana polja.

Znaći, od sve tri navedene funckije najkompletnija je prva, mysql_fetch_array() te je moj prijedlog da ju koristite. U nekim vodićima ćete naići na teze da je najbolje koristiti mysql_fetch_row funckiju jer je najbrža, no čak i da je to istina razlika u brzini bi se mjerila i milisekundama, a imali bi teže shvatljiv kod koji bi kasnije teže i održavati. Brzina skripti koje koriste bazu podataka ponajviše ovise o količini upita koje skripta obavlja te o kompleksnosti samih upita. Što je upit kompleksniji to su sporiji. Tu recimo spadaju upiti koji pribavljaju podatke iz dvije ili više tablica sa kojima ćemo se kasnije upoznati, te upiti sa kompleksnim uvijetima pribavljanja i pravilima sortiranja. Stoga se nemojte zabrinjavati ukoliko se naviknete koristiti mysql_fetch_array funckiju i onda pročitate da je ona sporija.

Četvrta navedena funckija, mysql_fethc_object() umjesto niza vraća objekt stvoren od polja retka, no pošto objekti nisu spominajni nigdje dalej u ovom vodiću neću se zadržavati na ovoj funckiji. Ukoliko se želite bolje upoznati sa njom, ali i sa drugim MySql funckijama otvorite si MySql Functions dio PHP manuala.

Sve gore navedene funckiej imaju zajedničko to da će vratiti false na kraju našeg skupa rezultata. Ovo čini while petlju idealnim alataom za pribavljanje svih rezultata jer će se obaviti onoliko puta koliko ima rezultata u skupu. Još jedna zajednička stvar svim tim funckijama je da kao svoj argument dobijaju result identifier koji vraća mysql_query() funckija.

while ($redak=mysql_fetch_array($q))

U bloku naredbi while petlje ispisujemo jedan redak tablice te u pojedini stupac tog retka ispisujemo pribavljenje vrijednosti poput <?=$redak["naslov"]?> s čime ispisujemo naslov novosti.

Ovdje bi se želio zadržati na trenutak na dijelu opcija vezanih uz svaku novost.

<a href="uredivanjenovosti.php? idnovost=<?=$redak["idnovost"]?>">Uredi</a>

<a href="?action=obrisi&idnovost=<?=$redak["idnovost"]?> ">Obriši</a>

Korisniku nudimo dvije moguće opcije. Brisanje i uređivanje pojednine novosti. Kao što vidite, u linku smo naveli kao href stranicu koju još nismo napravili, no uz malo planiranja možemo predvidjeti njeno ime i ponašanje. Pošto se još nismo upoznali sa detaljima upita za brisanje i izmjenu podataka za sada neću komplicirati. Ono što je bitno uočiti je da nam je za uspješno obavljanje tih operaciaj potreban idnovosti pomoću kojeg ćemo kasnije moći identificirati koju novost želimo obrisati ili obraditi. Također, vidite da ćemo brisanje novosti obaviti unutar iste ove skripte koju smo upravo napravili, samo što će ju biti potrebno otvoriti sa predodređenim query stringom koji će naznačiti da želimo obrisati novost.

I to bi bilo to, nakon ispisa svih redaka rezultata moramo samo poaziti da pozatvaramo sve HTML tagove i sve vitičaste zagrade da bi skripta bila bez grešaka i gotovi smo. Ništa lakše.

Sada ćemo nastaviti sa DELETE upitom za brisanje podataka, a SELECT upitu sa njegovim ostalim mogućnostima ćemo se vratiti na kraju ovog dijela osnova SQL-a pošto nam u ovom trenutku nisu neophodne.  



PHP i MySQL
 © 2004 - 2008 php.com.hr