dum | žák

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í
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

pdf icon
PHP - výběr z databáze

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.

  1. <?php
  2.  
  3. require 'config.php';
  4. $my = new mysqli($cfg->host, $cfg->user, $cfg->pass, $cfg->db);
  5. $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.

  1. <?php
  2.  
  3. require 'config.php';
  4. $my = new mysqli($cfg->host, $cfg->user, $cfg->pass, $cfg->db);
  5. $res = $my->query("SELECT * FROM `lednicka`");
  6. if ($res) {
  7. // ... následuje výpis výsledku dotazu
  8. }
  9. else {
  10. echo $my->error;
  11. }

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.

  1. <?php
  2.  
  3. require 'config.php';
  4. $my = new mysqli($cfg->host, $cfg->user, $cfg->pass, $cfg->db);
  5. $res = $my->query("SELECT * FROM `lednicka`");
  6. if ($res) {
  7. while ($data = $res->fetch_object()) {
  8. echo $data->polozka . '<br />';
  9. }
  10. }
  11. else {
  12. echo $my->error;
  13. }

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.