Načrtovanje in razvoj spletnih aplikacij

MySQL

MySQL je sistem za upravljanje relacijskih podatkovnih baz. Podatki so shranjeni v tabelah, tabele pa so sestavljene iz stolpcev in vrstic. Vsaka vrstica običajno predstavlja en zapis, stolpci pa določajo vrste podatkov, ki jih hranimo.

Za delo z MySQL uporabljamo jezik SQL. Z njim ustvarjamo podatkovne baze in tabele, vstavljamo podatke, jih spreminjamo, brišemo in iz njih pridobivamo izbrane informacije.

Pomni: MySQL skrbi za shranjevanje in urejanje podatkov, SQL pa je jezik, s katerim podatkovni bazi podamo navodila.

Logo MySQL

Logo MySQL

Osnovna pravila

Pri delu s podatkovno bazo je pomembno, da razumemo nekaj osnovnih pravil:

  • podatki so organizirani v tabele,
  • vsaka tabela ima stolpce, ki določajo vrsto podatkov,
  • vsaka vrstica v tabeli predstavlja en zapis,
  • za poizvedovanje in spreminjanje podatkov uporabljamo SQL ukaze,
  • v spletnih aplikacijah do podatkovne baze običajno dostopamo prek strežniškega jezika, na primer PHP.

Relacijska podatkovna baza omogoča, da podatke razdelimo v več smiselnih tabel. Tako se izognemo nepotrebnemu ponavljanju podatkov in lažje skrbimo za njihovo pravilnost.

Primerjava med MySQL, SQL in PHP

Pri izdelavi dinamične spletne strani imajo MySQL, SQL in PHP različne naloge.

Pojem Vloga pri spletni aplikaciji
MySQL Sistem za upravljanje podatkovne baze. Hrani podatke v tabelah in skrbi za njihovo urejanje.
SQL Jezik za delo s podatkovno bazo. Z njim pišemo ukaze, kot so SELECT, INSERT, UPDATE in DELETE.
PHP Strežniški programski jezik. Izvede povezavo s podatkovno bazo, pošlje SQL ukaz in obdela vrnjene podatke.

Pozor: MySQL in SQL nista isto. MySQL je podatkovni sistem, SQL pa je jezik, s katerim podatkovnemu sistemu pošiljamo ukaze.

Osnovni primer poizvedbe SQL

Stavek SELECT uporabimo, kadar želimo iz tabele pridobiti podatke. Naslednja poizvedba pridobi vse stolpce in vse zapise iz tabele uporabniki:

SELECT * FROM uporabniki;

Znak * pomeni, da želimo izpisati vse stolpce. Pri resničnih aplikacijah je pogosto bolje navesti samo tiste stolpce, ki jih res potrebujemo.

SELECT id, uporabnisko_ime, email
FROM uporabniki;

Pomni: SQL ukazi so pogosto zapisani z velikimi črkami, na primer SELECT in FROM. To ni obvezno, vendar je zapis preglednejši.

Primer poizvedbe s pogojem

Če želimo pridobiti samo določene zapise, uporabimo pogoj WHERE. V naslednjem primeru izberemo samo uporabnike, ki imajo v stolpcu nivo vrednost admin:

SELECT * 
FROM uporabniki
WHERE nivo = 'admin';

Pogoj WHERE je zelo pomemben tudi pri ukazih UPDATE in DELETE, saj določa, kateri zapisi se spremenijo ali izbrišejo.

Pozor: Pri ukazih UPDATE in DELETE lahko manjkajoč pogoj WHERE povzroči spremembo ali izbris vseh zapisov v tabeli.

PHP in MySQL

V spletnih aplikacijah podatkovne baze običajno ne uporabljamo neposredno, temveč prek programske kode. V PHP za povezavo z MySQL danes uporabljamo predvsem mysqli ali PDO.

Stare funkcije iz razširitve mysql, na primer mysql_query(), se v sodobnem PHP ne uporabljajo več. Nadomestila sta jih vmesnika mysqli in PDO, ki omogočata varnejše in preglednejše delo.

