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.
Navodila za izdelavo aplikacije Knjige
- Najprej pripravimo obrazec za vnos novega zapisa.
- V obrazec dodamo vsa potrebna polja in CSRF žeton.
- Ob oddaji obrazca v PHP preverimo metodo pošiljanja in veljavnost žetona.
- Vnesene podatke očistimo in validiramo.
- Za shranjevanje uporabimo pripravljen SQL stavek INSERT INTO.
- Po uspešnem vnosu pridobimo zadnji ID z metodo
lastInsertId()oziroma z ustrezno funkcijo v mysqli. - 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.