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
.