Čitanje MySQL podataka iz PHP-a
Kada zadajemo upit koji vraća podatke iz baze, moramo imati "sistem" da te podatke dohvatimo. U tom slučaju rezultat funkcije mysql_query() će biti resurs koji sadrži rezultat upita ako je upit uspeo, a vrednost FALSE ako je došlo do greške.
Funkcije sa kojima ćemo se ovde upoznati su:
Funkcija | Značenje |
---|---|
mysql_fetch_assoc(rezultat) | Povlači red rezultata u formi asocijativnog niza |
mysql_fetch_row(rezultat) | Povlači red rezultata u formi numerisanog niza |
mysql_num_rows(rezultat) | Broj redova u rezultatu |
mysql_fetch_assoc()
mysql_fetch_row()
Najkorišćenija funkcija za "povlačenje" podataka je svakako mysql_fetch_assoc(). Ova funkcija se poziva uzastopno i pri svakom pozivu kao rezultat vraća jedan red rezultata u obliku asocijativnog niza. Kada se pročitaju svi redovi, sledeći rezultat će biti FALSE.
Kao parametar funkcije zadaje se resurs sa rezultatima dobijen pri upućivanju upita.
$rezultat = mysql_query(zahtev);
...
mysql_fetch_assoc($rezultat)
Svaki red rezultata se dobija kao asocijativni niz. Ključevi ovog niza su nazivi polja dobijenog rezultata. Ako u rezultujućoj tabeli postoje različita polja sa istim nazivima, u asocijativni niz ulazi poslednja vrednost. Ako imamo ovaj problem, uvek u samom SQL zahtevu možemo "preimenovati" polja korišćenjem "polje AS naziv" konstrukcije u SQL-u.
Drugi način zaobilaženja ovog problema je korišćenje funkcije mysql_fetch_row(). Ova funkcija se koristi na potpuno isti način kao i mysql_fetch_assoc(), s tim što kao rezultat vraća numerisani niz - sa brojčanim indeksima od 0 pa nadalje.
$rezultat = mysql_query(zahtev);
...
mysql_fetch_row($rezultat)
mysql_num_rows()
Ovu funkciju koristimo ako nam zatreba da unapred saznamo koliko ima redova koji se dobiju u rezultatu. Kao parametar funkcije zadaje se resurs sa rezultatima dobijen iz mysql_query() funkcije.
$rezultat = mysql_query(zahtev);
...
mysql_num_rows($rezultat)
Primer
Hajde da vidimo prvo jedan opšti slučaj kako bismo prvo pročitali podatke iz neke tabele.
$zahtev = "SELECT polje1, polje2
FROM tabela
WHERE (polje3='vrednost')";
$rez = mysql_query($zahtev);
echo "Dobijeno redova: " . mysql_num_rows($rez);
while ($niz = mysql_fetch_assoc($rez)) {
// koristimo vrednosti
// $niz["polje1"]
// $niz["polje2"]
}
Dakle, šta smo uradili? Prvo smo kreirali upit u promenljivoj $zahtev. Onda smo uputili taj upit bazi podataka preko funkcije mysql_query() i pokupili rezultat u promenljivoj $rez. Ispisujemo koliko je upit vratio redova zahvaljujući funkciji mysql_num_rows().
Sada postaje zanimljivo. Redovi rezultata se nalaze u promenljivoj $rez i odatle ih "crpimo" jedan po jedan. Dok ih ima, ubacivaće se u promenljivu $niz i ciklus while će se "vrteti".
Kada "potrošimo" sve redove promenljiva $niz dobija vrednost FALSE od funkcije mysql_fetch_assoc(), što takođe postaje i vrednost celokupnog izraza provere u ciklusu, na osnovu čega while petlja završava rad.
Inače unutar svakog prolaska kroz petlju, $niz sadrži jedan red podataka. Pošto se iz tabele zahtevaju polja pod nazivima "polje1" i "polje2", to će takođe biti i ključevi niza. To znači da će vrednosti biti $niz["polje1"] i $niz["polje2"].
Ako smo sigurni da će upit vratiti samo jedan red podataka, umesto while ciklusa možemo korisiti naredbu if.
Kreiranje HTML-a iz baze podataka
Tabela sa podacima
U ovom primeru demonstriramo kako u PHP-u konstruišemo HTML tabelu na osnovu pročitanih podataka iz MySQL baze.
<table>
<tr>
<th>Naslov</th>
<th>Broj strana</th>
<th>Pisac</th>
<th>Zemlja</th>
</tr>
<?php
$zahtev = "SELECT naslov, stranice, ime, zemlja
FROM knjige
WHERE (pisac=id) AND (zanr='{$_GET["zanr"]}')
ORDER BY stranice DESC";
$rezultat = mysql_query($zahtev);
while ($red = mysql_fetch_assoc($rezultat)) {
echo "<tr>";
echo "<td>{$red["naslov"]}</td>";
echo "<td>{$red["stranice"]}</td>";
echo "<td>{$red["ime"]}</td>";
echo "<td>{$red["zemlja"]}</td>";
echo "</tr>";
}
?>
</table>
Kao što vidimo, u "običnom" HTML delu smo započeli tabelu i napravili red zaglavlja. Onda smo napravili PHP odeljak u kome smo zadali upit bazi podataka da izvučemo naslove knjiga, brojeve stranica, imena i zemlje porekla pisaca i to sve za knjige zadatog žanra (preko GET parametra).
Onda čitamo red po red rezultata i pomoću naredbe echo u svakom prolasku kroz ciklus ispisujemo red tabele i njegova polja. Ovako direktno preko PHP-a kreiramo HTML. Na kraju izlazimo iz PHP-a i u HTML-u zatvaramo tabelu.
Inače, umesto ciklusa je mogao da se koristi i sledeći odsečak PHP programa. Ovaj ciklus je "univerzalan" za ispis podataka bilo koje tabele, pošto koristi funkciju mysql_fetch_row() u kojoj su rezultati numerisani, pa ne moramo da znamo nazive polja. Koliko ima polja u redu, saznajemo zahvaljujući PHP funkciji count().
// ...
while ($red = mysql_fetch_row($rezultat)) {
echo "<tr>";
$N = count($rezultat);
for ($i=0; $i<$N; $i++) {
echo "<td>{$red[$i]}</td>";
}
echo "</tr>";
}
Elemenati forme
Evo još jednog primera koji bi nam mogao biti koristan. Ovde demonstriramo čitanje podataka o zadatoj knjizi, da bismo onda te podatke smestili kao početne vrednosti forme, gde se koriniku omogućava npr. izmena podataka.
<?php
$zahtev = "SELECT sifra, naslov, pisac FROM knjige WHERE sifra='{$_GET["sif"]}'";
$rez = mysql_query($zahtev);
if ($slog = mysql_fetch_assoc($rez)) {
$sifra = $slog["sifra"];
$naslov = $slog["naslov"];
$pisacID = $slog["pisac"];
}
$zahtev = "SELECT id, ime FROM pisci ORDER BY ime";
$rez = mysql_query($zahtev);
$opcije = "";
while ($slog = mysql_fetch_assoc($rez)) {
$sel = ($slog["id"] == $pisacID) ? "selected" : "";
$opcije .= "<option value=\"{$slog["id"]}\" {$sel}>{$slog["ime"]}</option>";
}
?>
...
<form method="GET" action="izmena.php">
Naslov <input type="text" name="nas" value="<?php echo $naslov; ?>" />
Pisac <select name="pisac">
<?php echo $opcije; ?>
</select>
<input type="hidden" name="sif" value="<?php echo $sifra; ?>" />
<input type="submit" value="Izmena" />
</form>
Najpre sve podatke "pripremimo" u PHP odeljku. Prvo zadamo upit za traženu knjigu čiju šifru dobijamo preko GET parametra. Pošto šifra označava samo jednu knjigu, nema potrebe da pravimo ciklus, već pamtimo pročitane podatke unutar if naredbe.
Onda pokrećemo upit koji iščitava sve pisce iz baze. Ovaj upit nam treba da bismo posle u HTML formi pisca mogli da biramo iz padajuće liste. Zbog toga na osnovu pročitanih podataka kreiramo niz <option> elemenata.
Kad smo već tu, rešavamo još jednu začkoljicu - padajuća lista treba da prikaže pisca koji je napisao knjigu. Znači da moramo da ubacimo HTML parametar selected u onaj <option> element koji sadrži pisca koji je napisao knjigu. Za ovo smo upotrebili ternarni operator gde proveravamo šifru pisac kog trenutno ubacujemo u listu i šifru pisca koji je napisao knjigu. Ako se poklapaju, u promenljivoj $sel dobijamo vrednost "selected" koju onda dodajemo.
Podatke smo pripremili, sada završavamo PHP i nastavljamo HTML deo stranice. Negde u tom delu se nalazi i forma u kojoj treba da se pojave podaci. Na mestima gde bismo inače upisali vrednost, otvaramo mali PHP odeljak koji sadrži samo naredbu echo koja na tom mestu upisuje potrebni podatak, a u slučaju <select> elementa - celu listu <option> elemenata.
- PHP.net, Original MySQL API