Obsah lekce:
Jednou z částí dynamického webu může být stránka obsahující informace uložené v rámci textového souboru v adresářové strukutře webu. Může se jednat o jednoduchý soubor s informacemi, které je jednodušší uložit do souboru namísto databáze (nebo nemáme databázový server k dispozici - například v rámci nějakého webhostingu, který je zdarma a databázovou technologii zkrátka nelze využívat).
V našem příkladu na zpracování textového souboru budeme uvažovat seznam zaměstnanců uložený v textovém souboru a ten budeme ze souboru vizualizovat jako html stránku.
Vstupním souborem našeho skriptu bude soubor v tabulkovém kalkulátoru Microsoft Excel obsahující tabulku zaměstnanců. Soubor je k dispozici v jedné z následujících variant:
Vzhledem k tomu, že zdrojový soubor v tabulkovém kalkulátoru je binární (obsahuje standardně nečitelná data - zkuste si prohlédnout jeden ze stažených souborů nějakým obyčejným textovým editorem např. poznámkový blok nebo pspad apod.), tak je třeba obsah tohoto souboru uložit tak, aby byl pro nás a náš skript čitelný.
V našem příkladu exportujeme seznam zaměstanců do textového souboru ze seznamu vytvořeného v tabulkovém procesoru typu Excel. K tomuto účelu použijeme formát CSV (v tabulkovém procesoru zvolíme uložit jako formát CSV). Uložením do formátu CSV dojde k tomu, že vznikne textový soubor se stejnými textovými daty jako v tabulkovém procesoru. Každému řádku v tabulce tabulkového procesoru odpovídá v textovém souboru je jeden řádek s tím, že údaje z jednotlivých sloupců jsou v textovém souboru odděleny středníkem (zpravidla).
Textový soubor bude na každém řádku obsahovat všechny informace o jednom člověku (kontaktu).
CSV soubor bude po zobrazení textovým editorem vypadat takto:
Zaměstnanci GJŠ Zlín;;;;;;
;;;;;;
Jméno ;Příjmení;Titul;E-mail;Telefon;Fotografie;Zkratka
Eliška;Babíková;;babikova@gjszlin.cz;577007450;babikova.jpg;
Radim;Bárta;Mgr.;barta@gjszlin.cz;577007448;barta.jpg;Bár
Libuše;Beranová;Ing.;beranova@gjszlin.cz;577007434;beranova.jpg;Ber
Milan;Buday;Mgr.;;;;
Oldřiška;Burešová;Mgr.;buresova@gjszlin.cz;577007436;buresova.jpg;Bur
...
Pomineme-li první tři řádky, pak vidíme, že každý řádek obsahuje informace o jednom konktrétním zaměstnanci ve tvaru Jméno;Příjmení;Titul;E-mail;Telefon;Fotografie;Zkratka. Je tedy možné soubor jednoduše zpracovat, neboť jsou v něm všechny hodnoty jednoduše čitelné.
Podívejme se přesněji na to, jak soubor ve formátu CSV vypadá. Jedná se o jednoduchý souborový formát určený pro výměnu tabulkových dat (například mezi různými systémy). Takovýto soubor se skládá z řádků, ve kterých jsou jednotlivé sloupce v rámci jednoho řádku odděleny oddělovacím znakem (nejčastěji to bývá čárka nebo středník) - toto je také význam CSV neboli "Comma-separated values". Jednotlivé položky řádku (sloupce) mohou být uzavřeny do uvozovek (například proto, že text v rámci sloupce může obsahovat oddělovací znak - například středník - a je tedy nutno takový řetězec uzavřít do uvozovek, aby bylo zřejmé, že se nejedná o oddělovač sloupců, ale o znak ve sloupci obsažený).
V tomto formátu (CSV) jsou uloženy pouze text a hodnoty a to tak, jak jsou zobrazeny v buňkách aktivního listu. Všechny řádky i všechny znaky v každé buňce budou uloženy. Sloupce dat budou odděleny středníky a každý řádek dat bude zakončen znakem konce řádku. Jestliže buňka obsahuje středník, bude obsah buňky ohraničen uvozovkami.
Pokud jsou v buňkách zobrazeny vzorce místo hodnot vzorců, budou vzorce převedeny jako text. Veškeré formátování, grafické objekty, objekty a jiný obsah listu budou ztraceny. Symbol eura bude převeden na otazník.
Poznámka: Pokud sešit obsahuje zvláštní znaky písma, například symbol autorských práv (©), a budete používat převedený textový soubor v počítači s jiným operačním systémem, uložte tento sešit v příslušném textovém formátu daného systému. Jestliže například používáte systém Windows a chcete použít textový soubor v počítači Macintosh, uložte soubor ve formátu CSV (Macintosh). Používáte-li počítač Macintosh a chcete použít textový soubor v systému Windows nebo Windows NT, uložte soubor ve formátu CSV (Windows).
Zdroj: Microsoft Online Help v aplikaci Microsoft Excel 2007
Uvědomme si, že převodem z tabulky v tabulkovém procesoru, která obsahuje jiné písmo, barvy apod. o tyto informace v textovém souboru přijdeme a zůstanou pouze textová data. Na tento fakt nás tabulkový procesor při ukládání upozorní.
Pro výměnu dat se již dnes používá spíše formát xml, ale práce s ním je o něco složitější a pro naši potřebu formát CSV postačí.
Vytvoříme složku a v ní vytvoříme testovací soubor zobraz-soubor.php se skriptem pro načtení souboru a do vnořené složky se jménem data uložíme náš CSV soubor pod jménem zamestnanci.csv.
Nyní se dostáváme k problematice samotného skriptu, který by měl soubor otevřít a vypsat nám jeho obsah do prohlížeče. V první řadě vložíme do našeho souboru základní kostru html dokumentu.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250" />
<title>Seznam zaměstnanců</title>
</head>
<body>
</body>
</html>
Náš skript bude fungovat tak, že otevře soubor v daném umístění, projde ho řádek po řádku a aktuální řádek vždy vypíše do html. V krocích bychom si to mohli představit jako následující postup:
K otevření souboru slouží v PHP funkce fopen (popis). Tato funkce má celkem dva povinné parametry:
$soubor=fopen("data/zamestnanci.txt", "r");
Na ověření existence požadovaného otevíraného souboru v PHP slouží funkce file_exists (popis). Tato funkce vrací hodnotu TRUE pokud zadaná cesta existuje a FALSE v opačném případě. Tato funkce má jeden povinný parametr:
Na ověření zda se nacházíme na konci souboru v PHP slouží funkce feof (popis). Tato funkce vrací hodnotu TRUE pokud je ukazatel v souboru na konci souboru a FALSE v opačném případě. Tato funkce má jeden povinný parametr:
Po úspěšném otevření souboru získáme ukazatel $soubor na nás soubor a cyklus while obstará proces procházení souboru řádek po řádku dokud není konec souboru. Jinak řečeno: "Dokud nám funkce feof nevrátí true (tzn. je konec souboru), pak pokračujeme ve čtení souboru řádek po řádku.".
Na přečtení jednoho řádku ze souboru v PHP slouží funkce fgets (popis). Tato funkce vrací řetězec o délce delka-1 (delka je volitelný parametr). Tato funkce má jeden povinný a jeden volitelný parametr:
Výsledný skript vložíme mezi značky <?php a ?> do těla stránky mezi tagy <body></body>. Skript se pokudí otevřít soubor a provádí čtení souboru řádek po řádku a výpis jednotlivých řádků do prohlížeče.
$nazev_souboru="data/zamestnanci.csv"; if (file_exists($nazev_souboru)) { $soubor=fopen($nazev_souboru, "r"); if($soubor){ while (!feof($soubor)){ $radek = fgets($soubor,5000); print($radek); print("<br />"); } } else { print("Soubor ".$nazev_souboru." se nepodařilo otevřít pro čtení."); } } else { print("Soubor ".$nazev_souboru." neexistuje."); }
Výsledný výpis souboru v prohlížeči by měl vypadat takto: