LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> PHP (38) - Dolujeme data z MySQL

Jak vybrat data z MySQL a hotová aplikace na vyhledávání obcí dle PSČ

16.8.2004 15:00 | Petr Zajíc | Články autora | přečteno 150012×

Jádrem každé databázové aplikace je čtení dat z databáze. My si dnes ukážeme, jak číst data z MySQL pomocí PHP. A protože suché teorie je v tomto seriálu až dost, bude to rovnou hotová aplikace na vyhledávání obce pomocí PSČ.

SQL a výběrové dotazy

V MySQL, ostatně jako v každé jiné databázi obsahující jazyk SQL se data z databáze vybírají pomocí příkazu SELECT. Je to příkaz nesmírně mocný. Jeho nejjednodušší forma je:

SELECT * FROM [název tabulky]

a dlužno dodat, že může být daleko složitější. Pokud chcete důkladně postrašit, můžete se podívat na kompletní formu tohoto příkazu do dokumentace. Většinou se budeme snažit používat příkaz SELECT v co nejjednodušší syntaxi, protože cílem našeho seriálu není naučit se SQL, nýbrž PHP. Příkaz SELECT umí data nejen vybrat, ale umí je pro naše pohodlí rovněž například vyfiltrovat, seřadit nebo seskupit. V naprosté většině skriptů tedy budeme psát SELECT nějak takto:

SELECT [seznam polí] FROM [název tabulky nebo tabulek]
WHERE [podmínka] GROUP BY [seskupení] ORDER BY [seřazení]

Příkaz SELECT patří přesně mezi ty věci, které se naučíte neustálým používáním. Takže se pojďme rovnou podívat, jak se takový SELECT zpracuje prostředky jazyka PHP.

MySQL, SELECT a PHP

Možná budete mít pocit, že už jste to někde slyšeli, a bude to pravda. Bylo to totiž řečeno v předchozím díle - PHP používá na zadávání příkazu SELECT databázi svoji funkci mysql_query. Což je úplně stejné, jako v případě příkazu CREATE TABLE. A jak uvidíme, podobné to bude i s ostatními příkazy pro MySQL. S jedním podstatným rozdílem, a to tím, že: V PŘÍPADĚ, ŽE mysql_query OBSAHUJE PŘÍKAZ SELECT, vrátí databáze tzv. SADU ZÁZNAMŮ, kterou asi budeme chtít ZPRACOVAT.

Možná si z minula vzpomenete, že mysql_query vrací false v případě neúspěchu. Teď to doplním - v případě, že mysql_query obsahuje příkaz SELECT a nedojde k chybě, vrací mysql_query tzv. identifikátor výsledku. A ten nám umožní výslednou sadu záznamů zpracovat pomocí PHP. Příklad uvedu za chvíli.

Pozn.: Pokud mysql_query která má vrátit nějaké záznamy z libovolného důvodu selže, vrátí samozřejmě také hodnotu false.

Pozn. 2: Pokud je dotaz select napsaný správně, ale vrátí nula záznamů, nepovažuje se to za chybu.

Asi bude nejlepší podívat se na nějaký příklad, a proto tady máme

Vyhledávání obcí pomocí PSČ

To může být zajímavé zpestření nějaké aplikace a navíc to je krásný příklad na SELECT. Na stránkách české pošty je k dispozici ke stažení datový soubor obsahující názvy všech obcí v ČR a jejich PSČ. Tento soubor jsem si stáhl, upravil a nahrál do MySQL. To znamená, že v MySQL máme nyní tabulku, která se jmenuje psc a obsahuje pole psc a obec. Čistě pro osvěžení paměti - tabulka vznikla pomocí následujícího příkazu SQL:

create table psc (obec varchar (60), psc int)

Pozn.: Tohle sem striktně vzato nepatří, ale asi se budete ptát, jak jsem tam ta data dostal. Bylo to takhle:

  1. Stáhl jsem si soubor ze stránek české pošty a zjistil jsem, že je ve formátu dbf.
  2. Otevřel jsem si jej v OpenOffice a uložil jako prostý text oddělený středníky.
  3. Vzniklý textový soubor jsem uploadoval na server, na němž běží MySQL.
  4. Spustil jsem SQL příkaz LOAD DATA INFILE, který textový soubor uložil do tabulky. Ještě o něm bude v našem seriálu řeč.

