Načrtovanje in razvoj spletnih aplikacij

Povezava do podatkovne zbirke

PHP omogoča povezovanje s podatkovnimi bazami MySQL oziroma MariaDB. Pri sodobnem razvoju za to praviloma uporabljamo dva vmesnika: mysqli in PDO.

Oba vmesnika omogočata vzpostavitev povezave, izvajanje poizvedb, branje rezultatov in zapiranje povezave. Razlika je predvsem v načinu uporabe in v tem, da je mysqli namenjen predvsem delu z MySQL oziroma MariaDB, PDO pa omogoča enotnejši način dela z različnimi podatkovnimi bazami.

Pomni: V sodobnem PHP ne uporabljamo več starega vmesnika mysql. Za delo z MySQL oziroma MariaDB uporabljamo mysqli ali PDO.

Pri povezavi s podatkovno bazo potrebujemo podatke o strežniku, uporabniškem imenu, geslu in imenu podatkovne baze. Ti podatki so običajno zapisani v ločeni konfiguracijski datoteki.

Vsebina strani

Osnovna pravila

Pri delu s podatkovno bazo v PHP je pomembno, da ločimo povezavo, poizvedbo, rezultat in izpis podatkov. Vsak korak ima svojo nalogo.

  • Povezava poveže PHP program s podatkovno bazo.
  • Poizvedba določi, katere podatke želimo pridobiti, vstaviti, spremeniti ali izbrisati.
  • Rezultat poizvedbe je treba pravilno prebrati in obdelati.
  • Podatkov, ki jih vnese uporabnik, ne vključujemo neposredno v poizvedbo.
  • Za uporabniške podatke uporabljamo pripravljene stavke.
  • Podatkov za povezavo ne izpisujemo uporabnikom in jih ne zapisujemo neposredno v javno dostopne datoteke.

Pozor: Primeri na tej strani prikazujejo osnovno povezovanje in branje podatkov. Kadar v poizvedbo vključujemo podatke uporabnika, je treba uporabiti pripravljene stavke, ne neposrednega sestavljanja poizvedbe.

Primerjava vmesnikov za delo z bazo

V starejših gradivih se lahko pojavi vmesnik mysql, vendar ga v sodobnem PHP ne uporabljamo več. Nadomestila sta ga mysqli in PDO.

Lastnost mysql mysqli PDO
Primernost za sodoben PHP Ne Da Da
Podpora za MySQL oziroma MariaDB Da Da Da
Podpora tudi za druge podatkovne baze Ne Ne Da
Postopkovni način Da Da Ne
Objektno usmerjeni način Ne Da Da
Pripravljeni stavki Ne Da Da

Pri sodobnem programiranju v PHP uporabljamo mysqli ali PDO. Vmesnik mysql je zastarel in ga v novi kodi ne uporabljamo.

Koraki pri uporabi podatkovne baze v PHP

Pri delu s podatkovno bazo v PHP običajno sledimo zaporedju korakov. Tako je program preglednejši in lažje poiščemo morebitne napake.

  1. Pripravimo podatke za povezavo.
  2. Vzpostavimo povezavo s podatkovno bazo.
  3. Preverimo, ali je bila povezava uspešna.
  4. Pripravimo in izvedemo poizvedbo.
  5. Preberemo rezultat poizvedbe.
  6. Podatke izpišemo ali obdelamo.
  7. Po potrebi sprostimo rezultat in zapremo povezavo.

Pomni: Povezava s podatkovno bazo je samo prvi korak. Po uspešni povezavi moramo pripraviti poizvedbo, jo izvesti in pravilno obdelati rezultat.

1. Vzpostavitev povezave z mysqli

Za povezavo s podatkovno bazo potrebujemo ime strežnika, uporabniško ime, geslo in ime podatkovne baze. Pri lokalnem razvoju je strežnik pogosto localhost.

<?php
$dbhost = "localhost";
$dbuser = "uporabnik";
$dbpass = "skritoGeslo";
$dbname = "podatkovnaZbirka";

$connection = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);

if (!$connection) {
    die("Povezava s podatkovno zbirko ni vzpostavljena.");
}
?>

Po koncu dela lahko povezavo zapremo z ukazom mysqli_close():

<?php
mysqli_close($connection);
?>

