Jak pracovat se soubory ve formátu DBF v PHP 2.
V předchozím článku jsem naznačil, že v některých situacích je výhodné, aby výstupem PHP skriptu, který získává data z SQL serveru, nebyla www stránka, ale soubor ve formátu DBF. O tom, jak se dá takový takový skript vytvořit, si můžete přečíst v tomto článku.
Vše si budeme pro názornost demonstrovat na konkrétním příkladu. Abych usnadnil práci alespoň těm čtenářům Intervalu, kteří sledovali seriál s názvem „Databáze kontaktů v PHP“, rozhodl jsem se použít server MySQL a tabulku TKontakty_Firmy (v první části „Databáze kontaktů…“ najdete zdrojový text SQL skriptu, který zmíněnou tabulku vytvoří). Tato tabulka obsahuje položky: Firma_ID int(11), Nazev varchar(50), Ulice varchar(50), Mesto varchar(50), PSC varchar(10), Telefon varchar(50), Fax varchar(50). Níže popsaný PHP skript bude posílat dotaz na SQL server a z výsledku dotazu vytvoří DBF soubor a nabídne jej uživateli ke stažení.
Hlavní myšlenka skriptu
Nejprve otevřeme spojení s SQL serverem a položíme SQL dotaz. Poté vytvoříme soubor ve formátu DBF a postupně do něj přidáváme jednotlivé záznamy tak, jak je získáváme pomocí funkce mysql_fetch_row. Klientovi pošleme příslušné hlavičky a poté celý obsah DBF souboru. Nakonec tento soubor smažeme. Kromě funkcí umožňujících práci s MySQL (ty jsou dobře popsány v jiných článcích na tomto serveru) využijeme také následující funkce:
- dbase_create(string název_souboru, array položky) – vytvoří DBF soubor zadaného názvu. Jednotlivé prvky pole "položky" jsou opět pole s následujícím obsahem: první prvek obsahuje název položky, druhý prvek typ položky, třetí délku a čtvrtý přesnost. Přípustné hodnoty parametru typ jsou: "C" – textový řetězec, má délku a nemá přesnost, "N" – číslo, má délku i přesnost (ta odpovídá počtu míst za desetinnou čárkou). Všechny zbylé typy nemají ani délku, ani přesnost: "L" – logická hodnota, "D" – datum (ve formátu RRRRMMDD, PHP jej automaticky převádí na string) a "M" – memo (text libovolné délky), tento typ není v dbase_* funkcích jazyka PHP podporován. V případě úspěšného provedení funkce získáme identifikátor databáze, v ostatních případech vrací funkce false.
- dbase_add_record(int indentifikátor_databáze, array položky) – přidá do zadané databáze záznam, jehož položky odpovídají prvkům pole, které uvedeme jako druhý parametr této funkce. Pokud se podaří záznam přidat, vrátí funkce true, v opačném případě vrátí false.
- dbase_close(int indentifikátor_databáze) – uzavře databázi.
- uniqid(string prefix, [int lcg]) – vrací unikátní identifikátor opatřený zadaným prefixem. Pokud je nepovinný parametr lcg rovný true, připojí se na konec ještě pseudonáhodný řetězec (tuto možnost nabízí jen novější verze jazyka PHP, dříve měla tato funkce jen jeden parametr). Tuto funkci použijeme v našem skriptu na vytvoření jména DBF souboru.
- header(string hlavička) – zašle klientovi určenou hlavičku. V naší ukázce budeme této funkce používat v situaci, kdy budeme chtít klienta informovat o typu zasílaných dat a také když náš skript bude nabízet soubor ke stažení.
- readfile(string název_souboru, [int include_path]) – přečte zadaný soubor a přepíše jej na standardní výstup. Použijeme-li na místě druhého, nepovinného, parametru true, bude se zadaný soubor hledat i v adresářích uvedených v direktivě include_path souboru php.ini.
- unlink(string název_souboru) – smaže zadaný soubor.
Zde je kompletní zdrojový kód našeho skriptu
|
Pokud by přicházelo na server velké množství požadavků a nevadily by nám větší nároky na diskovou kapacitu, mohli bychom zrychlit celý proces tím, že bychom DBF soubory nemazali a cesty k těmto souborům ukládali společně s příslušnými SQL dotazy do nějaké databáze. PHP skript by vytvořil nový DBF soubor pouze v případě, že by databáze neobsahovala zadaný dotaz. Pak by samozřejmě bylo nutné zajistit, aby se při každé změně dat na SQL serveru změnily i obsahy DBF souborů.
Pro úplnost dodejme, že podobným způsobem bychom mohli pomocí PHP skriptů vytvářet soubory ve formátu CSV, což jsou textové soubory, jejichž řádky odpovídají jednotlivým záznamům, přičemž jednotlivé položky jsou od sebe odděleny středníkem. Soubor bychom vytvořili např. pomocí funkce fopen. Prvky polí, která získáváme při čtení jednotlivých záznamů z výsledku SQL dotazu, bychom sloučili do jednoho řetězce příkazem implode($zaznam, „;“) a výsledné řetězce zapsali do souboru pomocí funkce fwrite. Posledním rozdílem proti našemu skriptu, který generuje soubory ve formátu DBF, by byly zasílané hlavičky.
Stejně jako minule si můžete stáhnout zdrojový soubor.
Starší komentáře ke článku
Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.
Mohlo by vás také zajímat
-
Landing page: Jak vytvořit landing page s vysokým CTR
7. května 2024 -
Výkonný a kompaktní: ASOME Max Studio s výjimečným poměrem cena/výkon
11. listopadu 2024 -
Znovuuvedení domény .AD
5. září 2024
Nejnovější
-
Výkonný a kompaktní: ASOME Max Studio s výjimečným poměrem cena/výkon
11. listopadu 2024 -
Šokující data od Microsoftu: Kyberútoky rostou o stovky procent!
8. listopadu 2024 -
Chcete jedinečnou doménu? Objevte koncovky FOOD, MEME a MUSIC!
7. listopadu 2024 -
OpenAI představilo novou funkci ChatGPT Search
6. listopadu 2024
Kuba
Zář 21, 2010 v 13:27Díky moc za návod, pomohl mi vyřešit zdánlivě neřešitelný problém. :)
Jen by se hodil i návod na to, jak nainstalovat knihovnu php_dbase.dll, s tím jsem laboroval asi týden, protože mi wamp server stále hlásil nekompatibilitu. Vyřešila to instalace nižší verze php, která knihovnu obsahovala už v sobě.
Lukáš
Zář 6, 2011 v 14:24Článek mi také moc pomohl, děkuji, ale narazil jsem na problém s kódováním. Dbase mi vytváří soubor s ASCII a OEM doplňkem. Potřeboval bych ale ASCII s ANSI. řešil to už někdo? Děkuji za odpověď