Pri večjem številu zapisov je koristno, da podatke omejimo glede na
izbran pogoj. Tak postopek imenujemo filtriranje. V SQL za to
najpogosteje uporabimo pogoj WHERE.
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 na primer 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.
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);
?>
Osnovni primer s PDO
Tudi z vmesnikom PDO lahko filtriranje izvedemo s
pripravljenim SQL 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();
}
?>
Preverjanje izbranega filtra
Pred izvedbo filtra moramo preveriti, ali je uporabnik izbral veljavno vrednost. Če je vrednost napačna, 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,
- če filter ni veljaven, uporabniku pokažemo napako.
Pomembnosti pri filtriranju zapisov
- za filtriranje uporabimo pogoj WHERE,
- filtriranje običajno povežemo z obrazcem,
- uporabnik lahko izbere eno vrednost ali prikaz vseh zapisov,
- rezultate pogosto uredimo z ORDER BY,
- po filtriranju izpišemo tudi število zadetkov.
📘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 vseeno prikažejo 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().
Navodila 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.
- Na koncu prikažemo še opis filtra in število najdenih zapisov.
Pri učenju je smiselno poznati oba pristopa:
- mysqli za klasično filtriranje zapisov z uporabo pogoja WHERE,
- PDO za sodobnejši in varen pristop z vezanimi parametri,
- aplikacijski pristop, kjer uporabnik filter izbere prek obrazca, rezultat pa se izpiše v preglednici.