Načrtovanje in razvoj spletnih aplikacij

Razvrščanje izpisov podatkovne zbirke - ORDER BY

Ko imamo v tabeli več zapisov, jih pogosto želimo urediti po določenem stolpcu. Tak postopek imenujemo sortiranje oziroma razvrščanje zapisov. V SQL za to uporabimo ukaz ORDER BY.

Sortiranje zapisov v tabeli

Sortiranje pomeni, da zapise uredimo po izbranem stolpcu, na primer po priimku avtorja, naslovu knjige, ceni ali letu izida.

Osnovna sintaksa za sortiranje zapisov je:

SELECT stolpec1, stolpec2
FROM imeTabele
ORDER BY izbraniStolpec;

Privzeto se zapisi uredijo naraščajoče. Če želimo padajoče razvrščanje, uporabimo ukaz DESC:

SELECT *
FROM knjige
ORDER BY Leto DESC;

Za naraščajoče razvrščanje lahko po želji uporabimo oznako ASC:

SELECT *
FROM knjige
ORDER BY Naslov ASC;

V spletni aplikaciji lahko uporabniku omogočimo, da izbere tako stolpec kot tudi smer razvrščanja.

Osnovni primer z mysqli

Spodnji zgled prikaže razvrščene zapise tabele knjige. Ker imena stolpcev ne moremo varno vezati kot običajni parameter, moramo dovoljene stolpce predhodno preveriti.

<?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() . ')'
    );
}

// Dovoljeni stolpci za razvrščanje
$dovoljeniStolpci = ['ID_knjige', 'Priimek_avtorja', 'Ime_avtorja', 'Naslov', 'Strani', 'Cena', 'Leto'];

$stolpec = $_GET['column'] ?? 'ID_knjige';
$vrstniRed = (isset($_GET['order']) && strtolower($_GET['order']) === 'desc') ? 'DESC' : 'ASC';

if (!in_array($stolpec, $dovoljeniStolpci, true)) {
    $stolpec = 'ID_knjige';
}

$sql = "SELECT ID_knjige, Priimek_avtorja, Ime_avtorja, Naslov, Strani, Cena, Leto
        FROM knjige
        ORDER BY $stolpec $vrstniRed";

$result = mysqli_query($connection, $sql);

while ($row = mysqli_fetch_assoc($result)) {
    echo htmlspecialchars($row['Naslov']) . '<br>';
}

mysqli_close($connection);
?>

Osnovni primer s PDO

Tudi z vmesnikom PDO sortiranje izvedemo z ukazom ORDER BY. Tudi tu moramo ime stolpca najprej preveriti na seznamu dovoljenih vrednosti.

<?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);

    $dovoljeniStolpci = ['ID_knjige', 'Priimek_avtorja', 'Ime_avtorja', 'Naslov', 'Strani', 'Cena', 'Leto'];

    $stolpec = $_GET['column'] ?? 'ID_knjige';
    $vrstniRed = (isset($_GET['order']) && strtolower($_GET['order']) === 'desc') ? 'DESC' : 'ASC';

    if (!in_array($stolpec, $dovoljeniStolpci, true)) {
        $stolpec = 'ID_knjige';
    }

    $sql = "SELECT ID_knjige, Priimek_avtorja, Ime_avtorja, Naslov, Strani, Cena, Leto
            FROM knjige
            ORDER BY $stolpec $vrstniRed";

    $stmt = $pdo->query($sql);
    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

    foreach ($rows as $row) {
        echo htmlspecialchars($row['Naslov']) . '<br>';
    }
}
catch (PDOException $e) {
    echo 'Napaka pri sortiranju podatkov: ' . $e->getMessage();
}
?>

Preverjanje izbranega stolpca in smeri

Pri sortiranju je pomembno, da uporabnik ne more vnesti poljubnega imena stolpca v SQL poizvedbo. Zato pripravimo seznam dovoljenih stolpcev in uporabimo samo tistega, ki je na tem seznamu.

  • preberemo izbrani stolpec iz obrazca ali URL parametra,
  • preverimo, ali je stolpec na seznamu dovoljenih vrednosti,
  • dovolimo le smeri ASC ali DESC,
  • če podatek ni veljaven, uporabimo privzeto razvrstitev.

Pomembnosti pri sortiranju zapisov

  • za sortiranje uporabimo ukaz ORDER BY,
  • naraščajoča ureditev uporablja oznako ASC,
  • padajoča ureditev uporablja oznako DESC,
  • rezultate lahko sortiramo po enem ali več stolpcih,
  • ime stolpca moramo pred uporabo v SQL poizvedbi preveriti.

📘Aplikacija Knjige

V priloženi aplikaciji Knjige je sortiranje izvedeno v datoteki 10_sort.php. Aplikacija najprej določi seznam dovoljenih stolpcev za razvrščanje, med katerimi so ID_knjige, Priimek_avtorja, Ime_avtorja, Naslov, Strani, Cena in Leto.

Nato iz URL parametrov prebere izbrani stolpec in vrstni red. Če stolpec ni dovoljen, uporabi privzeti stolpec ID_knjige; za smer pa dovoli le ASC ali DESC. Nato sestavi poizvedbo SELECT ... FROM knjige ORDER BY ....

Na strani so glave stolpcev klikljive. Ob kliku se stran znova naloži z novima parametroma column in order. Aktivni stolpec je posebej označen, uporabniku pa se izpišeta tudi trenutna razvrstitev in število zapisov.

Primer: aplikacija Knjige – 10_sort.php

Navodila za izdelavo aplikacije Knjige

  1. Najprej določimo, po katerih stolpcih sme uporabnik razvrščati zapise.
  2. Pripravimo tudi uporabniku prijazne oznake stolpcev za prikaz v tabeli.
  3. Iz URL parametrov ali obrazca preberemo izbrani stolpec in smer razvrščanja.
  4. Preverimo, ali je stolpec dovoljen, in ali je smer razvrščanja veljavna.
  5. Izvedemo poizvedbo z ukazom ORDER BY.
  6. Glave stolpcev pripravimo kot povezave, ki ob kliku spremenijo smer razvrščanja.
  7. Uporabniku prikažemo trenutno razvrstitev, število zapisov in preglednico rezultatov.

Pri učenju je smiselno poznati oba pristopa:

  • mysqli za klasično razvrščanje zapisov z ukazom ORDER BY,
  • PDO za sodobnejši pristop pri delu z bazo,
  • aplikacijski pristop, kjer uporabnik klikne na naslov stolpca in tako spremeni razvrstitev.