Hlavní navigace

Úvod do PHP s přihlédnutím k MySQL

Petr Hodan 7. 4. 2000

Vhodná kombinace PHP a MySQL na dostatečně výkonném serveru poskytuje hodně možností. Hitem poslední doby je dynamicky generovaný web. A jak jinak ho dělat, než spojením skriptovacího jazyka a databáze.

PHP je ještě docela mladý skriptovací jazyk, jeho vznik se datuje do konce roku 1994. Masového rozšíření dosáhl v letech následujících. Mezi jeho výhody patří jednoduchost. Pokud jste alespoň někdy viděli a psali jednoduché prográmky v jazyce podporujícím struktury (funkce – to hlavně, smyčky, podmínky…), nemělo by Vám činit problémy zvládnout PHP. Kdo by se chtěl o PHP zajímat poněkud hlouběji, má k dispozici nepřeberné množství příruček a návodů. Cílem článku není vyložit složitosti, ale spíš ukázat možnosti.

PHP skripty se píší přímo do HTML, uzavírají se mezi tagy „<?php“ a „?>“ (někdy „<%“ a „%>“ – záleží na konfiguraci). Web server podle nich pozná, že má tuto část kódu předat PHP modulu, který jej zpracuje a případně něco vrátí (a to web server pošle prohlížeči). Mějme nyní nainstalován PHP jako modul Apache, s podporou MySQL. Náš první skript bude vracet informace a možnosti nainstalovaného PHP modulu:

<html>
<body>

<?php
   phpinfo();
?>

</body>
</html>

Uložme tento soubor do našeho adresáře s webem (pravděpodobně „~/public_html“) a nazvěme ho index.php3. Spustíme browser a napíšeme naší URL. Objeví se stránka, která je generována samotným PHP. Na ní je výpis všech vlastností instalovaného PHP, něco o web serveru, MySQL serveru, a dokonce i o systému, na němž je PHP spuštěno.

Existuje víc možností, jak z HTML vyskočit do PHP. Způsoby jsou:

<? echo ("Tohle je nejjednodušší způsob\n"); ?>

<?php echo("Poněkud delší, ale vhodný pro XML dokumenty\n"); ?>

