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:

$fp = FOpen („nazev_souboru“, „mod“);

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:

$fp = FOpen („data.txt“, „w“);

Nyní, když máme soubor otevřen, můžeme v závislosti na módu z něj číst nebo do něj zapisovat:

$fp = FOpen („data.txt“, „r“); // otevře soubor data.txt pro čtení
$data = FRead ($fp, FileSize („data.txt“)); // načte do proměnné $data obsah souboru data.txt
FClose ($fp); // zavře soubor data.txt, který jsme předtím otevřeli
$fp = FOpen („data2.txt“, „w“); // otevře soubor data2.txt pro zápis
FWrite ($fp, $data); // uloží obsah proměnné $data do souboru data2.txt
FClose ($fp); // zavře soubor data2.txt

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:

$fp = FOpen („data2.txt“, „w“); // otevře soubor data2.txt pro zápis
if ($fp): // povedlo se soubor otevřít?
FWrite ($fp, $data); // uloží obsah proměnné $data do souboru data2.txt
FClose ($fp); // zavře soubor data2.txt
endif;

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:

if (File_Exists („data.txt“)): // existuje soubor?
$fp = FOpen („data.txt“, „r“); // otevře soubor data.txt pro čtení
$data = FRead ($fp, FileSize („data.txt“)); // načte do proměnné $data obsah souboru data.txt
FClose ($fp); // zavře soubor data.txt
endif;

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:

Pankrác
Servác
Bonifác
Ignác
Pafnuc

Jeho obsah můžeme načíst a zobrazit například následujícím skriptem:

<html>
<head>
<meta http-equiv=“Content-Type“ content=“text/html; charset=windows-1250″>
<title>PHP – ukázka 3</title>
</head>
<body bgcolor=“#FFFFFF“ text=“#000000″>
<center><font face=“Arial CE, Arial“ size=“5″>
<?php
$data = File („data.txt“);
for ($i = 0; $i < Count ($data); $i++) echo „$data[$i]<br>“;
?>
</font></center>
</body>
</html>

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.

5 Příspěvků v diskuzi

  1. podle 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 :)

  2. ah 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…

Odpovědět