Načrtovanje in razvoj spletnih aplikacij

Filtriranje izpisov podatkovne zbirke - WHERE

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().

Primer: aplikacija Knjige – 09_filter.php

Navodila za izdelavo aplikacije Knjige

  1. Najprej iz baze preberemo vse možne vrednosti za filter, na primer vsa leta izida.
  2. Te vrednosti prikažemo v obrazcu, na primer v spustnem seznamu.
  3. Ob oddaji obrazca preberemo izbrani filter.
  4. Če uporabnik izbere prikaz vseh zapisov, izvedemo poizvedbo brez pogoja WHERE.
  5. Če izbere določeno leto, izvedemo filtrirano poizvedbo z uporabo pripravljenega stavka.
  6. Poizvedbo izvedemo, preberemo rezultate in jih izpišemo v tabeli.
  7. 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.