Ko so podatki že shranjeni v tabeli, jih lahko preberemo z ukazom SELECT. Ta ukaz ne spreminja podatkov, ampak iz podatkovne baze pridobi zapise, ki jih nato v PHP obdelamo in prikažemo na spletni strani.
V aplikaciji Knjige je izpis podatkov pomemben korak, saj uporabniku omogoči pregled shranjenih knjig. Poizvedba prebere izbrane stolpce iz tabele knjige, rezultate uredi in jih prikaže v HTML preglednici.
Pomni: Ukaz SELECT podatke samo bere. Za prikaz na spletni strani pa moramo rezultat poizvedbe v PHP še prebrati in ga pretvoriti v ustrezen HTML izpis.
Pri izpisu podatkov v HTML je priporočljivo uporabiti funkcijo htmlspecialchars(). Tako se posebni znaki pravilno prikažejo, hkrati pa zmanjšamo tveganje za neželeno izvajanje HTML ali JavaScript kode.
Vsebina strani
Osnovna pravila
Pri izpisu podatkov iz podatkovne baze moramo ločiti tri korake: pripravo poizvedbe, branje rezultatov in varen izpis podatkov na spletni strani.
- Za branje podatkov uporabimo ukaz
SELECT. - V delu
FROMdoločimo tabelo, iz katere beremo podatke. - Namesto
*je pogosto bolje navesti samo stolpce, ki jih potrebujemo. - Z
ORDER BYlahko rezultate uredimo. - V PHP moramo rezultat poizvedbe prebrati vrstico za vrstico ali kot celotno zbirko vrstic.
- Pri izpisu podatkov v HTML uporabimo
htmlspecialchars(). - Če tabela nima zapisov, prikažemo jasno obvestilo.
Pozor: Podatkov iz podatkovne baze ne izpisujemo neposredno v HTML brez obdelave. Vrednosti je treba pred izpisom ustrezno zaščititi, na primer s funkcijo htmlspecialchars().
Izpis podatkov iz tabele
Za izpis podatkov iz tabele najpogosteje uporabimo poizvedbo SELECT. Z njo lahko izpišemo vse stolpce ali samo izbrane stolpce, rezultate pa po potrebi tudi uredimo.
Osnovna sintaksa za izpis vseh stolpcev iz tabele je:
SELECT * FROM imeTabele;
Če želimo izpisati samo izbrane stolpce, uporabimo:
SELECT stolpec1, stolpec2, stolpec3
FROM imeTabele;
Rezultate lahko uredimo z ukazom ORDER BY:
SELECT stolpec1, stolpec2
FROM imeTabele
ORDER BY idStolpec;
V aplikaciji Knjige na primer preberemo podatke iz tabele knjige in jih uredimo po stolpcu ID_knjige.
Pomni: Poizvedba SELECT pripravi rezultat, vendar ga PHP še ne prikaže samodejno. Rezultat moramo prebrati in nato oblikovati HTML izpis.
Osnovni primer z mysqli
Spodnji zgled iz tabele knjige prebere vse zapise in jih izpiše v HTML tabeli.
<?php
define('DB_SERVER', 'localhost');
define('DB_USER', 'uporabnik');
define('DB_PASS', 'skritoGeslo');
define('DB_NAME', 'knjiznica');
// Povezava do podatkovne zbirke
$connection = mysqli_connect(DB_SERVER, DB_USER, DB_PASS, DB_NAME);
// Preverjanje povezave
if (!$connection) {
die(
'Povezava s podatkovno zbirko ni vzpostavljena: ' .
mysqli_connect_error() .
' (' . mysqli_connect_errno() . ')'
);
}
// SQL poizvedba za izpis podatkov
$sql = "SELECT ID_knjige, Priimek_avtorja, Ime_avtorja, Naslov, Strani, Cena, Leto
FROM knjige
ORDER BY ID_knjige";
$result = mysqli_query($connection, $sql);
if ($result && mysqli_num_rows($result) > 0) {
echo '<table>';
echo '<tr><th>ID</th><th>Priimek</th><th>Ime</th><th>Naslov</th></tr>';
while ($row = mysqli_fetch_assoc($result)) {
echo '<tr>';
echo '<td>' . htmlspecialchars($row['ID_knjige']) . '</td>';
echo '<td>' . htmlspecialchars($row['Priimek_avtorja']) . '</td>';
echo '<td>' . htmlspecialchars($row['Ime_avtorja']) . '</td>';
echo '<td>' . htmlspecialchars($row['Naslov']) . '</td>';
echo '</tr>';
}
echo '</table>';
} else {
echo 'Ni zapisov za prikaz.';
}
mysqli_close($connection);
?>
Pri pristopu z mysqli poizvedbo izvedemo s funkcijo mysqli_query(), število vrstic lahko preverimo s funkcijo mysqli_num_rows(), posamezne vrstice pa beremo s funkcijo mysqli_fetch_assoc().
Osnovni primer s PDO
Tudi z vmesnikom PDO lahko preberemo rezultate poizvedbe in jih nato prikažemo v HTML tabeli.
<?php
$streznik = 'localhost';
$baza = 'knjiznica';
$uporabnik = 'uporabnik';
$geslo = 'skritoGeslo';
try {
// Povezava do podatkovne zbirke
$pdo = new PDO("mysql:host=$streznik;dbname=$baza;charset=utf8mb4", $uporabnik, $geslo);
// Vklop izjem pri napakah
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// SQL poizvedba
$sql = "SELECT ID_knjige, Priimek_avtorja, Ime_avtorja, Naslov, Strani, Cena, Leto
FROM knjige
ORDER BY ID_knjige";
$stmt = $pdo->query($sql);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (!empty($rows)) {
echo '<table>';
echo '<tr><th>ID</th><th>Priimek</th><th>Ime</th><th>Naslov</th></tr>';
foreach ($rows as $row) {
echo '<tr>';
echo '<td>' . htmlspecialchars($row['ID_knjige']) . '</td>';
echo '<td>' . htmlspecialchars($row['Priimek_avtorja']) . '</td>';
echo '<td>' . htmlspecialchars($row['Ime_avtorja']) . '</td>';
echo '<td>' . htmlspecialchars($row['Naslov']) . '</td>';
echo '</tr>';
}
echo '</table>';
} else {
echo 'Ni zapisov za prikaz.';
}
}
catch (PDOException $e) {
echo 'Napaka pri izpisu podatkov: ' . $e->getMessage();
}
?>
Pri pristopu s PDO poizvedbo izvedemo z metodo query(), rezultate pa lahko preberemo z metodo fetchAll(). Način PDO::FETCH_ASSOC pomeni, da se vrstice vrnejo kot asociativna polja.
Varen izpis v HTML tabeli
Podatke iz podatkovne baze pogosto prikažemo v HTML tabeli. Pri tem je treba ločiti HTML oznake od vrednosti, ki prihajajo iz podatkovne baze.
echo '<td>' . htmlspecialchars($row['Naslov']) . '</td>';
Funkcija htmlspecialchars() posebne znake pretvori v obliko, ki je varna za izpis v HTML. Tako se na primer znak < ne obravnava kot začetek HTML oznake.
Pozor: Tudi če podatke vnaša skrbnik aplikacije, je pri izpisu v HTML priporočljivo uporabiti zaščito izpisa. To je dobra navada pri vseh spletnih aplikacijah.
Primerjava pristopov mysqli in PDO
Oba pristopa omogočata branje podatkov iz tabele, razlikujeta pa se v funkcijah, načinu obravnave rezultatov in slogu kode.
| Korak | mysqli |
PDO |
|---|---|---|
| Izvedba poizvedbe | mysqli_query() |
$pdo->query() |
| Preverjanje števila vrstic | mysqli_num_rows() |
empty($rows) ali štetje polja |
| Branje ene vrstice | mysqli_fetch_assoc() |
$stmt->fetch() |
| Branje vseh vrstic | zanka while |
$stmt->fetchAll() |
| Zaščita HTML izpisa | htmlspecialchars() |
htmlspecialchars() |
Pri manjših rezultatih je fetchAll() pregleden, pri zelo velikih rezultatih pa je lahko primerneje brati vrstice postopoma, da ne porabimo preveč pomnilnika.
Aplikacija Knjige
📘Aplikacija Knjige
V priloženi aplikaciji Knjige je v datoteki 05_izpisTB.php prikazan izpis vseh zapisov tabele knjige. Poizvedba prebere stolpce ID_knjige, Priimek_avtorja, Ime_avtorja, Naslov, Strani, Cena in Leto, rezultate pa uredi po stolpcu ID_knjige.
Stran nato vse vrstice prebere z metodo fetchAll(), prešteje zapise ter jih izpiše v preglednici. Če zapisov ni, se prikaže posebno obvestilo.
05_izpisTB.phpNavodila za izdelavo aplikacije Knjige
- Najprej vzpostavimo povezavo do podatkovne zbirke.
- Pripravimo poizvedbo SELECT za izpis izbranih stolpcev.
- Rezultate uredimo, na primer z ukazom ORDER BY ID_knjige.
- Poizvedbo izvedemo in rezultate preberemo v PHP.
- Preverimo, ali je rezultat prazen.
- Zapise izpišemo v HTML tabeli.
- Pri izpisu vrednosti uporabimo
htmlspecialchars(). - Če zapisov ni, uporabniku prikažemo obvestilo o prazni tabeli.
Pomni: Dobra stran za izpis podatkov ne prikaže samo podatkov, ampak zna pravilno obravnavati tudi primer, ko tabela nima nobenega zapisa.
Priporočila
- V poizvedbi navedi samo stolpce, ki jih želiš prikazati.
- Za urejen izpis uporabi
ORDER BY. - Pri izpisu v HTML uporabi
htmlspecialchars(). - Če ni zapisov, prikaži jasno obvestilo.
- Za preglednost izpisa uporabi HTML tabelo z glavo in vrsticami.
- Pri velikih količinah podatkov razmisli o omejitvi izpisa ali paginaciji.
- Napake pri poizvedbi obravnavaj nadzorovano in jih ne prikazuj z občutljivimi podatki.
Pogoste napake
- Poizvedba uporablja
*, čeprav stran potrebuje samo nekaj stolpcev. - Ime tabele ali stolpca je zapisano napačno.
- Rezultat poizvedbe ni preverjen pred branjem vrstic.
- Vrednosti iz podatkovne baze se izpišejo brez
htmlspecialchars(). - Ni predvidenega izpisa za primer prazne tabele.
- Manjka
ORDER BY, zato je vrstni red izpisa nepredvidljiv. - Pri velikem številu zapisov se izpiše celotna tabela brez omejitve ali paginacije.
Pri izpisu podatkov je varnost pomembna tudi takrat, ko podatkov ne spreminjamo. Nezaščiten HTML izpis lahko povzroči napačen prikaz strani ali varnostne težave.