Pri večjem številu zapisov je koristno, da podatke omejimo glede na izbran pogoj. Tak postopek imenujemo filtriranje. V MySQL oziroma MariaDB za filtriranje najpogosteje uporabimo pogoj WHERE.
Filtriranje je pomembno v spletnih aplikacijah, ker uporabniku omogoči, da hitro najde samo tiste zapise, ki ga zanimajo. V aplikaciji Knjige lahko na primer prikažemo vse knjige ali pa samo knjige iz izbranega leta.
Pomni: Filter ne spreminja podatkov v tabeli. Filter samo omeji, kateri zapisi se prikažejo v rezultatu poizvedbe.
Pri filtriranju na podlagi uporabniškega vnosa je treba uporabiti pripravljen stavek. Tako vrednosti iz obrazca ne vključujemo neposredno v poizvedbo.
Vsebina strani
Osnovna pravila
Pri filtriranju podatkov določimo pogoj, ki ga morajo zapisi izpolnjevati. Rezultat poizvedbe vsebuje samo tiste vrstice, ki ustrezajo izbranemu pogoju.
- Za filtriranje zapisov uporabimo pogoj
WHERE. - Filter lahko temelji na številskem, besedilnem ali datumskem stolpcu.
- Pri filtriranju po letu uporabimo stolpec
Leto. - Če uporabnik izbere prikaz vseh zapisov, poizvedbo izvedemo brez pogoja
WHERE. - Če uporabnik izbere določeno vrednost, uporabimo pripravljen stavek s parametrom.
- Rezultate lahko uredimo z ukazom
ORDER BY. - Pri izpisu rezultatov uporabimo
htmlspecialchars().
Pozor: Vrednost filtra, ki pride iz obrazca, je uporabniški vnos. Zato jo je treba preveriti in jo v poizvedbo vključiti samo prek pripravljenega stavka.
Filtriranje zapisov v tabeli
Filtriranje pomeni, da iz vseh zapisov prikažemo samo tiste, ki ustrezajo izbranemu pogoju. Tako uporabnik hitreje najde želene podatke.
Osnovna sintaksa za filtriranje zapisov je:
SELECT stolpec1, stolpec2
FROM imeTabele
WHERE pogoj;
Če želimo prikazati samo knjige iz določenega leta, uporabimo:
SELECT *
FROM knjige
WHERE Leto = 2024;
Filtrirane rezultate lahko po potrebi tudi uredimo:
SELECT *
FROM knjige
WHERE Leto = 2024
ORDER BY ID_knjige;
V spletni aplikaciji filter pogosto izvedemo prek obrazca, na primer s spustnim seznamom ali vnosnim poljem.
Pomni: WHERE določa pogoj za izbiro zapisov, ORDER BY pa določa vrstni red prikaza. To sta različna dela poizvedbe.
Osnovni primer z mysqli
Spodnji zgled prikaže samo knjige iz izbranega leta. Če je leto nastavljeno na 0, se izpišejo vsi zapisi.
<?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() . ')'
);
}
$izbranoLeto = (int)($_POST['leto'] ?? 0);
if ($izbranoLeto === 0) {
$stmt = mysqli_prepare(
$connection,
"SELECT ID_knjige, Priimek_avtorja, Ime_avtorja, Naslov, Strani, Cena, Leto
FROM knjige
ORDER BY ID_knjige"
);
} else {
$stmt = mysqli_prepare(
$connection,
"SELECT ID_knjige, Priimek_avtorja, Ime_avtorja, Naslov, Strani, Cena, Leto
FROM knjige
WHERE Leto = ?
ORDER BY ID_knjige"
);
mysqli_stmt_bind_param($stmt, 'i', $izbranoLeto);
}
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
while ($row = mysqli_fetch_assoc($result)) {
echo htmlspecialchars($row['Naslov']) . '<br>';
}
mysqli_stmt_close($stmt);
mysqli_close($connection);
?>
Pri mysqli pripravimo različno poizvedbo glede na izbiro uporabnika. Če uporabnik izbere prikaz vseh zapisov, pogoj WHERE ni potreben. Če izbere določeno leto, vrednost leta vežemo s funkcijo mysqli_stmt_bind_param().
Osnovni primer s PDO
Tudi z vmesnikom PDO lahko filtriranje izvedemo s pripravljenim stavkom in vezanim parametrom.
<?php
$streznik = 'localhost';
$baza = 'knjiznica';
$uporabnik = 'uporabnik';
$geslo = 'skritoGeslo';
try {
$pdo = new PDO("mysql:host=$streznik;dbname=$baza;charset=utf8mb4", $uporabnik, $geslo);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$izbranoLeto = trim($_POST['leto'] ?? '0');
if ($izbranoLeto === '0') {
$stmt = $pdo->prepare(
"SELECT ID_knjige, Priimek_avtorja, Ime_avtorja, Naslov, Strani, Cena, Leto
FROM knjige
ORDER BY ID_knjige"
);
$stmt->execute();
} else {
$stmt = $pdo->prepare(
"SELECT ID_knjige, Priimek_avtorja, Ime_avtorja, Naslov, Strani, Cena, Leto
FROM knjige
WHERE Leto = :leto
ORDER BY ID_knjige"
);
$stmt->bindValue(':leto', (int)$izbranoLeto, PDO::PARAM_INT);
$stmt->execute();
}
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $row) {
echo htmlspecialchars($row['Naslov']) . '<br>';
}
}
catch (PDOException $e) {
echo 'Napaka pri filtriranju podatkov: ' . $e->getMessage();
}
?>
Pri PDO pripravljen stavek pripravimo z metodo prepare(), vrednost filtra povežemo z metodo bindValue(), rezultate pa preberemo z metodo fetchAll().
Filter prek obrazca
V spletni aplikaciji filter običajno povežemo z obrazcem. Pri filtriranju po letu lahko uporabimo spustni seznam, v katerem je vrednost 0 namenjena prikazu vseh zapisov.
<form method="post" action="09_filter.php">
<label for="leto">Izberi leto:</label>
<select name="leto" id="leto">
<option value="0">Vsa leta</option>
<option value="2021">2021</option>
<option value="2022">2022</option>
<option value="2023">2023</option>
</select>
<button type="submit">Filtriraj</button>
</form>
V boljši izvedbi vrednosti za spustni seznam ne vpišemo ročno, ampak jih preberemo iz tabele. Tako se seznam samodejno prilagodi podatkom, ki so v bazi.
SELECT DISTINCT Leto
FROM knjige
ORDER BY Leto;
Pomni: Za seznam možnih vrednosti filtra je uporaben SELECT DISTINCT, ker vrne samo različne vrednosti.
Preverjanje izbranega filtra
Pred izvedbo filtra moramo preveriti, ali je uporabnik izbral veljavno vrednost. Če je vrednost napačna, lahko uporabniku prikažemo opozorilo ali pa izpišemo vse zapise.
- preverimo, ali je bil obrazec oddan,
- preberemo izbrano vrednost iz obrazca,
- preverimo, ali je leto veljavno celo število,
- vrednost
0obravnavamo kot prikaz vseh zapisov, - če filter ni veljaven, uporabniku pokažemo opozorilo.
$izbranoLeto = trim($_POST['leto'] ?? '0');
if ($izbranoLeto !== '0' && !ctype_digit($izbranoLeto)) {
echo 'Izbrani filter ni veljaven.';
}
Pozor: Tudi če vrednosti za filter prihajajo iz spustnega seznama, jih je treba preveriti na strežniku. Vrednosti obrazca je mogoče spremeniti pred pošiljanjem zahtevka.
Primerjava filtriranja z mysqli in PDO
Oba pristopa omogočata filtriranje s pripravljenimi stavki. Razlika je predvsem v načinu vezave parametrov in branju rezultatov.
| Korak | mysqli |
PDO |
|---|---|---|
| Priprava stavka | mysqli_prepare() |
$pdo->prepare() |
| Parameter za leto | ? |
:leto |
| Vezava vrednosti | mysqli_stmt_bind_param() |
$stmt->bindValue() |
| Izvedba | mysqli_stmt_execute() |
$stmt->execute() |
| Branje rezultatov | mysqli_fetch_assoc() |
$stmt->fetchAll() |
Aplikacija Knjige
📘Aplikacija Knjige
V priloženi aplikaciji Knjige je filtriranje izvedeno v datoteki 09_filter.php. Stran najprej iz baze prebere vsa različna leta izida in z njimi napolni spustni seznam.
Če uporabnik izbere vrednost 0, aplikacija prikaže vse knjige. Če izbere določeno leto, se izvede poizvedba SELECT ... WHERE Leto = :leto. Če leto ni veljavno, se izpiše opozorilo in prikažejo se vsi zapisi.
Pod rezultati stran izpiše tudi opis izbranega filtra, število zapisov in tabelarični prikaz vseh zadetkov. Vrednosti so pri izpisu zaščitene s funkcijo htmlspecialchars().
09_filter.phpNavodila za izdelavo aplikacije Knjige
- Najprej iz baze preberemo vse možne vrednosti za filter, na primer vsa leta izida.
- Te vrednosti prikažemo v obrazcu, na primer v spustnem seznamu.
- Ob oddaji obrazca preberemo izbrani filter.
- Če uporabnik izbere prikaz vseh zapisov, izvedemo poizvedbo brez pogoja WHERE.
- Če izbere določeno leto, izvedemo filtrirano poizvedbo z uporabo pripravljenega stavka.
- Poizvedbo izvedemo, preberemo rezultate in jih izpišemo v tabeli.
- Pri izpisu vrednosti uporabimo
htmlspecialchars(). - Na koncu prikažemo še opis filtra in število najdenih zapisov.
Pomni: Pri filtriranju je koristno prikazati tudi število najdenih zapisov. Tako uporabnik hitro vidi, ali je filter našel pričakovane podatke.
Priporočila
- Za filtriranje uporabi pogoj
WHERE. - Vrednosti za spustni seznam po možnosti preberi iz podatkovne baze.
- Vrednost
0lahko uporabiš za prikaz vseh zapisov. - Vrednost filtra vedno preveri na strežniku.
- Za uporabniški vnos uporabi pripravljen stavek.
- Rezultate uredi z
ORDER BY. - Pri izpisu rezultatov uporabi
htmlspecialchars(). - Uporabniku prikaži opis izbranega filtra in število zadetkov.
Pogoste napake
- Vrednost filtra je neposredno vključena v poizvedbo.
- Vrednost iz obrazca ni preverjena na strežniku.
- Ni predvidene možnosti za prikaz vseh zapisov.
- Poizvedba z uporabo
WHEREni izvedena s pripravljenim stavkom. - Rezultati niso urejeni z
ORDER BY, zato je vrstni red nepredvidljiv. - Pri izpisu rezultatov manjka
htmlspecialchars(). - Uporabniku ni jasno prikazano, kateri filter je trenutno izbran.
- Ni izpisano število najdenih zapisov.
Filtriranje je pogosto povezano z uporabniškim vnosom. Zato je treba vrednosti filtra obravnavati enako previdno kot druge podatke iz obrazcev.