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/include. 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/include/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.