Dynamický web
| Název školy | Vyšší odborná škola obalové techniky a Střední škola, Štětí, příspěvková organizace | ||
| Adresa školky | Kostelní 134, 411 08 Štětí | ||
| IČ | 46773509 | ||
| Název operačního programu | OP Vzdělávání pro konkurenceschopnost | ||
| Registrační číslo | CZ.1.07/1.5.00/34.1006 | ||
| Označení vzdělávacího materiálu | |||
| Název tématické oblasti (sady) | Programování | ||
| Název materiálu | PHP - výběr z databáze | ||
| Anotace | |||
| Autor | Jazyk | ||
| Očekávaný výstup | |||
| Klíčová slova | |||
| Druh výukového zdroje | Věková skupina žáků | ||
| Typ interakce | Ročník | ||
| Speciální vzdělávací potřeby | žádné | ||
| Zhotoveno, (datum/období) | Celková velikost | ||
Obsah
Následuje série témat, kde probereme klasické CRUD operace nad databází. Obecně je CRUD zkratka pro Create, Read, Update, Delete, což v přenesení do SQL znamená INSERT, SELECT, UPDATE, DELETE dotazy.
Začneme dotazy typu SELECT, protože je pro nás nyní jednodušší nejprve vytvořit databázi a nějaká data přímo v některém z programů pro práci s databází (phpMyAdmin nebo Adminer).
Příprava
Vytvořme si tedy databázi lednička, do které naimportujeme několik záznamů.
CREATE TABLE IF NOT EXISTS `lednicka` ( `id` INT(11) NOT NULL, `polozka` VARCHAR(128) NOT NULL, `datum` datetime NOT NULL ); INSERT INTO `lednicka` (`polozka`, `datum`) VALUES ('Mléko', NOW()), ('Máslo', NOW()), ('Salám', NOW()), ('Sirup', NOW()), ('Kečup', NOW());
U všech záznamů bude sice stejné datum i čas, ale prostě jsme zrovna donesli nákup domů a dali do ledničky ...
Pro další postup je nezbytné mít nastavení připojení k databázi (vizte předchozí studijní text).
Provedení dotazu
Třída mysqli obsahuje metodu query(), která se postará o přeposlání dotazu na server a příjem odpovědi.
<?php require 'config.php'; $my = new mysqli($cfg->host, $cfg->user, $cfg->pass, $cfg->db); $res = $my->query("SELECT * FROM `lednicka`");
Výsledek je nyní uložen v proměnné $res.
Zatím ale nevíme, co přesně je tím výsledkem.
Je proto vhodné to nejprve zjistit.
Zpracování odpovědi ze serveru
Proměnná $res obsahuje buď false v případě, že se něco nepovedlo.
U dotazu typu SELECT vrací speciální objekt (instanci třídy) s názvem mysqli_result.
U jiných dotazů vrací v případě úspěchu true.
Nám by tedy prozatím pomohlo zjistit, zda-li proměnná $res obsahuje hodnotu, jež lze označit za true (později si ukážeme operátor instanceof, případně typové porovnání ===).
Vzpomeňte, že v PHP je true cokoli, co není false, 0, "" nebo null.
<?php require 'config.php'; $my = new mysqli($cfg->host, $cfg->user, $cfg->pass, $cfg->db); $res = $my->query("SELECT * FROM `lednicka`"); if ($res) { // ... následuje výpis výsledku dotazu } else { echo $my->error; }
Všimněte si, že v bloku else se vypisuje případné znění chyby, kterou vrátil databázový server.
Blok else se provede pochopitelně pouze v případě, že hodnota $res bude rovna false.
Tip: Vyzkoušejte si, co se stane, když třeba zkomolíte dotaz postupně na různých místech, např. překlep ve slově SELECT, pak lednicka.
Výpis výsledku dotazu
Nyní můžeme přistoupit k výpisu dat z tabulky lednicka.
Víme, že metoda query() nám vrátila další objekt mysqli_result.
Ten nabízí další metody, např. fetch_object(), která vrací hodnoty z následujícího řádku výsledku dotazu.
Jakmile tedy zavoláme metodu fetch_object(), vrátí nám další řádek se sloupci a v pořadí, který vrací dotaz.
(Vyzkoušejte, co vrátí dotaz SELECT * FROM `lednicka`, když jej spustíte v nějakém SQL klientovi)
Metoda fetch_object() může ovšem vrátit i false, a to v případě, že ve výsledku dotazu již další záznam není (případně ani nebyl).
A jelikož my nevíme, kolik těch záznamů tam může být (museli bychom zjistit jiným dotazem), musíme se opakovaně ptát (volat metodu fetch_object().
Tím jak se ptáme, tím nám metoda vrací další a další řádky, dokud nevrátí false.
A pro toto chování se náramně hodí pro cyklus typu while.
<?php require 'config.php'; $my = new mysqli($cfg->host, $cfg->user, $cfg->pass, $cfg->db); $res = $my->query("SELECT * FROM `lednicka`"); if ($res) { while ($data = $res->fetch_object()) { echo $data->polozka . '<br />'; } } else { echo $my->error; }
Pokud metoda fetch_object() zrovna nevrátí false, tak vrátí tzv. standardní objekt (stdClass), který už jste mohli vidět v našem souboru config.php.
Tento objekt se uloží do proměnné $data a my si pak můžeme vypsat příkazem echo jednotlivé hodnoty sloupců.
V příkladu výše se vypisuje pouze sloupec polozka.

