Zdá se, že používáte zastaralý a nepodporovaný prohlížeč Internet Explorer. Některé části webu proto nebudou fungovat stejně jako v moderních prohlížečích Firefox, Chrome, MS Edge

Kovářova kobyla

FoxPro Reader – import fpt souborů

S databázemi ve formátu DBF se můžete setkat poměrně často. V dobách MS-DOS se hojně používaly aplikace vyvinuté ve FoxPro 2.x a někde se stále používají. Problém nastává, když je potřeba načíst z takové databáze data pomocí PHP. Přesněji řečeno, problém je s položkami datového typu memo.

Formát DBF vznikal v době, kdy byly harddisky malé a drahé a šetřilo se každým bajtem. Proto se do dbf souboru ukládají jen relativně krátké údaje (čísla, varchar a boolean). Když vznikla potřeba ukládat delší texty, ve struktuře dbf souboru se na to asi nenašlo místo a proto vznikl datový typ memo. Položka neobsahuje ve sloupci s timto datovým typem přímo data, ale odkaz do externího souboru a teprve v něm se ukládají samotná data. Tento externí soubor má stejný název jako dbf soubor, ale liší se příponou. U původní dBase měl příponu dbt, u FoxPro má příponu fpt.

PHP má rozšíření pro všelijaké databáze, samozřejmě je mezi nimi i knihovna pro práci s dbf. Ta ale má jednu vadu, neumí načítat položky typu memo. Autoři asi považovali dbf za zastaralý formát a nestálo jim za námahu vymýšlet plnou podporu pro dbf.

Při vývoji jednoho eshopu jsem potřeboval automaticky načítat data z dbf souborů databáze FoxPro včetně memo položek. Nejprve jsem uvažoval o exportu dat z dbf do jiného formátu, to by ale vyžadovalo spouštění externího programu na serveru. Zkusili jste někdy přemluvit správce webhostingového serveru, aby povolil používání funkcí system() nebo exec()?

S pomocí Googlu jsem našel DBF class, který by měl umět načítat data i z memo položek, dokonce bez dBase rozšíření. Asi to umí jen z dbt souborů, protože u fpt souborů to nefungovalo. Googloval jsem dále, našel popis formátu fpt a nakonec jsem zprovoznil i načítání z fpt souborů. Výsledek mého snažení, třídu CFoxproReader si můžete stáhnout na konci článku.

V mém případě třída funguje správně, ale neměl jsem možnost ji vykoušet s různými verzemi FoxPro. Nabízím ji tak jak je, proto mi nepište abych vám ji upravil. Při jejím používání pamatujte na to, že se oba soubory (dbf i fpt) načítají do paměti, u velkých souborů můžete narazit na nastavení memory_limit. Také v této třídě neřeším převod kódování, to si musíte vyřešit sami. U dbf můžete narazit na kódování Kamenických a možná i jiné podivnosti.

Jak říká firemní heslo Oddělení stížností společnosti Sirius Cybernetics: „Berte a vychutnávejte“.

Ke stažení: foxpro-reader.tar (3.43 kB)

Aktualizovaná verze je ke stažení na githubu.

Vyšlo v rubrice PHP

Komentáře

  • Daniel Mejta ve 18.5.2010 17:01 napsal:

    Děkuji za tuto classu, zachránil jsi mi život (a hlavně spoustu nervů)