<script language="php">
    echo ("Některé editory nemají rádi předchozí
    varianty...(třeba M$ FrontPage)");
</script>

<% echo ("Nebo můžete používat ASP-čkové tagy"); %>

Jistě jste si už všimli, že příkaz echo(); vypisuje argument do HTML kódu. Je to nejčastěji používaný příkaz. Syntaxe příkazů je podobná s jazykem C a C++. Skládá se ze jména funkce (příkazu), za nímž jsou v závorce uvedeny proměnné, které funkci předáváme. Možná by ještě bylo vhodné zmínit, že proměnné jsou lokální a globální. Lokální proměnné jsou dostupné pouze ve funkcích, ve kterých jsou používány.

Změňme nyní náš index.php3 tak, aby vypisoval aktuální čas a datum a hezky nás přivítal na stránce. K tomu použijeme předdefinované funkce implementované v PHP a týkající se času:

<html>
<body>

<?php
   print (date("d m Y h:i:s"));
   print ("<br>");
   print ("<h2>Vítejte na mojí WWW stránce</h2>");
?>

</body>
</html>

Reloadněte si stránku a uvidíte, co to napsalo. Příkaz print funguje stejně jako příkaz echo. Jelikož je funkce date hodně často používána, a málokdo si zapamatuje tu správnou syntaxi pro svoje účely nejvhodnější, vytvoříme si nyní funkci moje_datum:

<?php

function moje_datum()
{    print (date("d m Y h:i:s"));
}
?>

Je to jednoduchá funkce, do níž nic nevstupuje a nic se nevrací, pouze vytiskne datum v našem formátu. Uložme funkci do souboru funkce.inc do adresáře ~/public_html/in­clude. V hlavním dokumentu (index.php3) se budeme na tuto funkci odvolávat. A aby interpret věděl, kde ji má hledat, řekneme mu to:

<html>
<body>
<?php

   require("include/funkce.inc");

   moje_datum();

   print ("<br>");
   print ("<h2>Vítejte na mojí WWW stránce</h2>");
?>
</body>
</html>

Výsledek je úplně stejný. Můžeme od této doby místo složitého vypisování „print (date(“d m Y h:i:s"));" psát jen „moje_datum();“. Ušetříte tím mnoho času a hlavně nebudete muset při požadavku na změnu formátu data a hodiny hledat třeba 10 000 výskytů, ale změníte jen funkci, která to zabezpečuje.

Stejný přístup lze zvolit, pokud máte na stránce sekce vyskytující se na všech stránkách (třeba na ROOTu jsou to tlačítka dole…). Jednoduše si vytvoříte jakousi „šablonu“ – kus HTML kódu nebo další PHP skript – a ten „vložíte“ na požadované místo. Ukážeme si to na ukázce. Každý HTML soubor by měl mít hlavičku. Ta usnadňuje vyhledávání a nese v sobě informace o dokumentu, autorovi, právech a jiné věci. Vypadá asi takto:

<head>
    <META name="description" lang="cs" content="">
    <META name="keywords" lang="cs" content="">
    <META name="GENERATOR" content="Emacs 20.4">
    <META name="resource-type" content="document">
    <META name="copyright" content="Content (c) 2000 nekdo_nekde">
    <META name="author" content="jmeno_autora">
    <META HTTP-EQUIV="Reply-to" CONTENT="mail na odpovedi">
    <META HTTP-EQUIV="Content-language" content="cs">
    <META HTTP-EQUIV="Cache-Control" CONTENT="Public">
    <META HTTP-Equiv="Content-Type" CONTENT="text/html;
    charset=iso-8859-2">
    <title>Nadpis stránky</title>
</head>

Takto vypadá hlavička HTML dokumentu. Dá se předpokládat, že všechny námi dynamicky generované stránky budou mít hlavičku stejnou. Nic nám nebrání v tom, aby jsme jí jednoduše vložili do každé stránky:

<html>
<?php
   include("include/head.html");
?>
<body>
<?php

   require("include/funkce.inc");

   moje_datum();

   print ("<br>");
   print ("<h2>Vítejte na mojí WWW stránce</h2>");
?>
</body>
</html>

Hlavička by měla být ještě před tagem BODY, což je dodrženo. Jen je potřeba samostatnou hlavičku uložit do souboru „~/public_html/in­clude/head.html“. Reloadněte stránku a podívejte se na zdroj HTML. Měla by se objevit hlavička přesně tak, jak jsme předpokládali.

A nyní už k samotné implementaci MySQL do PHP. Aby bylo možno využívat možností MySQL serveru, je nejdříve nutné se na něj napojit a vybrat požadovanou databázi. A pak se už můžeme serveru ptát a on nám bude (pokud bude moci) odpovídat. Jeho odpovědi zpracujeme a zhodnotíme. Nakonec se nesmíme zapomenout odpojit od serveru. Toto je obecný návod jak to dělat. V příkladu je to jednodušší. Napíšeme si nový index.php3. Z minulých dílů bychom měli mít tabulku lidé s takovouto strukturou a údaji:

+----+-------------+------------+-------+-------+
| id | rc          | prijmeni   | jmeno | plat  |
+----+-------------+------------+-------+-------+
|  1 | 790303/0041 | Vonásek    | Alois | 9990  |
|  2 | 250808/0087 | Dlabačka   | Karel | 23430 |
|  3 | 480202/5895 | Houžvička  | Karel | 8500  |
|  4 | 795331/0589 | Klokánková | Jana  | 12000 |
+----+-------------+------------+-------+-------+

---------+-------------+----------+-------+
 pohlavi | ulice       | mesto    | psc   |
---------+-------------+----------+-------+
 m       | Ružová 15   | Praha 1  | 11000 |
 m       | Kolínská 1  | Praha 8  | 18000 |
 m       | Jabloňová 8 | Praha 10 | 10100 |
 z       | Školská 487 | Praha 2  | 12000 |
---------+-------------+----------+-------+

Najednou budeme potřebovat rozeslat všem lidem třeba svatební oznámení. K tomu potřebujeme vědět jméno, příjmení a adresu sestávající z ulice, města a PSČ. Zkusme to napsat jako PHP skript, který nám to vypíše do prohlížeče.

1: <html>
2: <body>
3: <?php
4:    $db = mysql_connect("localhost", "root", "heslo");
5:    mysql_select_db("root",$db);
6:    $result = mysql_query("SELECT * FROM lide",$db);
7:    $radku = mysql_num_rows($result);
8:
9:    for($i=0;$i<$radku;$i++)
10:   {
11:         printf("<table border=1>\n<tr>\n");
12:     printf("<td>Jméno:</td><td> %s</td></tr>\n",
        mysql_result($result,$i,"jmeno"));
13:     printf("<td>Příjmení:</td><td> %s</td></tr>\n",
        mysql_result($result,$i,"prijmeni"));
14:     printf("<td>Ulice:</td><td> %s</td></tr>\n",
        mysql_result($result,$i,"ulice"));
15:     printf("<td>Město:</td><td>
        %s</td></tr>\n",mysql_result($result,$i,"mesto"));
16:     printf("<td>PSČ:</td><td>
        %s</td></tr>\n",mysql_result($result,$i,"psc"));
17:     printf("</table><br>\n");
18:   }
19:   mysql_close($db);
20: ?>
21: </body>
22: </html>

Pojmenujte soubor jako lide.php3. Uložte ho do svého domovského adresáře s webem. Jak tento skript funguje? Řádek 4 znamená, že se spojujeme s MySQL serverem. Localhost je adresa počítače, na kterém server běží. Nemusí být totožná s naším. „root“ je přihlašovací jméno a „heslo“ heslo k přístupu do databáze. Tímto jsme napojeni na server. Musíme vybrat svojí databázi. Provádí to řádek 5, kde vybereme databázi root. Jelikož je možno navázat spojení zároveň s několika servery, musí (mělo by se) se u příkazů vztahujících se k SQL psát pointer na dané spojení, v našem případě „$db“. PHP skript by jinak totiž nevěděl, jakého serveru se má ptát. Právě proto je jako druhý argument funkce mysql_select_db uváděn ukazatel na spojení. Vlastní dotaz na SQL server probíhá na řádku 6. Výsledek dotazu je uložen do proměnné $result, odkud musíme „vytahat“ jednotlivé položky. Ještě budeme potřebovat vědět, kolik řádků bude mít vrácená tabulka. Zjistíme to příkazem „mysql_num_rows“ s argumentem „$result“ (lze si to představit i tak, že v proměnné result jsou nahuštěny všechny záznamy). Ještě tedy zbývá podstatná věc. A to jak údaje z tabulky dostat do nějakých proměnných. Můžeme použít příkaz „mysql_result“ s argumenty výsledku dotazu, čísla řádku a jména sloupce. To je ve skriptu reprezentováno řádky 12 až 16. Možná je to napsáno trošku složitě, příkaz „mysql_result“ je volán v příkazu printf. To nic nemění na jeho funkčnosti. Smyčka „for“ zajistí to, aby se nám zobrazili všechny položky a každý řádek původní tabulky se vypsal do jedné „webowské“ tabulky. Jednoduše řečeno procházíme tabulku řádek po řádku a údaje tiskneme do tabulky. Pokud se Vám to zdá pořád nepřehledné, změňte to takto:

1: <html>
2: <body>
3: <?php
4:    $db = mysql_connect("localhost", "root", "heslo");
5:    mysql_select_db("root",$db);
6:    $result = mysql_query("SELECT * FROM lide",$db);
7:    $radku = mysql_num_rows($result);
8:
9:    for($i=0;$i<$radku;$i++)
10:   {
11:
12:     printf("Jméno: %s<br>\n",
        mysql_result($result,$i,"jmeno"));
13:     printf("Příjmení: %s<br>\n",
        mysql_result($result,$i,"prijmeni"));
14:     printf("Ulice: %s<br>\n",
        mysql_result($result,$i,"ulice"));
15:     printf("Město: %s<br>\n",
        mysql_result($result,$i,"mesto"));
16:     printf("PSČ: %s<br>\n",
        mysql_result($result,$i,"psc"));
17:
18:   }
19:   mysql_close($db);
20: ?>
21: </body>
22: </html>

Samozřejmě že nesmíte opsat vše i s čísly řádků na začátku. To by asi nefungovalo. Ještě uvedu výstup z prohlížeče, jak by to mělo vypadat ve druhém případě:

Jméno: Alois
Příjmení: Vonásek
Ulice: Růžová 15
Město: Praha 1
PSČ: 11000

Jméno: Karel
Příjmení: Dlabačka
Ulice: Kolínská 1
Město: Praha 8
PSČ: 18000

… atd.

Nakonec ještě nesmíme zapomenout rozloučit se serverem – to je na řádku 19. Příkaz „mysql_close“ se uvádí s argumentem spojení, které má uzavřít. Tím je náš první skript u konce.

Závěrem jen snad to, že někdy je složitější zpracovat výsledky dotazu, než se vůbec zeptat. Tím myslím navrhnout design pro stránku, formuláře pro vkládání a mazání v databázi atd.

Našli jste v článku chybu?

11. 4. 2000 20:54

Petrix (neregistrovaný)

Myslim, ze logovat se jako root je blbost (kdyz chcipne PHP, tak se ten .PHP3 soubor posle i s heslem uzivateli a s root heslem se toho da spoustu delat, ze ? ;))). Ale pro ukazku .. budiz ...
To:OERNii )) misto readfile je jeste lepsi pouzit FPassThru.


10. 4. 2000 13:42

znouza (neregistrovaný)

jen mala poznamka - mysql_num_rows neexistuje, ja alespon pouzivam mysql_connect(database,login,heslo);$result=mysql(databaze,dotaz);a $radku=mysql_numrows($result);
...
dalsi vec - bezpecnost include - doporucuju pojmenovat include soubory .inc.php3 nebo pouze .php3 - protoze bezne .inc jsou citelne v browseru. Jinak pouzivam pouze inlude(file), a ne require(file);



DigiZone.cz: ČRo rozšiřuje DAB do Berouna

ČRo rozšiřuje DAB do Berouna

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Lupa.cz: UX přestává pro firmy být magie

UX přestává pro firmy být magie

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?

Lupa.cz: Avast po spojení s AVG propustí 700 lidí

Avast po spojení s AVG propustí 700 lidí

Podnikatel.cz: Na poslední chvíli šokuje vyjímkami v EET

Na poslední chvíli šokuje vyjímkami v EET

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

Vitalia.cz: Tesco: Chudá rodina si koupí levné polské kuře

Tesco: Chudá rodina si koupí levné polské kuře

DigiZone.cz: ČT má dalšího zástupce v EBU

ČT má dalšího zástupce v EBU

Vitalia.cz: To není kašel! Správná diagnóza zachrání život

To není kašel! Správná diagnóza zachrání život

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Podnikatel.cz: Víme první výsledky doby odezvy #EET

Víme první výsledky doby odezvy #EET

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Vitalia.cz: Baletky propagují zdravotní superpostel

Baletky propagují zdravotní superpostel

Podnikatel.cz: EET zvládneme, budou horší zákony

EET zvládneme, budou horší zákony

DigiZone.cz: ČRa DVB-T2 ověřeno: Hisense a Sencor

ČRa DVB-T2 ověřeno: Hisense a Sencor

120na80.cz: Rakovina oka. Jak ji poznáte?

Rakovina oka. Jak ji poznáte?