Načrtovanje in razvoj spletnih aplikacij

Kreiranje tabel podatkovne zbirke

Ko imamo podatkovno zbirko že pripravljeno, v njej ustvarimo tabele, v katere bomo shranjevali podatke. Tabele ustvarimo z ukazom CREATE TABLE. Pri tem določimo ime tabele, stolpce, podatkovne tipe in omejitve.

Ustvarjanje tabele je pomemben del priprave aplikacije. Tabela mora biti zasnovana tako, da podatke hrani pregledno, zanesljivo in v obliki, ki omogoča kasnejše poizvedovanje, urejanje in prikazovanje podatkov.

Pomni: Podatkovna zbirka je širši prostor za podatke, tabela pa je konkretna zbirka sorodnih zapisov. Tabela knjige naj zato hrani podatke o knjigah, ne pa tudi nepovezanih podatkov o drugih delih aplikacije.

Pri ustvarjanju tabele moramo biti povezani na izbrano podatkovno zbirko, saj tabela vedno nastane znotraj določene baze.

Vsebina strani

Osnovna pravila

Pri ustvarjanju tabele določimo njeno zgradbo. To pomeni, da določimo, katere stolpce bo tabela imela in kakšne vrednosti bo posamezen stolpec dovoljeval.

  • Ime tabele naj jasno pove, katere podatke tabela hrani.
  • Za vsak stolpec določimo ime in podatkovni tip.
  • Za obvezne podatke uporabimo omejitev NOT NULL.
  • Za enolično prepoznavanje zapisov uporabimo PRIMARY KEY.
  • Za samodejno številčenje identifikatorja pogosto uporabimo AUTO_INCREMENT.
  • Pri besedilnih podatkih je priporočljiva uporaba nabora znakov utf8mb4.
  • Če želimo preprečiti napako ob ponovnem zagonu namestitvenega skripta, uporabimo CREATE TABLE IF NOT EXISTS.

Pozor: Ukaz CREATE TABLE določi zgradbo tabele. Če je tabela slabo načrtovana, bo kasnejše popravljanje podatkovnega modela težje.

Kreiranje tabel v podatkovni zbirki

Osnovna sintaksa za kreiranje tabele je:

CREATE TABLE imeTabele (
    stolpec1 podatkovniTip,
    stolpec2 podatkovniTip,
    ...
);

Če želimo preprečiti napako, kadar tabela že obstaja, uporabimo:

CREATE TABLE IF NOT EXISTS imeTabele (
    stolpec1 podatkovniTip,
    stolpec2 podatkovniTip,
    ...
);

Pri ustvarjanju tabele moramo biti povezani na točno določeno podatkovno zbirko. Če se povežemo samo na strežnik, ne pa tudi na podatkovno zbirko, podatkovna baza ne ve, v kateri zbirki naj tabela nastane.

Pomni: Dodatek IF NOT EXISTS ne spremeni obstoječe tabele. Poskrbi samo za to, da ukaz ne sproži napake, če tabela že obstaja.

Zgradba tabele knjige

V učnem primeru ustvarimo tabelo knjige. Tabela hrani osnovne podatke o knjigah: avtorja, naslov, število strani, ceno in leto izida.

Stolpec Podatkovni tip Namen
ID_knjige INT, AUTO_INCREMENT, PRIMARY KEY Enolični identifikator knjige.
Priimek_avtorja VARCHAR(50) Priimek avtorja knjige.
Ime_avtorja VARCHAR(50) Ime avtorja knjige.
Naslov VARCHAR(150) Naslov knjige.
Strani INT Število strani.
Cena DECIMAL(10,2) Cena knjige z dvema decimalnima mestoma.
Leto YEAR Leto izida knjige.

Pozor: Za denarne vrednosti je primernejši tip DECIMAL kot FLOAT, ker omogoča natančnejši zapis decimalnih vrednosti.

Osnovni primer z mysqli

Spodnji zgled ustvari tabelo knjige v izbrani podatkovni zbirki, če ta še ne obstaja.

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

// SQL ukaz za kreiranje tabele
$sql = "CREATE TABLE IF NOT EXISTS knjige (
    ID_knjige INT NOT NULL AUTO_INCREMENT,
    Priimek_avtorja VARCHAR(50) NOT NULL,
    Ime_avtorja VARCHAR(50) NOT NULL,
    Naslov VARCHAR(150) NOT NULL,
    Strani INT NOT NULL,
    Cena DECIMAL(10,2) NOT NULL,
    Leto YEAR NOT NULL,
    PRIMARY KEY (ID_knjige)
)";

// Izvedba ukaza
if (mysqli_query($connection, $sql)) {
    echo 'Tabela knjige je pripravljena.';
} else {
    echo 'Napaka pri kreiranju tabele: ' . mysqli_error($connection);
}

// Zapiranje povezave
mysqli_close($connection);
?>

V primeru z mysqli ukaz za ustvarjanje tabele izvedemo s funkcijo mysqli_query(). Rezultat preverimo in po koncu dela povezavo zapremo s funkcijo mysqli_close().

Osnovni primer s PDO

