PHP – manipulace se soubory
V minulém díle jsem se zabýval základy podmínek a cyklů. V tomto díle si ukážeme, jak číst a zapisovat do souborů a naznačíme, jak dosavadních znalostí využít k naprogramování jednoduchého on-line testu s real-time statistikami úspěšnosti dosavadních řešitelů (kompletní kód včetně komentáře bude spolu s několika dalšími užitečnými triky součástí příštího dílu).
K tomu, abychom mohli se souborem nějakým způsobem manipulovat, musíme ho nejprve otevřít příkazem FOpen:
|
Název souboru se udává relativně vzhledem ke skriptu, tj. pokud je ve stejném adresáři a jmenuje se data.txt, místo názvu vepíšeme data.txt atd. Lze však otevírat i soubory s absolutně zadanou adresou přes protokoly HTTP a FTP. V proměnné $fp (nebo jakékoliv jiné) je teď ukazatel na soubor – budeme ho potřebovat v dalších příkazech. Mód udává, co se souborem budeme dělat – „r“ otevře soubor pro čtení, „w“ pro zápis (pokud soubor neexistuje, je vytvořen, pokud existuje, je smazán), „a“ otevře soubor pro doplňování (zápis za konec souboru). Jsou i další možné hodnoty módu, bez těch se ale obejdeme. Pokud tedy budeme chtít na disk do stejného adresáře jako je skript zapsat soubor s názvem data.txt, správný příkaz pro otevření je tento:
|
Nyní, když máme soubor otevřen, můžeme v závislosti na módu z něj číst nebo do něj zapisovat:
|
Důležité je si všimnout, že příkaz FRead, který čte obsah souboru, vyžaduje druhý povinný parametr udávající maximální délku (čtení skončí po dosažení této délky nebo konce souboru). Nejlépe je jako délku uvést dostatečně vysoké číslo nebo použít funkci FileSize, která vrací velikost souboru. Příkaz FClose zavře otevřený soubor a měli bychom ho použít vždy, když skončíme práci se souborem. Do souboru zapisuje příkaz FWrite – ten může mít jako třetí parametr, tentokrát nepovinný, délku (je-li menší než zapisovaný řetězec, zapíše se z řetězce pouze udaný počet znaků). Výsledkem výše uvedených šesti řádků kódu by mělo být zkopírování obsahu souboru data.txt do souboru data2.txt.
Pokud se soubor nepodaří příkazem FOpen otevřít, vrací funkce hodnotu false (nepravda). Toho lze využít k tomu, aby se neprováděly zbytečně příkazy pro manipulaci se souborem, pokud se ho nepovede ani otevřít:
|
Občas se nám může hodit otestovat, zda nějaký soubor vůbec existuje, abychom např. nečetli z neexistujícího souboru. K tomu slouží funkce File_Exists, která vrací true (pravda), pokud daný soubor existuje:
|
Pro načtení dat ze souboru je v PHP také velmi užitečný příkaz File – jeho parametrem je pouze název souboru, příkaz načte obsah souboru do pole, přičemž v každé buňce pole bude jeden řádek datového souboru. Předpokládejme, že máme na disku následující pětiřádkový textový soubor data.txt:
|
Jeho obsah můžeme načíst a zobrazit například následujícím skriptem:
|
První řádek PHP skriptu načte soubor data.txt do pole $data – protože data.txt má celkem 5 řádků, pole $data bude mít pět buněk s indexy 0-4 (v $data[0] bude Pankrác, v $data[1] Servác … v $data[4] Pafnuc). Druhý řádek je pouze jednoduchý cyklus vypisující obsahy jednotlivých buněk pole. Obsahuje dosud neznámou funkci Count – ta vrací počet buněk pole, v tomto případě 5. Cyklus tedy proběhne pro hodnoty $i 0, 1, 2, 3 a 4.
Zatím to vypadá, že manipulace se soubory pomocí PHP je opravdu jednoduchá. Občas však při zápisu do souboru nastanou problémy, které se typicky projeví chybovou hláškou obsahující text Permission denied. To souvisí s přístupovými právy k souboru – vámi spuštěný skript nemusí mít právo zapisovat do souborů nebo tvořit nové. Běží-li PHP pod Windows, musíte se dohodnout se správcem serveru – zpravidla by vám měl povolit zápis do nějakého konkrétního adresáře. V Linuxu je vše poněkud jednodušší – pomocí vašeho FTP klienta nastavte u souboru, který chcete modifikovat, plná práva (např. ve Windows Commanderu vyberte Soubory > Změna atributů a vše zaškrtněte). Pokud chcete vytvořit nový soubor, nastavte plná práva u nadřazeného adresáře – vše by tak mělo chodit bez problémů, ale vždy je lepší se na konkrétní nastavení zeptat správce serveru.
Shrnutí anebo co si je třeba pamatovat
- Chceme-li číst ze souboru nebo do něj zapisovat, musíme ho nejprve otevřít příkazem FOpen.
- Ke čtení slouží příkaz FRead, k zápisu příkaz FWrite.
- Po skončení práce se souborem ho po sobě zase zavřeme příkazem FClose.
- Nejjednoduššeji často přečteme obsah souboru příkazem File, který nám jednotlivé řádky souboru uloží do pole.
- Vyskytne-li se chybová hláška, pravděpodobně máme špatně nastavená přístupová práva k souboru.
V příštím díle si konečně ukážeme, jak vytvořit avizovaný on-line test s real-time statistikami dosavadních řešitelů. Budeme muset nejprve vyhodnotit počet správných odpovědí, poté modifikovat nějaký soubor, kde bude uložená jednoduchá statistika, a nakonec tuto statistiku zobrazit. Také si ukážeme, jak zabránit tomu, aby někdo na daný test odpovídal víckrát.
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
-
Aukce CZ domén: Jak vydražit expirovanou CZ doménu?
12. června 2024 -
4 tipy, jak na efektivní úsporu při rozjezdu podnikání
3. ledna 2023 -
Moderní trendy ve webdesignu: Top trendy pro rok 2024
12. ledna 2024 -
Rychlost serveru: Klíč k lepšímu umístění ve vyhledávačích
7. června 2024
Nejnovější
-
Jak zvýšit CTR vašeho e-mail marketingu
9. září 2024 -
Znovuuvedení domény .AD
5. září 2024
Johny
Říj 20, 2009 v 16:03Mohl by jste mi někdo poradit jak mám do souboru zapsat 2 řádky nebo více? Předem dík.
kordy
Říj 21, 2010 v 13:33podle toho jestli píšeš html nebo php, txt
pro html platí
pro php a txt /n
Se zápisem do jinývh formátů jsem se nesetkal a neplánuji :)
kordy
Říj 21, 2010 v 13:36ah br to pochopilo jako odřádkování ale chtěl jsem to napsat jako text máš ta na začátku odmysli si _ jinak by to nevzalo…
kordy
Říj 21, 2010 v 13:48doháje ani to nepomohlo :D prostě takový to br odřádkování jako v html… :)
netlife
Bře 24, 2013 v 23:13\n :) v pohodě a chápe to :)