Pozor: Sporočila o napakah naj bodo pri učenju dovolj jasna, v javni aplikaciji pa ne smejo razkrivati gesel, imen uporabnikov, poti do datotek ali drugih občutljivih podatkov.

2. Uporaba konstant za povezavo

Podatke za povezavo lahko zapišemo v konstante. Tak zapis je preglednejši, posebej če iste podatke za povezavo uporabljamo na več mestih.

<?php
define("DB_SERVER", "localhost");
define("DB_USER", "uporabnik");
define("DB_PASS", "skritoGeslo");
define("DB_NAME", "podatkovnaZbirka");

$connection = mysqli_connect(DB_SERVER, DB_USER, DB_PASS, DB_NAME);

if (!$connection) {
    die("Povezava s podatkovno zbirko ni vzpostavljena.");
}
?>

V večjih projektih so podatki za povezavo pogosto shranjeni v ločeni konfiguracijski datoteki, ki jo vključimo samo tam, kjer jo potrebujemo.

3. Primer poizvedbe z mysqli

Po uspešni povezavi lahko izvedemo poizvedbo in preberemo rezultate. V naslednjem primeru iz tabele dijaki preberemo stolpca ime in priimek.

<?php
$sql = "SELECT ime, priimek FROM dijaki";
$result = mysqli_query($connection, $sql);

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

Funkcija mysqli_query() izvede poizvedbo, funkcija mysqli_fetch_assoc() pa vrne vrstico rezultata kot asociativno polje. Imena stolpcev uporabimo kot ključe polja.

Pomni: Pri branju rezultatov iz poizvedbe se pogosto uporablja zanka while, ker rezultat lahko vsebuje več vrstic.

4. Primer povezave s PDO

PDO je primeren, kadar želimo objektni pristop in enotnejši način dela z različnimi podatkovnimi bazami. Pri povezavi z MySQL v povezovalnem nizu določimo tudi nabor znakov utf8mb4.

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

Tudi pri PDO je priporočljivo uporabljati pripravljene stavke, posebej kadar poizvedba vsebuje podatke uporabnika.

Primerjava postopkovnega in objektnega načina pri mysqli

mysqli omogoča postopkovni in objektni način zapisa. Oba lahko opravita enake naloge, pomembno pa je, da v projektu zapis uporabljamo dosledno.

Opis Postopkovno Objektno
Povezava do baze mysqli_connect() new mysqli()
Številka napake pri povezavi mysqli_connect_errno() $mysqli->connect_errno
Opis napake pri povezavi mysqli_connect_error() $mysqli->connect_error
Poizvedba mysqli_query() $mysqli->query()
Vračanje asociativnega polja mysqli_fetch_assoc() $result->fetch_assoc()
Zapiranje povezave mysqli_close() $mysqli->close()

mysqli je primeren, kadar delamo samo z MySQL ali MariaDB. PDO pa je dobra izbira, kadar želimo enoten način dela z več vrstami podatkovnih baz.

Priporočila

  • Za novo kodo uporabljaj mysqli ali PDO, ne starega vmesnika mysql.
  • Podatke za povezavo hrani v ločeni konfiguracijski datoteki.
  • Pri povezavi določi nabor znakov utf8mb4, kadar je to mogoče.
  • Pri uporabniških vnosih uporabljaj pripravljene stavke.
  • V projektu uporabljaj enoten slog: postopkovni mysqli, objektni mysqli ali PDO.
  • Napake obravnavaj nadzorovano in uporabnikom ne razkrivaj občutljivih podatkov.

Pogoste napake

  • Uporaba zastarelega vmesnika mysql.
  • Mešanje postopkovnega in objektnega načina v isti kodi brez jasnega razloga.
  • Napačno zapisani podatki za povezavo s podatkovno bazo.
  • Manjkajoče preverjanje, ali je povezava uspela.
  • Neposredno vključevanje uporabniških podatkov v poizvedbo.
  • Izpis podrobnih tehničnih napak uporabnikom javne aplikacije.
  • Neustrezno nastavljen nabor znakov, zaradi česar se šumniki lahko prikažejo napačno.

Pozor: Osnovni primeri z mysqli_query() so primerni za prikaz branja podatkov. Pri poizvedbah, ki vsebujejo podatke uporabnika, je treba uporabiti pripravljene stavke, saj neposredno sestavljanje poizvedb ni varno.