Zkusíme vytvořit jednoduchou webovou stránku. Bude obsahovat nadpis nahoře uprostřed, vlevo v úzkém sloupci bude seznam článků a vpravo samotný článek, přičemž při příchodu na stránku se zobrazí něco jako úvodník. Z rozložení vyplývá, že bude vhodné stránku navrhnout jako tabulku. Její podoba bude takováto:
+--------------------------------+ | Nadpis | +-------+------------------------+ | Sez- | | | nam | | | | | | člá- | | | nků | článek | | | | | | | | | | +-------+------------------------+
Graficky stránku řešit nebudeme, jako nadpis budeme dávat jméno článku uzavřené do tagů h1, jinak vše bude prostý text členěný na odstavce. Nejdříve ale musíme navrhnout strukturu tabulky na SQL serveru, z níž budeme data tahat. Navrhuji následující věci:
- každý článek je unikátní, měl by mít unikátní identifikační číslo (dále jen id)
- články se nepíšou sami, tudíž by zde měl být uveden autor
- do databáze nebudeme dávat celé články, jen odkazy kde je najdeme (snazší správa při opravách v článku)
- každý článek má název, datum vytvoření a na konci odkazy na související články
Při troše chuti dojdeme asi k následujícím tabulkám (ano, tabulkám, jedna hlavní a ostatní jen jako číselníky – pochopíte ihned jakmile uvidíte):
Tabulka 1. +---+-------+-------+----------+-------+--------+ |id | Název | Místo | Autor_id | Datum | Odkazy | +---+-------+-------+----------+-------+--------+ | | | | | | | Tabulka 2. +---+-------+------+---------+ |id | Autor | mail | telefon | +---+-------+------+---------+ | | | | | Tabulka 3. +-----------+----------+---------+ | id_odkazu | k_clanku | hodnota | +-----------+----------+---------+ | | | |
Máme tři tabulky. V první budeme klást omezení. Id musí být nenulové a unikátní, název nenulový, stejně tak i místo, autor a datum. Sloupec odkazy bude obsahovat jen hodnoty „ano“ a „ne“. Ve druhé tabulce bude nenulový a unikátní sloupec id, sloupec autor bude muset být nenulový. No a konečně v poslední tabulce stejně jako v minulých. Sloupec id_odkazu nenulový a unikátní, sloupec k článku nenulový a stejně tak i hodnota.
Vytvořme nyní tyto tabulky:
Tabulka 1:
create table main (id int not null unique, nazev varchar(125) not null, misto varchar(125) not null, autor_id int not null, datum date not null, odkazy enum(„ano“,„ne“));
Tabulka 2:
create table authors (id int not null unique, autor varchar(125) not null, mail varchar(60), telefon varchar(30));
Tabulka 3:
create table odkazy (id_odkazu int not null unique, k_clanku int not null, hodnota varchar(255) not null);
Tímto máme vytvořeny tabulky v databázi. Již jen stačí napsat takový PHP skript, který vygeneruje požadovanou stránku podle id článku a sám zjistí autora a případné odkazy a při jejich existenci je zobrazí dole na stránce.
Začneme tak, že si nejprve celou stránku napíšeme čistě v HTML. Nazveme ji index.html a umístíme na server. Mohla by vypadat asi takto:
<html> <head> <title>Nějaká stránka</title> </head> <body bgcolor="white"> <table width="780" height="1" border="1"> <tr> <td colspan="2"> <h2>Vítejte na mojí první PHP stránce</h2> </td> </tr> <tr> <td width="200" height="1"> <p> Sem přijde seznam článků řazený od nejnovějšího k nejstaršímu </p> </td> <td> <p> A tady bude článek, dole pak odkazy a jméno autora jako link na mailto:______ </p> </td> </tr> </table> </body> </html>
Vidíme asi jak to bude vypadat a kam budeme vkládat skript. Prvním úkolem je vytvořit seznam článků. K tomu potřebujeme jen id článku a jeho název. Vybereme všechny články sestupně podle data dotazem:
select id, nazev from main order by datum desc;
Nyní již jen zbývá převést tento dotaz do PHP skriptu a zpracovat výstup. Ještě předtím by se hodila zmínka o tom, jak se PHP skriptu předávají data (proměnné). Nechť je url něčeho „http://www.neco.com/clanek.php3?id=7“. Pak se při otvírání této stránky spustí PHP skript clanek.php3 a předá se mu hodnota id=7. Pokud je hodnot více, oddělují se „&“, třeba „http://www.neco.com/clanek.php3?id=7&value=no“.
Skript pro výtah seznamu článků by mohl vypadat asi takto:
01: <?php 02: $db = mysql_connect("localhost", "user","heslo"); 03: mysql_select_db("moje_databáze",$db); 04: $vysledek = mysql_query("select id, nazev from main order by datum desc;",$db); 05: while ($radek = mysql_fetch_row($vysledek)) 06: { 07: printf ("<a href=\"clanek.php3?id=%s\">%s</a> <br>",$radek[0],$radek[1]); 08: } 09: mysql_close($db); 10: ?>
Na řádku 2 otevřeme spojení se serverem. Nesmíme zapomenout uvést správný login a heslo. Na třetím řádku vybereme používanou databázi. Zde je rovněž nutné mít práva k přístupu do ní. Nejdůležitější je řádek číslo 4. Na něm se serveru ptáme na požadované položky. Na řádcích 5 až 8 je smyčka, která tiskne tag „<a href=“…„>Název</a><br>“ podle obsahu databáze. WHILE je použito proto, aby se smyčka opakovala až do doby kdy už není co vracet. Jednotlivé sloupce tabulky jsou reprezentovány proměnnou $radek[0] a $radek[1]. Indexy 0 a 1 vyplývají z pořadí sloupců na které jsme se tázali. „id = $radek[0]“ a „nazev = $radek[1]“. Na řádku 9 se se serverem rozloučíme.
Vložme tento skript no našeho html kódu:
<body bgcolor="white"> <table width="780" height="1" border="1"> <tr> <td colspan="2"> <h2>Vítejte na mojí první PHP stránce</h2> </td> </tr> <tr> <td width="200" height="1"> <p> <?php $db = mysql_connect("localhost", "user","heslo"); mysql_select_db("moje_databáze",$db); $vysledek = mysql_query("select id, nazev from main order by datum desc;",$db); while ($radek = mysql_fetch_row($vysledek)) { printf ("<a href=\"clanek.php3?id=%s\">%s</a> <br>",$radek[0],$radek[1]); } mysql_close($db); ?> Sem přijde seznam článků řazený od nejnovějšího k nejstaršímu </p> </td> <td> <p> A tady bude článek, dole pak odkazy a jméno autora jako link na mailto:______ </p> </td> </tr> </table> </body> </html>
Naplňte databázi nějakými údaji a zkuste se na stránku podívat. Pokud se objeví Vámi zadané věci je to v pořádku. Pokud ne, někde jste udělali chybu. Zkontrolujte databázi, uživatelské jméno a heslo.
Tímto máme jakýsi skelet pro úvodní stránku. Dále musíme vytvořit ještě skript clanek.php3, který bude zobrazovat zadané články. Použijeme tu samou kostru HTML dokumentu, dokonce i sekce pro seznam článků zůstane. Budeme muset akorát přidat sekci, která zajistí natáhnutí požadovaného článku, změní nadpis stránky a uvede dole jméno autora a příslušné odkazy.
Vyjdeme z našeho index.php3 a přidáme označené řádky:
+ <?php + $db = mysql_connect("localhost", "root","command"); + mysql_select_db("root",$db); + $result = mysql_query("select nazev,misto,autor_id, datum,odkazy from main where id=".$id.";",$db); + $radek = mysql_fetch_row($result); /* v této sekci si zjistíme všechny údaje o řádku v tabulce, budou uloženy v proměnných $radek[0] az $radek[4] */ + ?> <html> <head> <title> + <?php + printf("%s",$radek[0]); /* Vytiskneme název článku to titulku okna prohlížeče */ + ?> </title> </head> <body bgcolor="white"> <table width="780" height="1" border="1"> <tr> <td colspan="2" align="center"> <h2> + <?php + printf("%s",$radek[0]); /* Vytiskneme název článku do horní buňky tabulky */ + ?> </h2> </td> </tr> <tr> <td width="200" height="1"> <p> <?php $result = mysql_query("select id,nazev from main order by datum desc;",$db); while ($radek1 = mysql_fetch_row($result)) { printf ("<a href=\"clanek.php3?id=%s\">%s</a><br>", $radek1[0],$radek1[1]); } mysql_close($db); ?> </p> </td> <td> <p> + <?php + $filename = "html/".$radek[1]; /* Nastavujeme jméno souboru s článkem */ + $fd = fopen( $filename, "r" ); /* otevíráme ho pro čtení */ + $contents = fread( $fd, filesize( $filename ) ); /* čteme jeho obsah */ + fclose( $fd ); /* zavíráme soubor */ + printf($contents); /* a tiskneme ... */ + ?> </p> ------- Sem přijde vložit kus kódu - Autor... a odkazy... ------- </td> </tr> </table </body> </html>
Struktura adresářů je asi taková, že v „html/“ adresáři (to je adresář v adresáři kde je index.php3 a clanek.php3 – poněkud krkolomné) jsou soubory nazvané podle sloupce misto v hlavní tabulce respektive v tabulce jsou uvedeny jejich jména. Nezapomeňte změnit v části zabezpečující generování seznamu proměnnou radek za radek1, pak by Vám to nechodilo jako mě a marně byste přemýšleli :-)
Už nám chybí jen jméno autora a odkazy. Na to použijeme stejné postupy jako do této doby. Víme-li autorovo id (autor_id), stačí se jen zeptat na jeho jméno a email. Dotaz bude vypadat následovně:
select autor, mail from authors where id=author_id;
Část PHP kódu, kterou budeme vkládat, bude vypadat nějak takto (už i se sekcí pro odkazy… vysvětlení níže).
<p> <?php $result3 = mysql_query("select autor,mail from authors where id=".$radek[2].";",$db); $radek2 = mysql_fetch_row($result3); printf ("<a href=\"mailto:%s\">%s</a>", $radek2[1],$radek2[0]); ?> </p> <p> <?php if($radek[4]="ano") { $result4 = mysql_query("select hodnota from odkazy where k_clanku=".$radek[2].";",$db); while ($radek3 = mysql_fetch_row($result4)) { printf ("<a href=\"%s\">%s</a><br>", $radek3[0],$radek3[0]); } } mysql_close($db); ?> </p>
A vložíme ho na označené místo předchozího výpisu. Je nesmíme zapomenout přesunout příkaz mysql_close() až na konec. Dotaz na odkazy vypadá tak, že se nejdříve ptáme, zda k danému článku existují odkazy. To je podmínka IF. Je-li splněna, nic nebrání v tom, abychom se ptali dál přímo na url odkazů:
select hodnota from odkazy where k_clanku=id;
Přičemž id víme. Pak je to již standardní problém zpracování výstupu SQL serveru do rozumné formy. Smyčka WHILE je tu proto, že nevíme kolik odkazů je v databázi. Proto čteme stále dokud je co.
Mnozí zkušenější uživatelé a administrátoři by to určitě nikdy nenapsali tak jako já teď, ale je to jen školní případ. Pokud se někdo bude chtít touto problematikou zabývat hlouběji, zjistí že vše lze zapsat jednoduše a vizuálně lépe.
Zkuste databázi nakrmit nějakými údaji, udělejte nějaké soubory (jako HTML) a hrajte si s tím, to je nejlepší cesta jak se naučit jednotlivé vztahy mezi tabulkami a propojujte to s PHP skripty. Tvořte složitější dotazy… učený z nebe nespadl…