Vlastní komunikace z hlediska skriptu PHP vypadá následovně:
- připojení k databázovému serveru MySQL a výběr databáze
- zaslání příkazů a převzetí výsledných dat (či aktualizace těchto dat) z databázového serveru MySQL
- odpojení se od databázového serveru MySQL
Než tyto tři kroky provedeme, měli bychom znát několik základních funkcí PHP, kterými „ovládáme“ databázi. Tyto funkce používáme za pomoci ovladačů. Nejčastější typy ovladačů:
- mysql (pouze pro verze PHP 5.5 a nižší, zastaralé a již se nedoporučuje používat)
- mysqli (MySQL Improved, parametry se do dotazů předávají velmi nepohodlně)
- PDO (PHP Database Objects, jedná se o nejnovější a velmi kvalitní objektový ovladač, který se jednoduše používá a podporuje kromě MySQL ještě několik databází.
- a další
Funkcím, které začínají výrazem mysql, je již v PHP lepší se úplně vyhnout. Pro PHP do verze 5.4 se mohlo používat funkce MySQL. Od vyšších verzí PHP je nutné používat funkci MySQLi nebo PDO_MySQL.
Více informací najdete např. v tomto článku (odkaz na web http://jecas.cz)
Několik základních příkazů pro práci s databází:
- mysqli_connect – otevírá spojení se serverem MySQL
- mysqli_select_db – vybíra MySQL databázi
- mysqli_query – posíla MySQL příkaz
- mysqli_num_rows – vrací počet řádků výsledku příkazu
- mysqli_affected_rows – vrací počet řádků, které byly ovlivněny poslední operaci
- mysqli_fetch_array – zpracovává jeden řádek výsledku příkazu, vrací asociativní pole, číselné pole či oboje
- mysqli_fetch_row – zpracovává jeden řádek výsledku příkazu, vrací číselné pole
- mysqli_fetch_assoc – zpracovává jeden řádek výsledku příkazu, vrací asociativní pole
- mysqli_unbuffered_query – posílá MySQL příkaz bez automatického zpracování výsledku a bez ukládání do vyrovnávací paměti
- mysqli_error – vrací chybný řádek posledního MySQL příkazu
- mysqli_change_user – mění uživatele pro určité připojení
- mysqli_free_result – uvolňuje paměť od výsledku příkazu
- mysqli_result – vrací data výsledku příkazu
- mysqli_fetch_object – zpracovává jeden řádek výsledku příkazu a vrací objekt
- mysqli_client_encoding – vrací kódování spojení
- mysqli_close – ukončuje spojení s MySQL serverem
- mysqli_pconnect – vytvoří trvalé připojení se serverem MySQL
- mysqli_create_db – vytvoří MySQL databázi
- mysqli_db_name – vrací název databáze
- mysqli_db_query – přepíná se na uvedenou databázi a posílá příkaz
- mysqli_field_len – vrací délku pole
- mysqli_get_host_info – vrací informaci o MySQL připojení
- mysqli_get_client_info – vrací informaci o MySQL uživateli
- mysqli_field_flags – vrací atributy uvedeného pole
- mysqli_drop_db – smaže MySQL databázi
Připojení k databázovému serveru MySQL a výběr databáze
Pro připojení k databázovému serveru MySQL slouží funkce mysqli_connect. Často se doplňuje o kontrolu, zda se připojení podařilo. Dále se provádí samotné dotazy do databáze a nasleduje odpojení, i když to PHP provede většinou samo i bez našeho přičinění. Patří to ale ke slušnému stylu:
<?php //Zadání jednotlivých údajů potřebných pro připojení do databáze: $dbhost = 'server.xy'; //server, kde se nachází databáze (často bývá localhost) $dbname = 'databaze'; //jméno databáze $dbuser = 'uzivatel'; //uživatelské jméno $dbpass = 'heslo'; //heslo //Vytvoření připojení: $spojeni = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname); //Kontrola připojení s případnou hláškou if (!$spojeni) { echo 'Spojení s mysql serverem se nepodařilo navázat.<br>'; } else { echo 'Spojení s mysql serverem bylo úspěšně navázáno.<br>'; //Následuje nastavení kódování a následná práce s daty mysqli_set_charset($spojeni, "utf8"); //Odpojení od databáze s kontrolou //Odpojení je možné až po skončení všech skriptů, které čerpají data z databáze $zavreni = mysqli_close($spojeni); if(!$zavreni) { echo 'Spojení s mysql serverem se nepodařilo ukončit.'; } else { echo 'Spojení s mysql serverem se podařilo ukončit.'; } } ?>
Tento zdrojový kód můžete mít přímo v souboru s jakýmkoliv dalším skriptem nebo bývá často jako samostatný soubor, např. db.php. Pokud se bude jednat o samostatný soubor, musíte vynechat „Odpojení od databáze“, protože jinak nebude možné s databází cokoliv dělat. Soubor db.php tedy může vypadat např. takto:
<?php //Zadání jednotlivých údajů potřebných pro připojení do databáze: $dbhost = 'server.xy'; //server, kde se nachází databáze (často bývá localhost) $dbname = 'databaze'; //jméno databáze $dbuser = 'uzivatel'; //uživatelské jméno $dbpass = 'heslo'; //heslo //Vytvoření připojení: $spojeni = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname); //Kontrola připojení s případnou hláškou if (!$spojeni) { echo 'Spojení s mysql serverem se nepodařilo navázat.<br>'; } //Stav, kdy se podaří navázat spojení s databází již nevypisujeme //Následuje nastavení kódování a následná práce s daty mysqli_set_charset($spojeni, "utf8"); ?>
Tento soubor (obvykle s názvem db.php, config.php, admin-config.php configuration.php apod….) pak bývá součástí dalších souborů, kteří jej mají vložen např. přes příkaz include nebo require. Ukončení spojení s databází pak bývá právě tam.
Zaslání příkazů a převzetí výsledných dat
Výpis dat z databáze se prování nejčastěji pomocí příkazu jazyka SQL, což je příkaz SELECT Jeho základní struktura je tato:
- SELECT – seznam požadovaných položek
- FROM seznam tabulek
- WHERE – podmínka
- GROUP BY – seznam položek
- HAVING – skupinová podmínka
- ORDER BY – třídění;
Následuje výběr tabulky z databáze. V našem příkladu to bude tabulka „knihy“. V minulé kapitole byla vytvořena a následně smazána, proto si ji musíte vytvořit znovu:
create table knihy ( CisloKnihy integer not null primary key, NazevKnihy varchar(60) not null, Autor varchar(60) not null )
Dále ještě znovu vložíme 3 knihy:
insert into knihy values (1, 'Malý Bobeš','J.V.Pleva'); insert into knihy values (2, 'R.U.R.','Karel Čapek'); insert into knihy values (3, 'Bylo nás pět','Karel Poláček');
Výběr tabulky provedeme funkcí mysqli_query např. takto:
$vyber_tabulky = mysqli_query("SELECT * FROM knihy");
Abychom výsledná data skutečně viděli, je třeba, abychom byli připojeni na databázi a aby data ve volané tabulce existovaly.
Dále si necháme vypsat data z této tabulky a to funkcí mysqli_fetch_array. Cyklus WHILE obsahuje nově vzniklou proměnnou $vysledek, která pak postupně načítá data do polí s určitým názvem. Název pole odpovídá názvům sloupců z tabulky v databázi.
<?php // Krok 1: připojení do databáze externím souborem include 'db.php'; // Krok 2: Napojení na konkrétní tabulku včetně kontroly $vyber_tabulky = mysqli_query($spojeni, "SELECT * FROM knihy"); if(!$vyber_tabulky) { echo 'Dotaz vykazuje chybu.<br>'; } else { // Krok 3: Pokud je vše v pořádku, zpracuje se dotaz a vypíše // Je použit cyklus while, který vypisuje data tolikrát, kolik jich v tabulce je while($radek = mysqli_fetch_array($vyber_tabulky)) { echo "Číslo knihy: ".$radek["CisloKnihy"]."<br>". "Název knihy: ".$radek["NazevKnihy"]."<br>". "Autor: ".$radek["Autor"]."<br><hr>"; } } // Krok 4: Odpojení od databáze $zavreni = mysqli_close($spojeni); if(!$zavreni) { echo 'Spojení s mysql serverem se nepodařilo ukončit.'; } ?>
Informaci o zdárném ukončení spojení s databází již nevypisuje. Návštěvníky webu by tak zbytečně obtěžovala.
Pokud chceme seřadit vypsané záznamy podle nějakého kritéria (v tomto případě podle čísel knih od největšího po nejmenší), přidáme k příkazu SELECT následující:
$dotaz = mysqli_query("SELECT * FROM knihy ORDER BY CisloKnihy DESC");
Dále můžeme vypsat např. počet záznamů v tabulce funkcí mysql_num_rows:
$pocet = mysqli_num_rows($dotaz); echo '<br>Celkový počet záznamů v tabulce je: '.$pocet;
Kompletní zdrojový kód:
<?php // Krok 1: připojení do databáze externím souborem include 'db.php'; // Krok 2: Napojení na konkrétní tabulku včetně kontroly $vyber_tabulky = mysqli_query($spojeni, "SELECT * FROM knihy ORDER BY CisloKnihy DESC"); if(!$vyber_tabulky) { echo 'Dotaz vykazuje chybu.<br>'; } else { echo 'Dotaz byl úspěšně vykonán.<br>'; // Krok 3: Pokud je vše v pořádku, zpracuje se dotaz a vypíše // Je použit cyklus while, který vypisuje data tolikrát, kolik jich v tabulce je while($radek = mysqli_fetch_array($vyber_tabulky)) { echo "Číslo knihy: ".$radek["CisloKnihy"]."<br>". "Název knihy: ".$radek["NazevKnihy"]."<br>". "Autor: ".$radek["Autor"]."<br><hr>"; } // Výpis celkového počtu knih $pocet = mysqli_num_rows($vyber_tabulky); echo '<h2>Celkový počet záznamů v tabulce je: '.$pocet."</h2>"; } // Krok 4: Odpojení od databáze $zavreni = mysqli_close($spojeni); if(!$zavreni) { echo 'Spojení s mysql serverem se nepodařilo ukončit.'; } ?>
SQL příkazy za pomoci ovladače PDO
Protože ovladač mysqli přináší určitá bezpečnostní rizika (především SQL injection), je někdy vhodnější používat ovladač PDO. Zdrojový kód pro vložení dat (v tomto případě nové knihy č. 4) by pak vypadal např. takto:
<?php $dbhost = "server.xy"; $dbname = "databaze"; $dbuser = "uzivatel"; $dbpass = "heslo"; try { $conn = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass); // set the PDO error mode to exception $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $conn->exec("set names utf8"); $sql = "INSERT INTO knihy (CisloKnihy, NazevKnihy, Autor) VALUES ('4', 'Létající Čestmír', 'Karel Jarolím')"; // use exec() because no results are returned $conn->exec($sql); echo "Nová kniha byla vložena"; } catch(PDOException $e) { echo $sql . "<br>" . $e->getMessage(); }$conn = null; ?>
Jedná se o objektově orientované programování, které není součástí tohoto základního materiálu.
Zdroj – http://jecas.cz/pdo