Dnes se podívame na to, jak umí PHP soubory na serveru přímo vytvářet. S praktickou ukázkou počitadla přístupů.
28.7.2004 15:00 | Petr Zajíc | přečteno 66786×
PHP umí soubory nejen číst a vkládat do skriptů, ale rovněž
vytvářet. To může být výhodné, pokud potřebujeme uložit nějaké
informace na straně serveru nebo pokud vytváříme aplikaci, která ke své
činnosti potřebuje zapisovat do souborového systému.
Pro vytváření a pohyb v souborech slouží v PHP sada příkazů. Příkaz
fopen
soubor otevře, fread
z něj přečte data, fwrite do
něj data zapíše
a fclose
jej zavře. Funkce file_exists
zjistí, zda daný soubor
existuje. Tady by byla všechna další teorie nudná, takže si pojďme
vytvořit něco praktického.
Součástí našeho webu může být malý textový soubor, který bude obsahovat údaj o počtu shlédnutí naší stránky - takové primitivní počítadlo. Tady je kód, který jej zrealizuje:
<?
define ("NAZEV_SOUBORU", "pocitadlo.txt");
if (file_exists(NAZEV_SOUBORU))
{
$soubor=fopen(NAZEV_SOUBORU, "r+");
$stav=fread($soubor, 10);
}
else
{
$soubor=fopen(NAZEV_SOUBORU, "w");
$stav=0;
}
rewind($soubor);
fwrite($soubor,++$stav,10);
fclose($soubor);
echo "Již máme zaznamenáno $stav
přístupů!!!";
?>
Skript sám je dobře čtivý, musíte si ovšem dát pozor na některé
drobnosti. Především jsme jako název souboru pro uložení počitadla
použili konstantu - to je velmi rozumné, protože časem třeba můžeme
chtít umístění souboru změnit a nikomu by se nechtělo přepisovat jeho
název na mnoha místech. Z programátorských fintiček jsme ještě použili preinkrementaci (++$stav) a automatickou expanzi proměnné
(zaznamenáno $stav přístupů). A teď k práci se souborem:
V zásadě mohou existovat dvě situace: Celý skript se buď spouští
poprvé, nebo již poněkolikáté. Pakliže se spouští prvně, nezbývá než
soubor s počitadlem vytvořit a výchozí stav nastavit na nulu, pokud již
počítací soubor existuje, načteme z něj aktuální stav počitadla pomocí
funkce fread. Funkce fopen přijímá povinný parametr mode, který může
nabývat následujících hodnot (zvýraznil jsem ty, které si pletu, raději
bych uvítal dvoupísmenné hodnoty):
r |
Soubor je otevřen pro čtení,
ukazatel je nastaven na začátek. |
r+ |
Soubor je otevřen pro čtení i pro zápis, ukazatel je nastaven na začátek. |
w |
Soubor je vytvořen a otevřen pro
zápis. Pokud existoval, je zkráce na nulovou délku. |
w+ |
Soubor je vytvořen a otevřen pro čtení i zápis. Pokud existoval, je zkráce na nulovou délku. |
a |
Soubor je otevřen pro
připisování. Ukazatel je nastaven na konec. Pokud neexistuje, pokusí se
PHP soubor vytvořit. |
a+ |
Soubor je otevřen pro čtení nebo připisování. Ukazatel je nastaven na konec. Pokud neexistuje, pokusí se PHP soubor vytvořit. |
Ještě jednou se zmíním o právech k souborům: Na úspěšné vykonání
funkce fopen musíte mít k vytvářenému nebo otevíranému souboru
dostatečná práva. Většinou je mít nebudete na komerčních webhostinzích,
protože správci nedávají uživateli, pod nímž běží PHP příliš rozsáhlá
práva. Takže, na Linuxsoftu by se Vám například vytvoření souboru
nepovedlo. Pokud byste ale měli na serveru účet, mohli byste si soubor
počitadla vytvořit ručně. Ani to Vám však nemusí fungovat, pokud nejste
uživatelem, který spouští PHP. Já jsem například musel aby příklad
fungoval soubor nejprve vytvořit, a pak změnit jeho práva tak, aby do
něj mohl zapisovat a číst z něj kdokoli.
A ještě něco: Pokud požadujete otevřít soubor například v režimu r+
a nemáte k tomu práva, PHP nahlásí neúspěch a nepokusí se otevřít
soubor v žádném jiném režimu (třeba, jen čtení). Myslete na to.
Pozn.: Stav počitadla nebude
souhlasit s číslem určujícím počet shlédnutí tohoto článku. Tam je
použita odlišná filozofie.
Možná vás napdane, co by se stalo, kdyby se do souboru pokusili přistupovat dva uživatelé najednou. V takovém případě by naše jednoduché počitadlo mohlo selhat. V praxi se v takovém případě nasazuje systém zamykání souborů, který se v PHP realizuje příkazem flock.
Častou úlohou související se zpracováním souborů je vytáhnout z nich data (třeba data, která se budou vkládat do databáze). PHP přímo podporuje zpracování souborů s hodnotami oddělenými středníky. Máte-li třeba následující soubor:
Petr;Zajíc;1. máje
6;Liberec
Franta;Jetel;Novodvorská 12;Praha
Pepa;Jouda;Pakoměřice 23;Pakoměřice
můžete jej rozsekat na jednotlivé hodnoty pomocí volání funkce fgetcsv. Následující ukázka to ozřejmí:
Pozn.: Pakoměřice skutečně existují.
<?
$radek = 1;
$soubor = fopen ("30_data.csv","r");
while ($data =
fgetcsv ($soubor, 1000))
{
echo "<p>Zpracovávam
řádek č.$radek: <br>";
$radek++;
foreach ($data as $polozka)
{
print $polozka. "<br>";
}
}
fclose ($soubor);
?>
Příkaz fgetcsv načte řádek a vrátí jej jako pole položek $data. Ta
následně zobrazíme pomocí funkce foreach. Fgetcsv může obsahovat
nepovinný třetí parametr, který specifikuje jiný oddělovač (třeba
tabelátor, středník a podobně).
Pozn.: Většina databází má vlastní
rychlý způsob načítání textových souborů do tabulek, takže to tvrzení v
úvodu berte s rezervou.
Zpracování souborů v PHP zahrnuje daleko více. Za určitých okolností
je možné například:
My se v dalším díle našeho seriálu zaměříme na to, jak nám může PHP pomoci při kopírování souborů na server nebo při stahování souborů ze serveru.