Obstoječe zapise v tabeli spreminjamo z ukazom UPDATE. Pri urejanju podatkov uporabnik najprej izbere zapis, nato popravi podatke v obrazcu, na koncu pa aplikacija spremembe shrani v podatkovno bazo.
Pri posodabljanju zapisov je najpomembnejši pogoj WHERE. Ta določa, kateri zapis se bo spremenil. Brez pogoja se lahko sprememba izvede nad vsemi zapisi v tabeli, kar je pri urejanju posamezne knjige praviloma napaka.
Pomni: Ukaz UPDATE spreminja obstoječe zapise. Za dodajanje novih zapisov uporabimo INSERT INTO, za brisanje zapisov pa DELETE.
Pri urejanju posameznega zapisa je priporočljivo uporabiti glavni ključ, na primer stolpec ID_knjige. Tako natančno določimo, kateri zapis želimo posodobiti.
Vsebina strani
Osnovna pravila
Pri posodabljanju podatkov v spletni aplikaciji moramo poskrbeti, da uporabnik ureja pravi zapis in da se v podatkovno bazo shranijo samo preverjene vrednosti.
- Najprej moramo poznati identifikator zapisa, ki ga želimo urejati.
- Obstoječe podatke običajno najprej preberemo z ukazom
SELECT. - Obrazec za urejanje predizpolnimo z obstoječimi vrednostmi.
- Spremembe shranimo z ukazom
UPDATE. - V delu
SETnavedemo stolpce in njihove nove vrednosti. - V delu
WHEREdoločimo, kateri zapis želimo spremeniti. - Za podatke iz obrazca uporabimo pripravljene stavke.
Pozor: Ukaz UPDATE brez pogoja WHERE spremeni vse zapise v tabeli. Pri urejanju posamezne knjige mora biti pogoj vedno jasno določen.
Posodabljanje zapisov v tabeli
Pri urejanju podatkov običajno izvedemo tri korake:
- izpišemo seznam zapisov,
- izberemo zapis za urejanje,
- spremembe shranimo z ukazom
UPDATE.
Osnovna sintaksa za posodobitev zapisa je:
UPDATE imeTabele
SET stolpec1 = novaVrednost1,
stolpec2 = novaVrednost2
WHERE idStolpec = vrednostID;
Pri ukazu UPDATE je zelo pomemben pogoj WHERE. Če ga izpustimo, se lahko spremenijo vsi zapisi v tabeli.
Pomni: Pred izvedbo ukaza UPDATE je priporočljivo z ukazom SELECT preveriti, kateri zapis ustreza pogoju.
Osnovni primer z mysqli
Spodnji zgled posodobi izbran zapis v tabeli knjige z uporabo pripravljenega stavka.
<?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') {
$id = (int)($_POST['id'] ?? 0);
$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,
"UPDATE knjige
SET Priimek_avtorja = ?,
Ime_avtorja = ?,
Naslov = ?,
Strani = ?,
Cena = ?,
Leto = ?
WHERE ID_knjige = ?"
);
mysqli_stmt_bind_param(
$stmt,
'sssidii',
$priimek,
$ime,
$naslov,
$strani,
$cena,
$leto,
$id
);
if (mysqli_stmt_execute($stmt)) {
echo 'Zapis je bil uspešno posodobljen.';
} else {
echo 'Napaka pri posodabljanju zapisa.';
}
mysqli_stmt_close($stmt);
}
mysqli_close($connection);
?>
Pri mysqli pripravljen stavek pripravimo s funkcijo mysqli_prepare(), vrednosti povežemo s funkcijo mysqli_stmt_bind_param(), nato pa stavek izvedemo s funkcijo mysqli_stmt_execute().
Osnovni primer s PDO
Tudi z vmesnikom PDO zapise praviloma posodabljamo s pripravljenimi stavki in vezanimi parametri.
<?php
$streznik = 'localhost';
$baza = 'knjiznica';
$uporabnik = 'uporabnik';
$geslo = 'skritoGeslo';
try {
// Povezava do podatkovne zbirke
$pdo = new PDO("mysql:host=$streznik;dbname=$baza;charset=utf8mb4", $uporabnik, $geslo);
// Vklop izjem pri napakah
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$id = (int)($_POST['id'] ?? 0);
$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(
"UPDATE knjige
SET Priimek_avtorja = :priimek,
Ime_avtorja = :ime,
Naslov = :naslov,
Strani = :strani,
Cena = :cena,
Leto = :leto
WHERE ID_knjige = :id"
);
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$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();
echo 'Zapis je bil uspešno posodobljen.';
}
}
catch (PDOException $e) {
echo 'Napaka pri posodabljanju zapisa: ' . $e->getMessage();
}
?>
Pri PDO pripravljen stavek pripravimo z metodo prepare(), vrednosti povežemo z metodo bindValue(), stavek pa izvedemo z metodo execute().
Izbor zapisa za urejanje
Preden lahko zapis posodobimo, moramo vedeti, kateri zapis urejamo. V aplikaciji to običajno izvedemo tako, da v seznamu zapisov dodamo povezavo za urejanje, ki vsebuje identifikator zapisa.
<a href="07_uredi2.php?id=5">Uredi</a>
Na strani za urejanje nato preberemo vrednost parametra id, jo pretvorimo v celo število in z ukazom SELECT preberemo obstoječe podatke zapisa.
$id = (int)($_GET['id'] ?? 0);
SELECT *
FROM knjige
WHERE ID_knjige = :id;
Pozor: Vrednosti id iz naslova strani ne smemo obravnavati kot zaupanja vredne. Vedno jo preverimo in uporabimo v pripravljenem stavku.
Zaščita obrazca in preverjanje podatkov
Pri urejanju podatkov moramo preveriti, ali je izbrani zapis veljaven, ali so vneseni podatki pravilni in ali je obrazec zaščiten pred zlorabami.
Pri resničnih aplikacijah zato uporabimo:
- preverjanje vrednosti
id, - branje obstoječega zapisa pred prikazom obrazca,
- validacijo vseh polj obrazca,
- CSRF žeton za zaščito obrazca,
- pripravljene stavke za varen ukaz
UPDATE.
| Korak | Namen |
|---|---|
Preverjanje id |
Preverimo, ali je izbran zapis veljaven in ali obstaja. |
| Predizpolnjen obrazec | Uporabnik vidi trenutne vrednosti in jih lahko popravi. |
| CSRF žeton | Preverimo, ali je bil obrazec oddan iz naše aplikacije. |
| Validacija podatkov | Preverimo, ali so besedilna in številska polja pravilno izpolnjena. |
| Pripravljen stavek | Podatke varno povežemo s poizvedbo in izvedemo posodobitev. |
Pomni: Pri urejanju podatkov praviloma najprej preberemo obstoječi zapis, nato prikažemo obrazec, šele nato obdelamo oddane spremembe.
Primerjava pristopov mysqli in PDO
Oba pristopa omogočata varno posodabljanje podatkov s pripravljenimi stavki. Razlika je predvsem v zapisu parametrov in načinu obravnave napak.
| Korak | mysqli |
PDO |
|---|---|---|
| Priprava stavka | mysqli_prepare() |
$pdo->prepare() |
| Parametri | ? |
:priimek, :ime, :id |
| Vezava vrednosti | mysqli_stmt_bind_param() |
$stmt->bindValue() |
| Izvedba stavka | mysqli_stmt_execute() |
$stmt->execute() |
| Obravnava napak | Preverjanje rezultata izvedbe. | Pogosto z izjemami try in catch. |
Aplikacija Knjige
📘Aplikacija Knjige
V priloženi aplikaciji Knjige je urejanje razdeljeno na tri datoteke. Datoteka 07_uredi1.php prikaže seznam vseh knjig in povezavo za urejanje izbranega zapisa.
Datoteka 07_uredi2.php iz URL parametra prebere id, preveri njegovo veljavnost, nato iz baze prebere en sam zapis in pripravi predizpolnjen obrazec za urejanje. Obrazec vsebuje tudi CSRF žeton in skriti ID zapisa.
Datoteka 07_uredi3.php sprejme podatke prek metode POST, preveri CSRF žeton, validira besedilna in številska polja ter izvede posodobitev z ukazom UPDATE knjige. Po uspešnem shranjevanju se izpiše posodobljen seznam knjig in število urejenih zapisov.
07_uredi1.php07_uredi2.php07_uredi3.phpNavodila za izdelavo aplikacije Knjige
- Najprej izpišemo seznam vseh zapisov, ki jih lahko urejamo.
- Ob kliku na povezavo prenesemo
idizbranega zapisa na stran za urejanje. - Iz baze preberemo en sam zapis in z njegovimi podatki predizpolnimo obrazec.
- V obrazec dodamo skriti
ID_knjigein CSRF žeton. - Ob oddaji obrazca preverimo veljavnost žetona in podatkov.
- Za posodobitev uporabimo pripravljen stavek UPDATE.
- V pogoju
WHEREuporabimoID_knjige, da posodobimo pravi zapis. - Po uspešni spremembi uporabniku prikažemo sporočilo in posodobljen seznam zapisov.
Pozor: Pri urejanju zapisa mora biti identifikator zapisa shranjen in preverjen. Če identifikator manjka ali ni veljaven, posodobitve ne izvedemo.
Priporočila
- Za urejanje posameznega zapisa uporabi glavni ključ, na primer
ID_knjige. - Pred prikazom obrazca preveri, ali zapis z izbranim
idobstaja. - Obrazec za urejanje predizpolni z obstoječimi podatki.
- V obrazec dodaj skriti identifikator zapisa in CSRF žeton.
- Podatke iz obrazca preveri tudi na strežniku.
- Za posodobitev uporabi pripravljen stavek.
- Ukaz
UPDATEvedno omeji z ustreznim pogojemWHERE. - Po posodobitvi prikaži jasno sporočilo o uspehu ali napaki.
Pogoste napake
- Manjkajoč pogoj
WHEREv ukazuUPDATE. - Neveljaven ali manjkajoč
idzapisa za urejanje. - Obrazec ni predizpolnjen z obstoječimi podatki.
- Podatki iz obrazca niso preverjeni na strežniku.
- Namesto pripravljenega stavka se poizvedba sestavlja neposredno iz podatkov obrazca.
- Manjkajoč ali napačen CSRF žeton.
- Številska polja niso pretvorjena in preverjena.
- Po posodobitvi ni preverjeno, ali je bil zapis res spremenjen.
Posodabljanje podatkov je občutljiv del aplikacije. Napačen pogoj ali nepreverjen identifikator lahko povzroči spremembo napačnega zapisa ali več zapisov hkrati.