Načrtovanje in razvoj spletnih aplikacij

Urejanje podatkov v podatkovni zbirki - UPDATE

Obstoječe zapise v tabeli spreminjamo z ukazom UPDATE. Uporabnik najprej izbere zapis, nato popravi podatke v obrazcu, na koncu pa spremembe shranimo v bazo.

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.

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

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

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.

Zato pri resničnih aplikacijah pogosto uporabimo:

  • preverjanje ID-ja zapisa,
  • validacijo vseh polj obrazca,
  • CSRF žeton za zaščito obrazca,
  • pripravljene SQL stavke za varen ukaz UPDATE.

Pomembnosti pri posodabljanju zapisov

  • pred urejanjem moramo poznati ID zapisa,
  • z ukazom SELECT najprej preberemo obstoječe podatke,
  • obrazec navadno predizpolnimo z obstoječimi vrednostmi,
  • za shranjevanje uporabimo ukaz UPDATE,
  • pogoj WHERE določi, kateri zapis bomo spremenili,
  • po uspešni spremembi uporabniku pokažemo posodobljen seznam zapisov.

📘Aplikacija Knjige

V priloženi aplikaciji Knjige je urejanje razdeljeno na tri datoteke. Prva prikaže seznam vseh knjig in povezavo za urejanje izbranega zapisa.

Druga datoteka iz URL parametra prebere id, preveri njegovo veljavnost, nato pa iz baze prebere en sam zapis in pripravi predizpolnjen obrazec za urejanje. Obrazec vsebuje tudi CSRF žeton in skriti ID zapisa.

Tretja datoteka sprejme podatke prek metode POST, preveri CSRF žeton, validira besedilna in številska polja ter nato izvede posodobitev z ukazom UPDATE knjige. Po uspešnem shranjevanju se izpiše š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

Navodila za izdelavo aplikacije Knjige

  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 in CSRF žeton.
  5. Ob oddaji obrazca preverimo veljavnost žetona in podatkov.
  6. Za posodobitev uporabimo pripravljen SQL stavek UPDATE.
  7. Po uspešni spremembi uporabniku prikažemo sporočilo in posodobljen seznam zapisov.

Pri učenju je smiselno poznati oba pristopa:

  • mysqli za klasično posodabljanje zapisov v tabeli,
  • PDO za sodobnejši in varen pristop z vezanimi parametri,
  • aplikacijski pristop, kjer so izbor zapisa, obrazec in shranjevanje razdeljeni na več korakov.