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.
Navodila za izdelavo aplikacije Knjige
- Najprej določimo, po katerih stolpcih sme uporabnik razvrščati zapise.
- Pripravimo tudi uporabniku prijazne oznake stolpcev za prikaz v tabeli.
- Iz URL parametrov ali obrazca preberemo izbrani stolpec in smer razvrščanja.
- Preverimo, ali je stolpec dovoljen, in ali je smer razvrščanja veljavna.
- Izvedemo poizvedbo z ukazom ORDER BY.
- Glave stolpcev pripravimo kot povezave, ki ob kliku spremenijo smer razvrščanja.
- 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.