komunikace s databází v php

Profi programátoři používají pro komunikaci s databází samozřejmě výhradně objektově orientované příkazy. Já však nejsem „profi“ programátor, protože nemám už tolik času hrát si s kódem, takže musím jít cestou nejrychlejší a sice procedurální. Čas jsou peníze. Rychlá orientace v kódu umožňuje ušetřit hodně času. V následujícím příspěvku se pokusím shrnout nejpoužívanější příkazy pro komunikaci s databází tím nejjednodušším možným způsobem – tedy procedurálně.

Tvoříte-li mega weby s desítkami tisíc uživatelů denně, potom však raději používejte objektově orientované příkazy – jsou méně náročné na výkon serveru.

Připojení k databázi

Údaje pro připojení můžete nadefinovat takto:
define("DB_HOST", "url.vasehosuperhostingu.cz");

Povšimněte si, že je samozřejmostí používat mysqli_connect namísto mysql_connect. i značí improved a používá se vlastně již docela dost roků.

Databázové dotazy

mysqli_query()

První předávaný parametr této funkce je odkaz na databázi, druhým parametrem předáváme SQL příkaz. Pokud provádíme například jen UPDATE nebo smazání DELETE záznamu, žádný další příkaz nepotřebujeme spouštět. Avšak chceme-li získat data, musíme zpracovat návratové hodnoty, tzv. result set. K tomu slouží řada funkcí. Osobně nejčastěji používám mysqli_fetch_assoc().

mysqli_fetch_assoc()

Funkce vrací asociativní pole, tzn. v našem případě $row.
Jednotlivé prvky pole jsou asociovány s názvy sloupců v dané tabulce. V SQL příkazu SELECT jsme vybrali všechny sloupce zástupným znakem *. Stačí tedy vědět jaké jsou názvy sloupců a můžeme s nimi přímo pracovat jejich uvedením v hranaté závorce $row[‚id‘], $row[‚nazev‘], apod.

 

mysqli_fetch_row()

Někdy se může hodit načítání pomocí číselných indexů, zvláště chceme-li vykázat více hodin času stráveného kódováním (just kidding) anebo třeba pro načtení jednoho řádku.

mysqli_fetch_array()

Tato funkce ideální pro ty, kdo používají často jak číselné indexy, tak i spojení slovní.
$row[0] obsahuje stejnou hodnotu jako $row[‚id‘] – jde o ekvivalentní výrazy. Pokud byste chtěli vynutit používání pouze číselných indexů nebo slovních asociací, můžete tak učinit následujícím způsobem. V praxi jsem se však nesetkal s nutností něco takového činit.

mysqli_fetch_array($res, MYSQLI_NUM);//pracuje pouze s indexy
mysqli_fetch_array($res, MYSQLI_ASSOC);  // pracuje pouze s názvy sloupců
Jak už možná tušíte, první z výše uvedených příkazů je ekvivalentní příkazu mysli_fetch_row a druhý příkazu mysqli_fetch_assoc.
Standardně se data ukládají do pole tak jako v předchozím případě (viz mysqli_fetch_row)

anebo je lze příkazem list() načíst rovnou do proměnných

mysqli_affected_rows()

Tímto příkazem zjistíme počet ovlivněných řádků přechozím dotazem na databázi.

mysqli_num_rows()

Potřebujeme-li zjistit kolik záznamů vyhovilo dotazu, používá se většinou právě tato funkce.

mysqli_free_result()

Nebudete-li tento příkaz používat, zdánlivě se nic neděje. Avšak čím více dotazů probíhá při jednom načtení stránky, tím vyšší je potom zatížení serveru. Neuvolníte-li vždy result set tímto příkazem, může dojít k viditelnému zpomalení načítání stránek už při několika desítkách simultálně klikajících uživatelů.

 

Zabránění SQL Injection

Nejmenší riziko napadení databáze pomocí příkazu vloženého na vstup lze zajistit pomocí prepared statements.
Níže je příklad s INSERT.
Tajemné ‚si‘ znamená, že první očekávaný parametr je string, druhý integer. (Pro úplnost: pracovat lze také s double d, blob b.)

Prepared Statements – ukázky

Další příklad s prepared statement je obyčejný dotaz. Avšak v případě, kdy neposíláme do databáze žádná data, je riziko injection nulové, takže jde hlavně o zajištění efektivnější práce s databází (je rychlejší).

Získání záznamů s více parametry

Zápis více záznamů

Smazání záznamu