Celá aplikace bude obsahovat formulář pro zadání PSČ a po jeho odeslání bude vypisovat obec, která dané PSČ má. Pozor, jedno PSČ může mít více obcí, takže s tím budeme počítat. Tady je kód:

<?
  $BudemeZobrazovat
=true;
  if (!empty(
$_POST)) // tak už se odesílalo a musíme kontolovat
  
{
    if (
strlen($_POST["psc"])<>5 || !is_numeric($_POST["psc"]))
    {
      
// kontrolou jsme neprošli
      
echo "PSČ musí být pětimístné číslo";
    }
    else
    {
      
// kontolou jsme prošli
      
$BudemeZobrazovat=false;
      
// zde je include souboru s konstantami
      
mysql_connect(SQL_HOST, SQL_USERNAME, SQL_PASSWORD);
      
mysql_select_db(SQL_DBNAME);
      
$vysledek=mysql_query("select * from psc where psc=".$_POST["psc"]);
      
$radku=mysql_num_rows($vysledek);
      if (
$radku==0) echo "PSČ ".$_POST["psc"]." nemá, bohužel, žádná obec";
      else
      {
      echo
"PSČ ".$_POST["psc"]." má následujících $radku obcí:<BR>";
      while (
$zaznam=MySQL_Fetch_Array($vysledek)):
        echo
$zaznam["obec"]."<BR>\n";
      endwhile;
      };
    }
  }
if (
$BudemeZobrazovat):?>
  <form method="post" action="<?echo $_SERVER["PHP_SELF"]?>">
    PSČ: <input name="psc" value="<?echo $_POST["psc"]?>">
      <input type="Submit" name="odesli">
  </form>
<?endif;?>

Ukázat skript | Spustit skript

Z věcí, které nás zajímají v souvislosti s MySQL, si všimněte zejména řádku s mysql_query. Její výsledek je vrácen do proměnné $vysledek, která zjednodušeně řečeno zastupuje výslednou sadu záznamů. A máme tu dvě funkce, které jsou pro nás nové:

mysql_num_rows
Vrací počet řádků ve výsledné sadě záznamů. To se nám hodí, protože tím pádem budeme moci ošetřit situaci, kdy není vrácen žádný záznam a zařídit se podle toho.

mysql_fetch_array
Je poměrně často používaná funkce, která vrátí obsah jednoho řádku z výsledné sady záznamů jakožto asociativní pole. Když se zavolá opakovaně, vrátí další řádek sady. Jestliže řádky došly, vrátí false. Je tedy velmi jednoduché procházet sadou pomocí konstrukce while.

Pozn.: Pokud Vám není jasné, proč je formulář ve skriptu až na konci, podívejte se na díl seriálu o ověřování dat z formulářů. Protože to je důležité, dodám, že při podobné struktuře programu je ověřování dat z formulářů nezbytné. Kdybychom totiž proměnnou $_POST["psc"] neověřovali, může nám nějaký škodolibý návštěvník našich stránek do formuláře podstrčit něco, co MySQL pochopí jako jiný příkaz jazyka. Tento druh útoku se nazývá SQL injection.

Jak vidíme, je tedy poměrně snadné vybrat z databáze nějaké řádky. Příště si ukážeme na dvě úlohy, které s příkazem SELECT a PHP úzce souvisí - bude řeč o tom, jak prezentovat data ze sad záznamů prostřednictvím HTML tabulek a jak dlouhé sady záznamů stránkovat.

Verze pro tisk

pridej.cz

 

DISKUZE

mysql_fetch_array 8.12.2004 08:50 Chulda
L Re: mysql_fetch_array 13.12.2004 21:24 Petr Zajíc
mysql_num_rows 19.12.2005 17:01 Jan Vojíř
L Re: mysql_num_rows 7.1.2006 22:20 Milan Onderka
  L Re: mysql_num_rows 3.1.2008 18:35 Jiří Kantor
    L Re: mysql_num_rows 5.1.2008 12:41 Jiří Kantor
