Načrtovanje in razvoj spletnih aplikacij

Urejanje podatkov v podatkovni zbirki - UPDATE

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 SET navedemo stolpce in njihove nove vrednosti.
  • V delu WHERE določ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:

  1. izpišemo seznam zapisov,
  2. izberemo zapis za urejanje,
  3. 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.

Primer: aplikacija Knjige – 07_uredi1.php
Primer: aplikacija Knjige – 07_uredi2.php
Primer: aplikacija Knjige – 07_uredi3.php
  1. Najprej izpišemo seznam vseh zapisov, ki jih lahko urejamo.
  2. Ob kliku na povezavo prenesemo id izbranega zapisa na stran za urejanje.
  3. Iz baze preberemo en sam zapis in z njegovimi podatki predizpolnimo obrazec.
  4. V obrazec dodamo skriti ID_knjige in CSRF žeton.
  5. Ob oddaji obrazca preverimo veljavnost žetona in podatkov.
  6. Za posodobitev uporabimo pripravljen stavek UPDATE.
  7. V pogoju WHERE uporabimo ID_knjige, da posodobimo pravi zapis.
  8. 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 id obstaja.
  • 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 UPDATE vedno omeji z ustreznim pogojem WHERE.
  • Po posodobitvi prikaži jasno sporočilo o uspehu ali napaki.

Pogoste napake

  • Manjkajoč pogoj WHERE v ukazu UPDATE.
  • Neveljaven ali manjkajoč id zapisa 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.