mysqli PDO
  • Namenjen je delu z MySQL oziroma MariaDB.
  • Omogoča postopkovni in objektni način zapisa.
  • Pogosto se uporablja pri začetnem učenju povezave PHP in MySQL.
  • Omogoča enoten način dela z različnimi podatkovnimi sistemi.
  • Uporablja objektni pristop.
  • Primeren je za aplikacije, pri katerih želimo večjo prenosljivost kode.

Primer z mysqli

V naslednjem primeru se PHP poveže s podatkovno bazo, izvede poizvedbo in izpiše uporabniška imena uporabnikov z nivojem admin:

<?php
$povezava = mysqli_connect("localhost", "uporabnik", "geslo", "moja_baza");

if (!$povezava) {
    die("Povezava ni uspela: " . mysqli_connect_error());
}

$sql = "SELECT uporabnisko_ime FROM uporabniki WHERE nivo = 'admin'";
$result = mysqli_query($povezava, $sql);

while ($vrstica = mysqli_fetch_assoc($result)) {
    echo $vrstica['uporabnisko_ime'] . "<br>";
}

mysqli_close($povezava);
?>

Primer s PDO

Enako nalogo lahko izvedemo tudi z vmesnikom PDO. Pri povezavi je smiselno določiti tudi nabor znakov utf8mb4, saj omogoča pravilen zapis širokega nabora znakov Unicode.

<?php
$pdo = new PDO(
    "mysql:host=localhost;dbname=moja_baza;charset=utf8mb4",
    "uporabnik",
    "geslo"
);

$sql = "SELECT uporabnisko_ime FROM uporabniki WHERE nivo = 'admin'";
$stmt = $pdo->query($sql);

while ($vrstica = $stmt->fetch(PDO::FETCH_ASSOC)) {
    echo $vrstica['uporabnisko_ime'] . "<br>";
}
?>

Pri novih projektih je priporočljivo uporabljati nabor znakov utf8mb4, ker omogoča shranjevanje širšega nabora znakov kot starejši zapis utf8 oziroma utf8mb3.

Pripravljeni stavki

Kadar so v SQL poizvedbo vključeni podatki uporabnika, je treba uporabiti pripravljene stavke. Pri pripravljenem stavku se SQL ukaz najprej pripravi, vrednosti pa se nato pošljejo ločeno kot parametri.

Primer pripravljenega stavka s PDO:

<?php
$pdo = new PDO(
    "mysql:host=localhost;dbname=moja_baza;charset=utf8mb4",
    "uporabnik",
    "geslo"
);

$sql = "SELECT uporabnisko_ime FROM uporabniki WHERE nivo = :nivo";
$stmt = $pdo->prepare($sql);
$stmt->execute(['nivo' => 'admin']);

while ($vrstica = $stmt->fetch(PDO::FETCH_ASSOC)) {
    echo $vrstica['uporabnisko_ime'] . "<br>";
}
?>

Pomni: Podatkov, ki jih vnese uporabnik, ne vključujemo neposredno v SQL stavek. Varnejši pristop je uporaba pripravljenih stavkov in parametrov.

Priporočila

  • Za dostop do MySQL v PHP uporabljaj mysqli ali PDO.
  • Pri novih projektih uporabi nabor znakov utf8mb4.
  • Pri poizvedbah z uporabniškimi podatki uporabi pripravljene stavke.
  • V poizvedbah izbiraj samo tiste stolpce, ki jih aplikacija res potrebuje.
  • Podatke za povezavo s podatkovno bazo hrani v ločeni konfiguracijski datoteki.
  • Napake obravnavaj nadzorovano in jih ne izpisuj neposredno uporabnikom aplikacije.

Pogoste napake

  • Zamenjevanje pojmov MySQL, SQL in PHP.
  • Uporaba zastarelih funkcij iz stare razširitve mysql.
  • Neposredno vključevanje uporabniških podatkov v SQL poizvedbo.
  • Uporaba znaka * tudi takrat, ko aplikacija potrebuje samo nekaj stolpcev.
  • Manjkajoč pogoj WHERE pri ukazih za spreminjanje ali brisanje podatkov.
  • Neustrezno nastavljen nabor znakov, zaradi česar se lahko posebni znaki prikažejo nepravilno.

Pri delu s podatkovno bazo je treba razlikovati med napakami v SQL stavku, napakami pri povezavi in napakami pri obdelavi rezultatov. Vsako vrsto napake je treba preveriti na ustreznem mestu v programu.