Načrtovanje in razvoj spletnih aplikacij

Zadnji ID tabele podatkovne zbirke

Po vstavljanju novega zapisa v tabelo je pogosto koristno, da izvemo, kateri identifikator je bil dodeljen novemu zapisu. To je posebej uporabno pri tabelah, kjer je primarni ključ nastavljen s AUTO_INCREMENT.

Vstavljanje zapisa in zadnji ID

Ko v tabelo dodamo nov zapis, podatkovna zbirka pri stolpcu AUTO_INCREMENT samodejno določi naslednjo prosto vrednost identifikatorja.

Osnovna sintaksa za vnos zapisa je:

INSERT INTO imeTabele (stolpec1, stolpec2, stolpec3)
VALUES (vrednost1, vrednost2, vrednost3);

Po uspešno izvedenem vstavljanju lahko v PHP pridobimo še ID zadnjega vstavljenega zapisa. Tako lahko uporabniku izpišemo, kateri zapis je bil dodan.

Tak pristop je uporaben na primer pri:

  • potrditvi vnosa novega zapisa,
  • nadaljnji obdelavi ravnokar dodanega zapisa,
  • preusmeritvi na podrobnosti novega zapisa.

Osnovni primer z mysqli

Spodnji zgled vstavi nov zapis v tabelo knjige in nato pridobi ID zadnjega vstavljenega zapisa z uporabo mysqli_insert_id().

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

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $priimek = trim($_POST['priimek'] ?? '');
    $ime = trim($_POST['ime'] ?? '');
    $naslov = trim($_POST['naslov'] ?? '');
    $strani = (int)($_POST['strani'] ?? 0);
    $cena = (float)($_POST['cena'] ?? 0);
    $leto = (int)($_POST['leto'] ?? 0);

    $stmt = mysqli_prepare(
        $connection,
        "INSERT INTO knjige
        (Priimek_avtorja, Ime_avtorja, Naslov, Strani, Cena, Leto)
        VALUES (?, ?, ?, ?, ?, ?)"
    );

    mysqli_stmt_bind_param($stmt, 'sssidi', $priimek, $ime, $naslov, $strani, $cena, $leto);

    if (mysqli_stmt_execute($stmt)) {
        $lastId = mysqli_insert_id($connection);
        echo 'Zapis je bil uspešno dodan. Zadnji ID je: ' . $lastId;
    } else {
        echo 'Napaka pri vstavljanju zapisa.';
    }

    mysqli_stmt_close($stmt);
}

mysqli_close($connection);
?>

Osnovni primer s PDO

Tudi z vmesnikom PDO lahko po uspešnem vstavljanju novega zapisa pridobimo zadnji ID z metodo lastInsertId().

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

    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        $priimek = trim($_POST['priimek'] ?? '');
        $ime = trim($_POST['ime'] ?? '');
        $naslov = trim($_POST['naslov'] ?? '');
        $strani = (int)($_POST['strani'] ?? 0);
        $cena = (float)($_POST['cena'] ?? 0);
        $leto = (int)($_POST['leto'] ?? 0);

        $stmt = $pdo->prepare(
            "INSERT INTO knjige
            (Priimek_avtorja, Ime_avtorja, Naslov, Strani, Cena, Leto)
            VALUES
            (:priimek, :ime, :naslov, :strani, :cena, :leto)"
        );

        $stmt->bindValue(':priimek', $priimek, PDO::PARAM_STR);
        $stmt->bindValue(':ime', $ime, PDO::PARAM_STR);
        $stmt->bindValue(':naslov', $naslov, PDO::PARAM_STR);
        $stmt->bindValue(':strani', $strani, PDO::PARAM_INT);
        $stmt->bindValue(':cena', number_format($cena, 2, '.', ''), PDO::PARAM_STR);
        $stmt->bindValue(':leto', $leto, PDO::PARAM_INT);

        $stmt->execute();

        $lastId = $pdo->lastInsertId();
        echo 'Zapis je bil uspešno dodan. Zadnji ID je: ' . $lastId;
    }
}
catch (PDOException $e) {
    echo 'Napaka pri vstavljanju zapisa: ' . $e->getMessage();
}
?>

Preverjanje podatkov pred vstavljanjem

Tudi pri tej vrsti vnosa moramo podatke najprej preveriti. Posebej pomembno je, da so besedilna polja izpolnjena in da imajo številčna polja veljavne vrednosti.

  • priimek, ime in naslov morajo biti izpolnjeni,
  • število strani mora biti pozitivno celo število,
  • cena mora biti število, večje ali enako 0,
  • leto izida mora biti smiselno celo število,
  • obrazec je priporočljivo zaščititi s CSRF žetonom.

Pomembnosti pri pridobivanju zadnjega ID-ja

  • zadnji ID lahko pridobimo šele po uspešnem ukazu INSERT,
  • uporabimo ga pri tabelah s stolpcem AUTO_INCREMENT,
  • v mysqli uporabimo funkcijo mysqli_insert_id(),
  • v PDO uporabimo metodo lastInsertId(),
  • po vnosu je smiselno uporabniku prikazati še potrditveno sporočilo in osvežen seznam zapisov.

📘Aplikacija Knjige

V priloženi aplikaciji Knjige je rešitev razdeljena na dve datoteki. Datoteka 12_lastID-obrazec.php pripravi obrazec za vnos nove knjige in vanj doda tudi CSRF žeton. Polja obrazca so priimek, ime, naslov, strani, cena in leto izida.

Datoteka 12_lastID.php preveri metodo POST, veljavnost CSRF žetona in pravilnost vseh vnesenih podatkov. Nato izvede pripravljen PDO ukaz INSERT INTO knjige ....

Po uspešnem vnosu aplikacija pridobi ID zadnjega dodanega zapisa z metodo lastInsertId(), izpiše potrditveno sporočilo in nato prikaže še posodobljen seznam vseh zapisov.

Primer: aplikacija Knjige – 12_lastID-obrazec.php
Primer: aplikacija Knjige – 12_lastID.php

Navodila za izdelavo aplikacije Knjige

  1. Najprej pripravimo obrazec za vnos novega zapisa.
  2. V obrazec dodamo vsa potrebna polja in CSRF žeton.
  3. Ob oddaji obrazca v PHP preverimo metodo pošiljanja in veljavnost žetona.
  4. Vnesene podatke očistimo in validiramo.
  5. Za shranjevanje uporabimo pripravljen SQL stavek INSERT INTO.
  6. Po uspešnem vnosu pridobimo zadnji ID z metodo lastInsertId() oziroma z ustrezno funkcijo v mysqli.
  7. Uporabniku prikažemo potrditveno sporočilo, zadnji ID in posodobljen seznam vseh zapisov.

Pri učenju je smiselno poznati oba pristopa:

  • mysqli za klasičen vnos zapisa in pridobivanje zadnjega ID-ja,
  • PDO za sodobnejši in varen pristop s pripravljeno poizvedbo,
  • aplikacijski pristop, kjer se po uspešnem vnosu uporabniku takoj izpiše še zadnji dodeljeni ID.