Enako nalogo lahko izvedemo tudi z vmesnikom PDO. Tudi tu uporabimo ukaz CREATE TABLE IF NOT EXISTS. Pri povezavi določimo tudi nabor znakov utf8mb4.

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

    // SQL ukaz za kreiranje tabele
    $sql = "CREATE TABLE IF NOT EXISTS knjige (
        ID_knjige INT NOT NULL AUTO_INCREMENT,
        Priimek_avtorja VARCHAR(50) NOT NULL,
        Ime_avtorja VARCHAR(50) NOT NULL,
        Naslov VARCHAR(150) NOT NULL,
        Strani INT NOT NULL,
        Cena DECIMAL(10,2) NOT NULL,
        Leto YEAR NOT NULL,
        PRIMARY KEY (ID_knjige)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci";

    // Izvedba SQL ukaza
    $pdo->exec($sql);

    echo 'Tabela knjige je pripravljena.';
}
catch (PDOException $e) {
    echo 'Napaka pri kreiranju tabele: ' . $e->getMessage();
}
?>

Pri PDO ukaz, ki ne vrača rezultatne tabele, izvedemo z metodo exec(). Napake lahko obravnavamo z blokoma try in catch.

Primerjava pristopov mysqli in PDO

Oba pristopa lahko ustvarita tabelo, razlikujeta pa se v zapisu, obravnavi napak in prenosljivosti kode.

Lastnost mysqli PDO
Povezava do baze mysqli_connect() new PDO()
Izvedba ukaza za ustvarjanje tabele mysqli_query() $pdo->exec()
Obravnava napak Preverjanje rezultata in uporaba funkcij za napake. Pogosto z izjemami try in catch.
Nabor znakov Nastavimo pri povezavi ali po povezavi. Pogosto ga dodamo v povezovalni niz, na primer charset=utf8mb4.
Primernost za aplikacijo Knjige Možna uporaba. Primeren pristop, ker aplikacija uporablja PDO.

Pri aplikaciji Knjige je smiselno uporabljati PDO, ker so povezava, obravnava napak in nadaljnji koraki aplikacije zasnovani v tem slogu.

Aplikacija Knjige

📘Aplikacija Knjige

V priloženi aplikaciji Knjige je v datoteki 03_kreiranjeTB.php prikazano kreiranje tabele knjige. Uporablja se obstoječa povezava PDO iz konfiguracije aplikacije, tabela pa se ustvari le, če še ne obstaja.

Stran nato ločeno prikaže uspešnost povezave s podatkovno zbirko ter stanje tabele. To je dober zgled pregledne namestitvene strani, kjer je uporabniku jasno prikazano, kateri korak priprave aplikacije je bil izveden.

Primer: aplikacija Knjige – 03_kreiranjeTB.php
  1. Najprej ustvarimo ali izberemo podatkovno zbirko.
  2. Nato vzpostavimo povezavo na izbrano bazo.
  3. Pripravimo ukaz CREATE TABLE IF NOT EXISTS.
  4. Določimo stolpce, podatkovne tipe in glavni ključ.
  5. Za tabelo knjige določimo stolpce za avtorja, naslov, strani, ceno in leto.
  6. Ukaz izvedemo in preverimo, ali je tabela uspešno pripravljena.
  7. V aplikaciji Knjige je to izvedeno z uporabo obstoječe povezave PDO iz konfiguracije.

Pozor: Namestitvene skripte za ustvarjanje tabel naj bodo uporabljene nadzorovano. Po končani namestitvi jih v javni aplikaciji ne puščamo dostopnih brez zaščite.

Priporočila

  • Pred ustvarjanjem tabele preveri, ali je podatkovna zbirka že ustvarjena.
  • Pri povezavi navedi ime podatkovne zbirke, v kateri naj tabela nastane.
  • Za ponovljivo namestitev uporabi CREATE TABLE IF NOT EXISTS.
  • Vsaki tabeli določi jasen glavni ključ, na primer ID_knjige.
  • Za obvezne podatke uporabi NOT NULL.
  • Za denarne vrednosti uporabi DECIMAL.
  • Pri besedilnih podatkih uporabi nabor znakov utf8mb4.
  • V aplikaciji uporabljaj enoten pristop, na primer PDO.

Pogoste napake

  • Poskus ustvarjanja tabele brez povezave na izbrano podatkovno zbirko.
  • Manjkajoč ukaz IF NOT EXISTS, zato se pri ponovni izvedbi pojavi napaka.
  • Ustvarjanje tabele brez glavnega ključa.
  • Neustrezno izbran podatkovni tip, na primer FLOAT za ceno.
  • Manjkajoča omejitev NOT NULL pri obveznih stolpcih.
  • Manjkajoče vejice med definicijami stolpcev.
  • Neustrezen nabor znakov za besedilne podatke.
  • Namestitvena skripta se izvaja ob vsakem obisku strani, čeprav bi morala biti ločen korak.

Ustvarjanje tabel je poseg v zgradbo podatkovne baze. Zato naj bo ta korak ločen od običajnega delovanja aplikacije in izveden samo takrat, ko pripravljamo ali posodabljamo podatkovno zbirko.