LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> PHP (30) - Počitadlo pomocí souborů

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 | Články autora | přečteno 59360×

Komerční sdělení: Pořádáme Kurzy PHP

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ů!!!";
?>

Spustit skript

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.

Soubory obsahující data

Č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);
?>

Spustit skript

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.

Další možnosti

Zpracování souborů v PHP zahrnuje daleko více. Za určitých okolností je možné například:

  • Otevírat vzdálené soubory pomocí prtokolů HTTP nebo FTP
  • Otevírat porty (třeba COM)
  • Číst ze standardního vstupu nebo zapisovat na standardní výstup
  • Soubory kopírovat, přesouvat, mazat, měnit jim práva a tak dále
  • Soubory šifrovat

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.

Verze pro tisk

pridej.cz

 

DISKUZE

Aktualizace v časových intervalech 22.2.2008 20:25 Dan Pelíšek
L Re: Aktualizace v časových intervalech 22.2.2008 21:20 Ondřej Čečák
  L Re: Aktualizace v časových intervalech 22.2.2008 22:59 Dan Pelíšek
    L Re: Aktualizace v časových intervalech 22.2.2008 23:12 Aleš Hakl
prístupové práva 28.2.2008 18:24 [Peter Szatmary]
  L Re: prístupové práva 28.2.2008 19:02 Aleš Hakl




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

12.7.2016 13:14 /František Kučera
Spolek OpenAlt zve na 130. distribuovaný sraz příznivců svobodného softwaru a otevřených technologií (hardware, 3D tisk, SDR, DIY, makers…), který se bude konat ve čtvrtek 21. července od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

11.7.2016 16:53 /Redakce Linuxsoft.cz
Konference LinuxDays hledá přednášející. Přihlášky poběží do konce prázdnin, v září bude hlasování a program. Více na https://www.linuxdays.cz/2016/cfp/.
Přidat komentář

8.5.2016 17:19 /Redakce Linuxsoft.cz
PR: Dne 26.5.2016 proběhne v Praze konference Cloud computing v praxi. Tématy bude např. nejnovější trendy v oblasti cloudu a cloudových řešení, cloudové služby, infrastruktura cloudu, efektivní využití cloudu, možné nástrahy cloudů a jak se jim vyhnout
Přidat komentář

21.4.2016 8:01 /František Kučera
Spolek OpenAlt zve na 127. distribuovaný sraz příznivců svobodného softwaru a otevřených technologií (hardware, 3D tisk, SDR, DIY, makers…), který se bude konat ve čtvrtek 28. dubna od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

2.3.2016 22:41 /Ondřej Čečák
Letošní ročník konference InstallFest již tento víkend!
Přidat komentář

14.2.2016 16:39 /Redakce Linuxsoft.cz
O víkendu 5. a 6. března 2016 proběhne na pražském Strahově 8. ročník tradiční konference InstallFest. Celkem za dva dny uvidíte ​30 přednášek​ a ​6 workshopů.
Přidat komentář

5.2.2016 17:38 /Petr Ježek
Utilitka z XFce "xfce4-power-manager" nejen umožňuje nastavení lhůty pro uspání či hybernaci, ale i zapínání a vypínání prezentačního módu pro nerušené sledování videí. Stačí ji nastavit v každém vybavenějším panelu a v jakémkoli nontiled WM/DE.
Přidat komentář

10.1.2016 11:32 /Pavel `Goldenfish' Kysilka
LinuxMarket změnil provozovatele. Nově jej provozuje Marek Pszczolka. Více info a detaily #1 a #2.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

28.7.2016 15:51 / pepan
Re: NetBeans vs Eclipse

10.6.2016 21:10 / pavel riha
FreeBSD 10.3 a virtualizace

8.6.2016 21:56 / Milan Gallas
Nevalidní prefix m

7.5.2016 14:58 / Teodor Komárek
Soubory

20.4.2016 0:07 / Jakub Cleing
Sázkový panel PHP FUSION

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2016) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze