Kadar ne želimo prikazati vseh zapisov naenkrat, lahko izpis omejimo.
V SQL za to uporabimo ukaza LIMIT in
OFFSET.
Omejen izpis zapisov
Omejen izpis pomeni, da iz tabele prikažemo le določen del zapisov. To je uporabno pri daljših seznamih, pri prikazu po straneh in pri pripravi preglednejšega izpisa.
Osnovna sintaksa za omejen izpis je:
SELECT *
FROM imeTabele
LIMIT steviloZapisov;
Če želimo določiti še začetni odmik, uporabimo:
SELECT *
FROM imeTabele
LIMIT steviloZapisov OFFSET zacetek;
Če želimo na primer iz tabele knjige prikazati
5 zapisov od tretjega naprej, uporabimo:
SELECT *
FROM knjige
ORDER BY ID_knjige
LIMIT 5 OFFSET 2;
Pri omejenem izpisu rezultate skoraj vedno tudi uredimo, zato
pogosto ukaz LIMIT uporabljamo skupaj z
ORDER BY.
Osnovni primer z mysqli
Spodnji zgled prikaže omejeno število zapisov iz tabele
knjige. Če uporabnik vnese napačne podatke,
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() . ')'
);
}
$stevilo = trim($_POST['stevilo'] ?? '');
$start = trim($_POST['start'] ?? '');
$steviloValid = filter_var($stevilo, FILTER_VALIDATE_INT);
$startValid = filter_var($start, FILTER_VALIDATE_INT);
if ($steviloValid !== false && $startValid !== false && (int)$stevilo > 0 && (int)$start >= 0) {
$stmt = mysqli_prepare(
$connection,
"SELECT ID_knjige, Priimek_avtorja, Ime_avtorja, Naslov, Strani, Cena, Leto
FROM knjige
ORDER BY ID_knjige
LIMIT ? OFFSET ?"
);
mysqli_stmt_bind_param($stmt, 'ii', $steviloValid, $startValid);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
} else {
$result = mysqli_query(
$connection,
"SELECT ID_knjige, Priimek_avtorja, Ime_avtorja, Naslov, Strani, Cena, Leto
FROM knjige
ORDER BY ID_knjige"
);
}
while ($row = mysqli_fetch_assoc($result)) {
echo htmlspecialchars($row['Naslov']) . '<br>';
}
if (isset($stmt)) {
mysqli_stmt_close($stmt);
}
mysqli_close($connection);
?>
Osnovni primer s PDO
Tudi z vmesnikom PDO lahko omejen izpis izvedemo
s pripravljenim stavkom in parametroma za LIMIT
ter OFFSET.
<?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);
$stevilo = trim($_POST['stevilo'] ?? '');
$start = trim($_POST['start'] ?? '');
$steviloValid = filter_var($stevilo, FILTER_VALIDATE_INT);
$startValid = filter_var($start, FILTER_VALIDATE_INT);
if ($steviloValid !== false && $startValid !== false && (int)$stevilo > 0 && (int)$start >= 0) {
$stmt = $pdo->prepare(
"SELECT ID_knjige, Priimek_avtorja, Ime_avtorja, Naslov, Strani, Cena, Leto
FROM knjige
ORDER BY ID_knjige
LIMIT :stevilo OFFSET :start"
);
$stmt->bindValue(':stevilo', (int)$stevilo, PDO::PARAM_INT);
$stmt->bindValue(':start', (int)$start, PDO::PARAM_INT);
$stmt->execute();
} else {
$stmt = $pdo->prepare(
"SELECT ID_knjige, Priimek_avtorja, Ime_avtorja, Naslov, Strani, Cena, Leto
FROM knjige
ORDER BY ID_knjige"
);
$stmt->execute();
}
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $row) {
echo htmlspecialchars($row['Naslov']) . '<br>';
}
}
catch (PDOException $e) {
echo 'Napaka pri omejenem izpisu: ' . $e->getMessage();
}
?>
Preverjanje vrednosti za omejen izpis
Pred uporabo ukazov LIMIT in OFFSET
moramo preveriti, ali je uporabnik vnesel veljavni celi števili.
- število zapisov mora biti pozitivno celo število,
- začetni odmik mora biti nič ali več,
- če podatka nista pravilna, uporabniku pokažemo opozorilo ali izpišemo vse zapise,
- omejen izpis je najbolj smiseln skupaj z urejenim prikazom zapisov.
Pomembnosti pri omejenem izpisu
- za omejen izpis uporabimo LIMIT,
- za začetni odmik uporabimo OFFSET,
- omejen izpis pogosto uporabljamo pri stranjenju rezultatov,
- rezultate je priporočljivo pred omejitvijo tudi urediti,
- po omejenem izpisu lahko uporabniku pokažemo tudi število prikazanih zapisov.
📘Aplikacija Knjige
V priloženi aplikaciji Knjige je omejen izpis izveden v datoteki 11_omejen-izpis.php. Uporabnik v obrazec vnese število zapisov in začetni odmik, nato pa aplikacija glede na vneseni vrednosti pripravi ustrezno poizvedbo.
Stran najprej pridobi največji ID_knjige in ga uporabi
pri dodatni kontroli, ali je začetni odmik smiseln. Če podatka
manjkata, nista veljavna ali je začetni odmik previsok, aplikacija
prikaže vse zapise. Če sta oba podatka pravilna, uporabi
LIMIT :stevilo OFFSET :start.
Pod obrazcem aplikacija izpiše tudi opis trenutnega izpisa,
število prikazanih zapisov in preglednico rezultatov. Vrednosti
so pri izpisu zaščitene s funkcijo htmlspecialchars().
Navodila za izdelavo aplikacije Knjige
- Najprej pripravimo obrazec za vnos števila zapisov in začetnega odmika.
- Ob oddaji obrazca preberemo obe vrednosti.
- Preverimo, ali sta vneseni vrednosti veljavni celi števili.
- Če sta podatka pravilna, pripravimo poizvedbo z ukazoma LIMIT in OFFSET.
- Če podatka nista pravilna, uporabniku izpišemo vse zapise ali opozorilo.
- Rezultate uredimo, izvedemo poizvedbo in jih izpišemo v tabeli.
- Na koncu prikažemo še opis trenutnega izpisa in število prikazanih zapisov.
Pri učenju je smiselno poznati oba pristopa:
- mysqli za klasičen omejen izpis podatkov,
- PDO za sodobnejši in varen pristop z vezanimi parametri,
- aplikacijski pristop, kjer uporabnik sam določi obseg prikaza zapisov.