Zapise iz tabele brišemo z ukazom DELETE. Pri tem mora uporabnik najprej izbrati zapis za brisanje, aplikacija pa mora preveriti, ali je zahtevek veljaven, in šele nato izvesti odstranitev iz podatkovne baze.
Brisanje podatkov je občutljivo dejanje, ker lahko povzroči trajno izgubo podatkov. Zato mora biti postopek brisanja jasno omejen na en izbran zapis, izveden prek varnega zahtevka in zaščiten pred neželeno oddajo obrazca.
Pomni: Ukaz DELETE briše zapise iz tabele. Same tabele ne izbriše. Za brisanje celotne tabele kot objekta bi uporabili ukaz DROP TABLE.
Pri brisanju posameznega zapisa je priporočljivo uporabiti glavni ključ, na primer stolpec ID_knjige. Tako natančno določimo, kateri zapis želimo odstraniti.
Vsebina strani
Osnovna pravila
Pri brisanju podatkov v spletni aplikaciji moramo natančno določiti, kateri zapis brišemo, preveriti zahtevek in uporabiti pripravljen stavek.
- Za brisanje zapisov uporabimo ukaz
DELETE. - V delu
FROMdoločimo tabelo, iz katere brišemo. - V delu
WHEREdoločimo, kateri zapis naj se izbriše. - Za brisanje posamezne knjige uporabimo stolpec
ID_knjige. - Brisanje naj se izvede prek obrazca z metodo
POST. - Obrazec za brisanje zaščitimo s CSRF žetonom.
- Vrednost identifikatorja pred uporabo pretvorimo in preverimo.
- Za izvedbo brisanja uporabimo pripravljen stavek.
Pozor: Ukaz DELETE brez pogoja WHERE izbriše vse zapise v tabeli. Pri brisanju posamezne knjige mora biti pogoj vedno jasno določen.
Brisanje zapisa iz tabele
Pri brisanju podatkov v spletni aplikaciji običajno najprej prikažemo seznam zapisov. Uporabnik izbere zapis, ki ga želi odstraniti, nato pa aplikacija izvede ukaz DELETE.
Osnovna sintaksa za brisanje enega zapisa je:
DELETE FROM imeTabele
WHERE idStolpec = vrednostID;
Primer brisanja knjige z določenim identifikatorjem:
DELETE FROM knjige
WHERE ID_knjige = 5;
V aplikaciji take vrednosti ne vpišemo neposredno v poizvedbo, ampak uporabimo pripravljen stavek in parameter.
Pomni: Pred brisanjem je pogosto smiselno uporabniku prikazati, kateri zapis bo izbrisan, ali uporabiti potrditveno okno. Tako zmanjšamo možnost nenamernega brisanja.
Osnovni primer z mysqli
Spodnji zgled izbriše izbran zapis iz tabele 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);
$stmt = mysqli_prepare(
$connection,
"DELETE FROM knjige WHERE ID_knjige = ?"
);
mysqli_stmt_bind_param($stmt, 'i', $id);
if (mysqli_stmt_execute($stmt)) {
echo 'Zapis je bil uspešno izbrisan.';
} else {
echo 'Napaka pri brisanju zapisa.';
}
mysqli_stmt_close($stmt);
}
mysqli_close($connection);
?>
Pri mysqli pripravljen stavek pripravimo s funkcijo mysqli_prepare(), identifikator povežemo s funkcijo mysqli_stmt_bind_param(), brisanje pa izvedemo s funkcijo mysqli_stmt_execute().
Osnovni primer s PDO
Tudi z vmesnikom PDO zapis praviloma izbrišemo s pripravljenim stavkom in vezanim parametrom.
<?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);
$stmt = $pdo->prepare("DELETE FROM knjige WHERE ID_knjige = :id");
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$stmt->execute();
echo 'Zapis je bil uspešno izbrisan.';
}
}
catch (PDOException $e) {
echo 'Napaka pri brisanju zapisa: ' . $e->getMessage();
}
?>
Pri PDO pripravljen stavek pripravimo z metodo prepare(), parameter povežemo z metodo bindValue(), stavek pa izvedemo z metodo execute().
Zakaj brisanje izvajamo prek POST obrazca
Brisanje podatkov spreminja stanje podatkovne baze, zato ga ne izvajamo z navadno povezavo, ki uporablja metodo GET. Povezava je primerna za prikaz strani, ne pa za dejanje, ki izbriše podatke.
Namesto povezave uporabimo obrazec z metodo POST, v katerem pošljemo identifikator zapisa in CSRF žeton.
<form method="post" action="08_brisi2.php">
<input type="hidden" name="id" value="5">
<input type="hidden" name="csrf_token" value="...">
<button type="submit">Izbriši</button>
</form>
Pred oddajo obrazca lahko uporabniku prikažemo potrditveno vprašanje, na primer z atributom onsubmit.
<form method="post" action="08_brisi2.php"
onsubmit="return confirm('Ali res želite izbrisati izbrani zapis?');">
Pozor: Potrditveno okno v brskalniku ni varnostni mehanizem. Je pomoč uporabniku pred nenamernim klikom. Varnostno preverjanje mora biti izvedeno tudi na strežniku.
Zaščita obrazca in preverjanje brisanja
Pri brisanju podatkov moramo posebej paziti na varnost, saj gre za dejanje, ki odstrani zapis. Zato pri resničnih aplikacijah uporabimo več preverjanj.
- preverimo, ali je bil zahtevek poslan z metodo
POST, - preverimo, ali je
ID_knjigeveljaven, - preverimo, ali zapis z izbranim identifikatorjem obstaja,
- obrazec zaščitimo s CSRF žetonom,
- za brisanje uporabimo pripravljen stavek,
- po brisanju preverimo, ali je bil zapis dejansko odstranjen.
| Preverjanje | Namen |
|---|---|
POST |
Prepreči, da bi brisanje izvajali z navadno povezavo. |
ID_knjige |
Določi, kateri zapis naj se izbriše. |
| CSRF žeton | Preveri, ali je bil obrazec oddan iz naše aplikacije. |
| Pripravljen stavek | Varno poveže parameter z ukazom za brisanje. |
| Število izbrisanih vrstic | Pove, ali je bil izbran zapis dejansko izbrisan. |
Pomni: Vrednost id iz obrazca je treba vedno preveriti. Če je vrednost prazna, ničelna ali neveljavna, brisanja ne izvedemo.
Primerjava pristopov mysqli in PDO
Oba pristopa omogočata varno brisanje zapisov s pripravljenimi stavki. Razlika je predvsem v zapisu parametrov in obravnavi napak.
| Korak | mysqli |
PDO |
|---|---|---|
| Priprava stavka | mysqli_prepare() |
$pdo->prepare() |
| Parameter za ID | ? |
:id |
| Vezava vrednosti | mysqli_stmt_bind_param() |
$stmt->bindValue() |
| Izvedba | 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 brisanje razdeljeno na dve datoteki. Datoteka 08_brisi1.php izpiše vse knjige in pri vsakem zapisu pripravi obrazec za brisanje s skritim id in csrf_token. Ob oddaji obrazca se prikaže še potrditveno okno.
Datoteka 08_brisi2.php preveri, ali je bil zahtevek poslan z metodo POST, ali je CSRF žeton veljaven in ali je identifikator zapisa pravilno podan. Nato z uporabo pripravljenega stavka PDO izvede ukaz DELETE FROM knjige WHERE ID_knjige = :id.
Po uspešnem brisanju aplikacija uporabniku izpiše potrditveno sporočilo in ponovno prikaže posodobljen seznam vseh knjig.
08_brisi1.php08_brisi2.phpNavodila za izdelavo aplikacije Knjige
- Najprej izpišemo seznam vseh zapisov, ki jih lahko brišemo.
- Pri vsakem zapisu pripravimo obrazec s skritim
ID_knjige. - V obrazec dodamo tudi CSRF žeton za zaščito.
- Pred brisanjem uporabniku pokažemo potrditveno okno.
- Ob oddaji obrazca preverimo metodo
POST, veljavnost žetona in ID zapisa. - Za brisanje uporabimo pripravljen stavek DELETE.
- V pogoju
WHEREuporabimoID_knjige, da izbrišemo samo izbrani zapis. - Po uspešnem brisanju prikažemo sporočilo in osvežen seznam zapisov.
Pozor: Brisanja zapisov ne izvajamo prek navadne povezave tipa 08_brisi2.php?id=5. Tak pristop je manj primeren, ker lahko že obisk povezave sproži spremembo podatkov.
Priporočila
- Za brisanje posameznega zapisa uporabi glavni ključ, na primer
ID_knjige. - Brisanje izvajaj prek obrazca z metodo
POST. - V obrazec dodaj skriti identifikator zapisa in CSRF žeton.
- Pred brisanjem uporabniku prikaži potrditveno vprašanje.
- Na strežniku vedno preveri metodo zahtevka, žeton in identifikator zapisa.
- Za ukaz
DELETEuporabi pripravljen stavek. - Po brisanju prikaži jasno sporočilo in osvežen seznam zapisov.
- Pri pomembnih podatkih razmisli o arhiviranju namesto trajnega brisanja.
Pogoste napake
- Manjkajoč pogoj
WHEREv ukazuDELETE. - Brisanje se izvaja prek navadne povezave z metodo
GET. - Neveljaven ali manjkajoč
idzapisa. - Obrazec nima CSRF zaščite.
- Na strežniku ni preverjeno, ali je bil zahtevek poslan z metodo
POST. - Namesto pripravljenega stavka se poizvedba sestavlja neposredno iz podatkov obrazca.
- Uporabniku ni prikazano potrditveno vprašanje pred brisanjem.
- Po brisanju ni preverjeno, ali je bil zapis res odstranjen.
Brisanje podatkov je treba načrtovati posebej previdno. Napačen pogoj, manjkajoč identifikator ali pomanjkljivo preverjanje zahtevka lahko povzroči izbris napačnega zapisa ali več zapisov hkrati.