kde je chyba? 22.4.2007 02:29 Daniel Kolarcik
L Re: kde je chyba? 17.10.2008 14:36 Jarosalv Zháněl
  L Re: kde je chyba? 17.10.2008 23:02 Aleš Hakl
Pomoc 29.4.2011 16:50 Brano
Národní znaky 30.7.2017 11:12 Jaromir Obr




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

18.6.2018 0:43 /František Kučera

Červnový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 21. 6. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát na téma: F-Droid, aneb svobodný software do vašeho mobilu. Kromě toho budou k vidění i vývojové desky HiFive1 se svobodným/otevřeným čipem RISC-V.


Přidat komentář

23.5.2018 20:55 /Ondřej Čečák
Od pátku 25.5. proběhne na Fakultě informačních technologií ČVUT v Praze openSUSE Conference. Můžete se těšit na spostu zajímavých přednášek, workshopů a také na Release Party nového openSUSE leap 15.0. V na stejném místě proběhne v sobotu 26.5. i seminář o bezpečnosti CryptoFest.
Přidat komentář

20.5.2018 17:45 /Redakce Linuxsoft.cz
Ve čtvrtek 31. května 2018 připravuje webový magazín BusinessIT ve spolupráci s Best Online Média s.r.o. pátý ročník odborné konference Firemní informační systémy 2018. Akce proběhne v kongresovém centru Vavruška (palác Charitas), Karlovo náměstí 5, Praha 2 (u metra Karlovo náměstí) od 9:00 hod. dopoledne do cca 15 hod. odpoledne. Konference je zaměřena na efektivní využití firemních informačních systémů a na to, jak plně využít jejich potenciál. Podrobnější informace na webových stránkách konfrence.
Přidat komentář

14.5.2018 7:28 /František Kučera
Květnový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 17. 5. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát na téma: Audio – zvuk v GNU/Linuxu.
Přidat komentář

7.5.2018 16:20 /František Kučera
Na stránkách spolku OpenAlt vyšla fotoreportáž Pražské srazy 2017 dokumentující srazy za uplynulý rok. Květnový pražský sraz na téma audio se bude konat 17. 5. 2018 (místo a čas ještě upřesníme).
Přidat komentář

17.4.2018 0:46 /František Kučera
Dubnový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 4. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tématem tohoto srazu bude OpenStreetMap (OSM) aneb svobodné mapy.
Přidat komentář

16.3.2018 22:01 /František Kučera
Kulatý OpenAlt sraz v Praze oslavíme klasicky: u limonády a piva! Přijďte si posedět, dát si dobré jídlo a vybrat z mnoha piv do restaurace Kulový blesk, který najdete v centru Prahy nedaleko metra I. P. Pavlova na adrese Sokolská 13, Praha 2. Sraz se koná ve čtvrtek 22. března a začínáme v 18:00. Heslo: OpenAlt. Vezměte s sebou svoje hračky! Uvítáme, když si s sebou na sraz vezmete svoje oblíbené hračky. Jestli máte nějaký drobný projekt postavený na Arduinu, nějakou zajímavou elektronickou součástku, či třeba i pěkný úlovek z crowdfundingové akce, neváhejte. Oslníte ostatní a o zábavu bude postaráno.
Přidat komentář

13.2.2018 0:41 /František Kučera
Únorový pražský sraz OpenAltu se koná 15. 2. 2018 a tentokrát se vydáme na návštěvu do jednoho pražského datacentra. Sejdeme se v 17:50 v severovýchodní části nástupiště tramvajové zastávky Koh-I-Noor. Po exkurzi se přesuneme do restaurace U Pštrosa (Moskevská 49), kde probereme tradiční témata (svobodný software a hardware, DIY, CNC, SDR, 3D tisk…) a tentokrát bude k vidění i IoT brána od The Things Network.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

20.2.2018 18:48 / Ivan Majer
portal

20.2.2018 15:57 / Jan Havel
Jak využíváte služby cloudu v podnikání?

16.1.2018 1:08 / Ivan Pittner
verejna ip od o2 ubuntu

15.1.2018 17:26 / Mira Harvalik
Re: Jak udělat HTML/Javascript swiping gallery do mobilu?

30.12.2017 20:16 / Michal Knoll
odmocnina

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2018) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze