Zpět

Začínáme s PHP - díl 1.

Úvod, syntaxe, prostředí a formuláře

Právě jste otevřeli první díl seriálu o tvorbě dynamických doplňků na webové stránky. Vysvětlíme si v něm základy PHP, naučíme se pracovat s formuláři v HTML, povíme si něco o prostředí a předávání dat mezi stránkami a nakonec si sestrojíme jednoduché udělátko na posílání e-mailů.

Předpokládám alespoň základní znalost jazyka HTML, tj. že jednoduchou statickou stránku dokážete napsat bez problémů.

Co to je PHP?

Stručně řečeno, je to skriptovací jazyk, jehož výstupem je HTML kód. Čili něco, co běží na straně serveru, na základě nějakých vstupů to vygeneruje webovou stránku a pošle ji to do prohlížeče návštěvníka. Ten vidí už jenom výsledné HTML, ve kterém není po PHP ani památky (tedy kromě toho, že stránka má koncovku .php a ne .htm).

K čemu je PHP dobré?

K tvorbě dynamických stránek. To znamená, že obsah stránek nemusí být předem daný, ale dá se vytvářet průběžně: návštěvní knihy, fóra, redakční systémy, informační servery a další - to všechno je psané jenom jako kostra, do které se obsah dopisuje podle potřeby a o jeho zobrazování se starají serverové skripty. A ty bývají často psány právě v PHP.

Důležitou vlastností PHP je, že umí komunikovat s databázemi, což je obvykle to, do čeho se všechna ta data zaslaná návštěvníky ukládají.

Jo, to chci. Co všechno k tomu potřebuju?

O nic víc, než co potřebujete na tvorbu obyčejné stránky: textový editor (pro začátek postačí třeba i obyčejný Poznámkový blok, ale lepší je samozřejmě něco, co umí zvýrazňovat syntaxi), server, na který své výtvory nahrajete (je potřeba, aby PHP zvládal, ale to je dnes prakticky samozřejmost), a internetový prohlížeč, ve kterém si zkontrolujete výsledky.

S kontrolováním už to bohužel není tak jednoduché jako u statického HTML, protože PHP kód si nemůžete jen tak offline spustit v prohlížeči. Máte dvě možnosti: buď stránku po každé změně nahrát na server a prohlédnout si ji online, nebo si serverový program (Apache) nainstalovat na svůj počítač. První je jednodušší a pro začátečníky asi vhodnější, ale z dlouhodobého hlediska o něco těžkopádnější. Druhá se vyplatí při tvorbě složitějších systémů se spoustou souborů a hlavně umožňuje všechno i bez přístupu k síti předem odladit a na server potom nahrávat až plně funkční verzi. Tak si vyberte.

Především ovšem potřebujete znát HTML. PHP ho nenahrazuje, je to jenom prostředek, jak HTML vygenerovat, ale vymyslet ho stejně musíte vy.

Jak se PHP píše?

Vkládá se do HTML. Je na to speciální pseudotag, který vypadá takhle:

<?php ... ?>
Na místo tří teček přijde vlastní PHP kód. Místo "<?php" se dá psát jenom "<?", ale jestli chcete jistotu, že to poběží na jakémkoli serveru, radši používejte plnou variantu.

Pseudo proto, že se narozdíl od normálních tagů jazyka HTML na výslednou stránku vůbec nedostane, protože ho server sežere, vyhodnotí a nahradí případným výstupem.

Jak PHP vypadá?

Syntaxe vychází z jazyka C, ale má několik odlišností:

Základy syntaxe

Interpret PHP ignoruje veškeré "bílé místo" (mezery, konce řádků a komentáře), takže si můžete libovolně odsazovat, vynechávat řádky, komentovat, cpát víc příkazů na jeden řádek a tak dále. Prostě standardní chování.

Každý příkaz musí být zakončený středníkem, stejně jako v C. Středník je součástí příkazu - když ho vynecháte, nebude to příkaz, ale výraz. Pascalisti, pozor: středník se píše i za příkazem před else!

Identifikátory se mohou skládat z písmen, číslic a podtržítek - jako obvykle.

Rozlišuje se velikost písmen v identifikátorech a klíčových slovech. Tedy např. if, If a IF jsou tři různé věci. Všechna klíčová slova a jména standardních funkcí se píší malými písmeny, na výjimky (Array(), $_GET[] apod.) včas upozorním.

Proměnné jsou vždy lokální a zanikají na konci bloku, tj. funkce nebo skriptu. Globální proměnnou dostaneme do funkce pomocí slovíčka global, ale o tom si povíme až později.

Co když udělám chybu?

Skript se neprovede, parser všechny syntaktické chyby odchytí ještě před jeho spuštěním. Další postup závisí na tom, jestli máte povolené nebo zakázané hlášení chyb. Když je zakázané, zobrazí se naprosto prázdná stránka (ve zdrojáku není ani písmenko). Když je povolené, vypíše se chybová hláška. Z ní se dozvíte číslo řádku, na kterém k chybě došlo, a typ chyby - například něco jako "Unexpected T_ELSE in soubor.php on line 53". Většinou pak chybu najdete a opravíte celkem rychle (tedy pokud zrovna nepoužíváte nějaký editor, který neumí vypočítat číslo řádku), ale může se stát, že skutečná chyba je o několik řádků výš a až tady se projevila, a takové se hledají hůř.

Aktuální nastavení hlášení chyb najdete v proměnné display_errors; globálně si ho můžete nastavit v souboru .htaccess, do kterého napíšete:

php_flag display_errors on
nebo off pro vypnutí. Soubor .htaccess nahrajte do kořenového adresáře svého webu. Mimochodem, tohle jméno se vám pod Windows normálně napsat nepodaří, takže si ho pojmenujte třeba htaccess.txt a přejmenujte ho až na serveru.

Dost teorie, chci příklad!

Čím jiným začít, než klasickým "Hello world"? Skript může vypadat třeba takhle:

<html>
<body>
<!--komentář HTML-->
<p>Tohle je psáno staticky.</p>
<?php
//náš první výstup:
echo '<p>Tohle napsalo PHP.</p>';
?>
</body>
</html>

Uložíme do textového souboru s koncovkou php, odešleme na server a vyťukáme adresu. Server si PHP přežvýká a do prohlížeče odešle výsledek, jehož zdrojový kód bude vypadat takhle:

<html>
<body>
<!--komentář HTML-->
<p>Tohle je psáno staticky.</p>
<p>Tohle napsalo PHP.</p>
</body>
</html>

Tím jsme se naučili první a nejdůležitější příkaz: echo, čili vypsání textu na stránku. Kolem parametru může být i závorka, ale není to nutné. Středník na konci ovšem nutný je.

Potom tu máme řádek "//náš první výstup:" - to je komentář. Komentáře jsou v PHP stejné jako v C: /*první typ*/, který se dá táhnout přes několik řádků, a //druhý, jednořádkový.

Jako parametr jsme echu dali textový řetězec (string). Ten můžeme zapsat dvěma způsoby: 'takhle' nebo "takhle". V apostrofové variantě se dají napsat jakékoli znaky kromě samotného apostrofu (ten se píše jako \') a budou se brát přesně tak, jak jsou zapsané. V uvozovkové se dají volně psát apostrofy (a naopak uvozovky se musí escapovat: \") a proměnné a speciální znaky se tam automaticky rozbalují. To znamená:

<body>
<?php
$hodnota=10; //tímhle jsme si vytvořili proměnnou $hodnota a přiřadili jsme jí hodnotu 10
echo '\nText \n s "promennou" o \'hodnote\' $hodnota';
echo "\nText \n s 'promennou' o \"hodnote\" $hodnota";
?>
</body>

Výsledkem bude:

<body>
\nText \n s "promennou" o 'hodnote' $hodnota
Text 
 s 'promennou' o "hodnote" 10
</body>

Jak vidíte, = je přiřazovací operátor. Pozor, porovnávací "rovná se" vypadá jinak (o tom si povíme za chvíli).

Kód \n znamená konec řádku (znak LF, tj. #10). Ale vzhledem k tomu, že se v prohlížeči stejně konce řádků zobrazují jako mezery, nemusíte si ho pamatovat - pro zalomení řádku stačí vypsat příslušný tag (<br> nebo konec odstavce).

Pro zadávání speciálních znaků se používá prefix \ (escape character). V apostrofových textech bude vyhodnocen pouze \' (přeloží se jako '), ostatní se zobrazí tak, jak jsou napsány. V uvozovkových textech se vyhodnocují všechny. Kdybyste potřebovali napsat znak $, napište \$, aby se nevyhodnotil jako začátek jména proměnné.

Apostrofová notace se hodí v případě, že chcete vypsat text obsahující hodně uvozovek (např. HTML tagy), uvozovková zase na texty plné apostrofů (např. příkazy SQL - o těch si povíme jindy), abyste nemuseli moc \ovat.

Skládání řetězců z hodnot proměnných (a skládání řetězců obecně) se ovšem dá řešit i jinak:

$pocet=40;
echo 'Alibaba, '.'Alidědek a '.$pocet." loupežníků";

vyjde:

Alibaba, Alidědek a 40 loupežníků

Operátor pro spojování řetězců je tečka, plus se používá pouze pro sčítání čísel. Kvůli automatickým převodům typů je potřeba to takhle odlišit - viz příklad:

$a=10;
$b=35;
$c='10';
$d='35';
$vysledek1=$a+$b; //vyjde 45
$vysledek2=$a.$b; //vyjde '1035'
$vysledek3=$c+$d; //vyjde 45
$vysledek4=$c.$d; //vyjde '1035'

Pokud by vás zajímalo, jaký operátor se používá na přístup k položkám struktur a objektů, když je tečka na tohle, tak je to -> ($objekt->metoda() apod.). Ale tyhle věci zatím potřebovat nebudeme.

Když už jsme u stringů, existuje ještě jedna lahůdka pro pohodlný zápis dlouhých víceřádkových textů:

$retezec = <<<ukoncovac1
Tohle je obsah řetězce.
 Rozbalování proměnných a kódů funguje jako u řetězců v "uvozovkách".
  Ukončuje se identifikátorem uvedeným na začátku:
ukoncovac1;

nebo:

$retezec = <<<'ukoncovac2'
Tohle je obsah řetězce.
 Proměnné ani kódy se nerozbalují, podobně jako v řetězcích v 'apostrofech'.
Ukončuje se identifikátorem uvedeným na začátku, tentokrát bez apostrofů:
ukoncovac2;

V praxi jsem to ale ještě neviděl ani nepoužil.

Dost bylo stringů, teď ještě pár obecných věcí.

Když píšu "skript", myslím tím celý jeden soubor s koncovkou php.

Úseků <?php ... ?> může být v jednom skriptu libovolné množství, vyhodnocují se odshora dolů a úseky statického HTML mezi nimi fungují de facto jako kdyby byly obalené v echu. ?> funguje jako implicitní středník, tj. a) nemusíte příkaz bezprostředně před ním ukončovat středníkem a b) nemůžete takhle přepínat do statického HTML v místech, kde středník mít nechcete.

Všechny proměnné na konci skriptu zanikají. Pro výměnu dat mezi skripty je potřeba použít jiných metod, což je kapitola sama o sobě, kterou si popíšeme hned za chvíli. Nejdřív si ale musíme říct něco o polích.

Pole v PHP se značí identifikátorem začínajícím na $ a indexem v [hranatých závorkách]. Deklaraci ani délku neřešte, všechna pole jsou dynamická - prostě do něj na libovolnou pozici cokoli uložte a délka se automaticky podle potřeby zvětší. To je první rozdíl oproti "normálním" programovacím jazykům. Druhý je, že typy prvků pole nemusí být všechny stejné - můžete dát třeba na první pozici číslo, na druhou řetězec, na třetí jiné pole a podobně. A do třetice všeho dobrého, není omezen ani typ indexu - pole můžete indexovat klidně i řetězcem. Příklad:

$pole[1]=100;
$pole[2]='houba';
$pole[100]="x";
$pole['fujtajxl']=-150;
$i=3*100;
$pole[$i+10]=3.1416;

Pro pohodlnější zápis několika prvků pole najednou slouží funkce Array (jo, opravdu má velké první písmeno). Podrobně ji popíšu někdy příště, zatím si ji můžete najít třeba v manuálu.

Moment, kde ten manuál najdu?

Na adrese www.php.net. Dobře si ji zapamatujte, budete tam pravděpodobně brouzdat každou chvíli. Vpravo nahoře je vyhledávací formulář, do kterého napíšete jméno, vyberete oblast hledání (pro jména funkcí samozřejmě "function list"), odpálíte a můžete číst. Pro hledání podle kapitol a čtení popořadě slouží odkaz Documentation. Hodí se umět anglicky - český překlad sice existuje, ale není úplný.

Jak že funguje to předávání dat mezi skripty?

Normálními proměnnými to nejde. Celkem máme asi tak šest možností:

Metoda GET

Data předávaná přes adresní řádek. Třeba:

http://www.stranka.cz/index.php?clanek=10&jazyk=cesky

Tím jsme skriptu index.php předali proměnnou "clanek" s hodnotou "10" a proměnnou "jazyk" s hodnotou "cesky". Uvnitř skriptu se k těmto proměnným dostaneme takto:

$x = $_GET['clanek']; //dostaneme "10"
$y = $_GET['jazyk']; //dostaneme "cesky"

$_GET je superglobální pole, ve kterém jsou uloženy všechny proměnné z adresního řádku. Superglobální proto, že je narozdíl od obyčejných proměnných přístupné odkudkoli z každého skriptu, i uvnitř funkcí a bez direktivy global. Pozor na velká písmena ve jméně! Indexem tohoto pole jsou jména proměnných (to před =) a hodnotami hodnoty těchto proměnných (to za =).

Kromě přímého napsání adresy nebo kliknutí na odkaz se dají data pro GET vygenerovat i formulářem. Stejný efekt jako výše uvedený odkaz bude mít tento formulář:

<form action="http://www.stranka.cz/index.php" method="get">
<input type="text" name="clanek" value="10">
<input type="hidden" name="jazyk" value="cesky">
<input type="submit" value="Zobraz vybraný článek v češtině">
</form>

Tag form znamená formulář. Atribut action říká, na jakou stránku se má po odeslání formuláře přejít (a předat jí zadaná data). Atribut method říká, že se má použít metoda GET. Kdybychom ho vynechali, nic se neděje, protože get je defaultní hodnota.
Inputy jsou prvky formuláře. Atribut type určuje, co to je: text je textové políčko, hidden je prakticky totéž, ale neviditelné (pro předávání předem daných dat), submit je odesílací tlačítko. Atribut name odpovídá jménu proměnné, atribut value její hodnotě. U submitu je value text zobrazený na tlačítku. Pokud tlačítko nemá uveden atribut name, v odeslaných datech se nijak neprojeví. Pokud ano, přidá k nim ještě proměnnou se jménem stejným jako jeho name a s hodnotou stejnou jako value. Do jednoho formuláře tedy můžeme dát víc odesílacích tlačítek a při vyhodnocování je rozpoznat podle toho, že proměnná přijde jenom od toho tlačítka, které bylo stisknuto.

Výhody GETu:

Nevýhody:

Použití:

Metoda POST

Data z formulářů posílaná z prohlížeče na server samostatným kanálem, nezávisle na adrese. Posílat se dají pouze z formulářů. Např.:

<form action="http://www.stranka.cz/index.php" method="post">
<input type="text" name="clanek" value="10">
<input type="hidden" name="jazyk" value="cesky">
<input type="submit" value="Zobraz vybraný článek v češtině">
</form>

Účinek bude stejný jako v minulém příkladě, ale k adrese se nic nepřidá a ve skriptu index.php potom data najdete v superglobálním poli $_POST:

$x = $_POST['clanek']; //vyjde "10"
$y = $_POST['jazyk']; //vyjde "cesky"

Výhody:

Nevýhody:

Použití:

Cookies

Data ukládaná do speciálních souborů na počítač uživatele (konkrétní podoba závisí na prohlížeči, uživatel do nich obvykle nevidí). S formuláři nemají nic společného, skripty je vytvářejí pomocí speciálních funkcí.

Výhody:

Nevýhody:

Použití:

Sessions

Data krátkodobě uložená ve speciálních cookies, po zavření prohlížeče obvykle zmizí. Opět nejsou vázána na formuláře.

Výhody:

Nevýhody:

Použití:

Soubory

PHP má na práci se soubory na serveru sadu funkcí podobnou Céčku, ale je to docela komplikované. V praxi si ale asi dlouho vystačíte jenom s funkcemi, které načtou celý textový soubor do řetězce nebo pole.

Výhody:

Nevýhody:

Použití:

Databáze

Asi nejpoužívanější způsob trvalého ukládání dat. Obsluhuje se pomocí speciálního dotazovacího jazyka, nejčastěji SQL (Structured Query Language). Úvod do databází zabere několik dalších dílů tohoto seriálu, tady jenom stručně shrnu základní vlastnosti.

Výhody:

Nevýhody:

Použití:

Dobře, chápu - a co takhle nějaký reálný příklad?

Právě se k němu dostáváme. Postupně si ukážeme, jak svoje stránky obohatit o různé dynamické doplňky. Začneme tím nejjednodušším: formulářem pro odesílání e-mailů.

Potřebovat budeme dvě věci:

  1. Stránku s formulářem, do kterého návštěvník napíše text mailu.
  2. Skript, který data z formuláře vyhodnotí a odešle.

Dejme tomu, že chceme všechny maily odesílat na pevně danou adresu a že by kromě textu zprávy měl jít odděleně zadat ještě předmět a adresa odesilatele. Formulář potom může vypadat třeba takhle:

<form action="odeslimejl.php" method="post">

Bude to formulář, který zadaná data pošle skriptu odeslimejl.php, a to metodou POST (nechceme, aby se text zprávy cpal do adresního řádku).

Vaše adresa: <input type="text" name="od" size="40" maxlength="40" value="@"><br>

Textové políčko pro zadání adresy odesilatele. Příslušná proměnná se bude jmenovat $_POST['od'] a maximální délka zadávaného textu je atributem maxlength omezena na 40 znaků (to není nutnost, prostě jsem si to tak zvolil). Atribut size říká, jak je políčko na obrazovce široké (pokud je vložený text delší, posouvá se). Do políčka jsme předpřipravili zavináč pro lidi, co jsou líní ho psát nebo to neumějí.

Předmět zprávy: <input type="text" name="predmet" maxlength="50" size="40"><br>

Políčko pro zadání předmětu. Proměnná se bude jmenovat $_POST['predmet'] a délku jsem pro jistotu omezil na 50 znaků. Šířku jsem dal stejnou jako u předchozího políčka. Políčko necháme prázdné, v případě potřeby by šel nějaký text opět vložit atributem value.

Zpráva:<br>
<textarea name="zprava" rows="6" cols="60" wrap="soft">(sem to napište)</textarea><br>

Víceřádkové textové pole pro zadání textu zprávy. Proměnná se bude jmenovat $_POST['zprava'] a bude to obyčejný řetězec, stejně jako z inputů typu text. Velikost pole jsme nastavili na 6 řádků krát 60 sloupců. Zadaný text může být i delší, v takovém případě se v poli objeví posuvník. Parametr wrap="soft" určuje, že se řádky mají v textovém poli automaticky zalamovat, ale že se takto vzniklá zalomení nemají považovat za skutečné konce řádků. Další možné hodnoty jsou hard (automatická zalomení se během odesílání formuláře převedou na opravdové entery, čili \n) a off (řádky se nezalamují; když jsou moc dlouhé, objeví se vodorovný posuvník). Uvnitř pole bude text "(sem to napište)"; v praxi se to obvykle nedělá, dal jsem ho tam jenom pro ilustraci, že to jde.

<input type="submit" value="Odeslat">

Tlačítko s textem "Odeslat". Jeho zmáčknutím se formulář odešle.

</form>

Ukončení formuláře. Mimochodem, formulář se chová podobně jako odstavec typu div nebo p - taky se před ním a za ním automaticky zalomí řádek.

Výsledek dopadne nějak takhle (to, co vidíte tady, je standardní výchozí vzhled bez jakýchkoli úprav; změnit by se dal pomocí CSS):

Vaše adresa:
Předmět zprávy:
Zpráva:

Odesláním formuláře se přejde na skript odeslimejl.php, který by měl zadaná data nějak převzít a poslat. V nejjednodušším případě by mohl vypadat například takto:

<?php
mail('mojeadresa@nekde.cz',$_POST['predmet'],$_POST['zprava']);
?>

mail() je standardní PHPčkovská funkce na odesílání e-mailů (nečekaně :-) ). První parametr je cílová adresa, v našem případě jsme si napevno zvolili "mojeadresa@nekde.cz". Druhý parametr je předmět zprávy, za který jsme dosadili zadaný text z textového políčka "predmet". Třetím parametrem je text zprávy a jak vidíte, s víceřádkovým textem z textarea se zachází úplně stejně jako s řádkem z jednoduchého políčka.

No jo, ale k čemu jsme vlastně chtěli adresu odesilatele ($_POST['od'])? Technicky vzato je to vlastně jedno, protože skutečným odesilatelem je náš webový server (např. na IC je to www-data@ic.cz, na Endoře mailer@lemra.miton.cz nebo zakaznik@srv4.endora.cz atd.). Ale my coby živí lidé bychom třeba chtěli pisateli odpovědět a na to už je potřeba adresu znát. Teoreticky bychom mohli adresu zadat hlavičkou v nepovinném čtvrtém parametru funkce, ale tím se teď nemusíme zatěžovat - stačí ji prostě přiložit k textu zprávy a při odpovídání si ji odtamtud ručně zkopírovat:

mail('mojeadresa@nekde.cz',$_POST['predmet'],$_POST['od'].': '.$_POST['zprava']);

Jediný důvod, proč je vhodné pro adresu vyčlenit samostatné políčko, je ten, že je potřeba pisatele na nutnost zadání adresy nějakým způsobem upozornit, jinak by ho to třeba vůbec nemuselo napadnout (nevím jak vy, ale mě když se formulář na něco nezeptá, tak jaksi automaticky předpokládám, že už to ví :-]).

Tím tedy máme skript, který při každém spuštění odešle mail. Ale to vlastně nechceme - lepší by bylo, kdyby se spouštěl jenom ve chvíli, kdy nějaká data k odeslání skutečně dostal. Tedy jen pokud proměnné $_POST['predmet'], $_POST['od'] a $_POST['zprava'] existují a pokud zpráva není prázdná.

Existence proměnné se v PHP ověří funkcí isset(), test prázdnosti provedeme porovnáním s prázdným řetězcem. Konstrukce pro větvení se jmenuje jako obvykle "if" a podmínka se píše do závorky, za kterou není žádné "then", stejně jako v C:

if (podmínka) příkaz;

Pokud je víc příkazů než jeden, napíšou se buď po céčkovsku do složených závorek:

if (podmínka)
 {
 příkaz;
 příkaz;
 }

nebo speciální phpčkovskou dvojtečkovou syntaxí:

if (podmínka):
 příkaz;
 příkaz;
endif;

Můžete si vybrat, funguje to úplně stejně. Já coby pascalista složené závorky moc nemusím, někteří ortodoxní céčkaři naopak nesnášejí dvojtečky. Faktem ovšem je, že závorky se obecně používají častěji.

Takže tedy upravené odesílání mailu s testem vstupů:

if ( isset($_POST['zprava'])         //existuje proměnná se zprávou?
     and ($_POST['zprava']<>'')      //a je v ní něco? (prázdné zprávy nechceme)
     and isset($_POST['od'])         //existuje proměnná s adresou?
     and isset($_POST['predmet']) )  //existuje proměnná s předmětem?
 mail('mojeadresa@nekde.cz',$_POST['predmet'],$_POST['od'].': '.$_POST['zprava']);

Testem existence všech tří proměnných jsme ověřili, že data skutečně pocházejí z našeho třípolíčkového formuláře a že skript nespustil naprázdno třeba náhodný kolemjdoucí robot. To, jestli dovolíme, aby ty proměnné byly prázdné, už je čistě jenom naše věc.

Objevily se nám tu dva nové operátory:

Pro úplnost ještě doplním:

Priorita operátorů je popsaná někde v manuálu, ale protože jsem líný si ji pamatovat, závorkuju všude, kde si nejsem jistý (třeba tady u toho <>) - tím se rozhodně nic nezkazí.

Tím jsme se tedy zbavili prázdných e-mailů. Ovšem pořád ještě to není úplně ono: po odeslání mailu zůstane v prohlížeči zobrazena prázdná bílá stránka, protože odesílací skript nevygeneroval žádný HTML výstup. Lepší by bylo, kdyby nás po úspěšném odeslání vrátil zpátky na odesílací formulář, nebo prostě někam, kam se nám to hodí.

Přeskočení na jinou stránku se dá zařídit odesláním hlavičky HTTP pomocí funkce header(), a to takhle:
header('Location: stranka.htm');

Tím se přejde na soubor stranka.htm (jméno i koncovka jsou jenom příklad, obecně mohou být jakékoli a jde to napsat i komplet s cestou). Prohlížeč (vlastně ještě server) po obdržení hlavičky zapomene na rozjetý skript a přejde na zadaný soubor, asi jako kdyby uživatel zrušil načítání a napsal do adresního řádku novou adresu. Ovšem pozor, má to jeden háček: funkci header() můžeme používat pouze tehdy, když jsme ještě žádné jiné HTTP hlavičky neodeslali. K automatickému odeslání hlaviček dojde v případě, že se něco vypíše na stránku - buď echem nebo statickým HTML kódem mimo úseky PHP. To znamená, že jestli chcete ze skriptu vyskakovat, musí začínat kódem <?php a až do zavolání headeru se nesmí objevit žádné echo (jinak dostanete zprávu říkající něco ve smyslu "headers already sent").

Další otázka, která by vás mohla napadnout, je: musíme mít formulář a odesílací skript ve dvou oddělených souborech? Odpověď je: ne. Klidně si je slučte do jednoho, atribut action může mířit na ten samý soubor, ze kterého vyšel. Potom můžete vynechat šaškárnu s voláním header(), neomezovat se s echy a třeba ještě před formulář (nebo místo něj) vypsat zprávu o úspěšném nebo neúspěšném odeslání. Jo, na to bych málem zapomněl: mail() je funkce a jako taková dává návratovou hodnotu: při úspěchu true, při neúspěchu false. Takže se dá napsat třeba if (mail(...)) echo "OK"; else echo "K.O.";.

Poslední možný zádrhel je kódování češtiny. Z formuláře text vyleze v takovém kódování, jaké máte nastavené v hlavičce stránky (pokud ho tam uvedené nemáte, použije se výchozí podle aktuálního nastavení prohlížeče). Přes skripty a servery proleze beze změny, ale na straně příjemce se správně zobrazí jedině tehdy, když má rozhraní jeho mailové stránky zrovna nastaveno stejné kódování jako vaše stránka s formulářem, což rozhodně nemusí vždy platit. Jestli stejné kódování nemá, zobrazí se místo češtiny rozsypaný čaj (konkrétní vzhled záleží na prohlížeči). Co s tím? Je potřeba do čtvrtého parametru funkce mail() vložit hlavičku určující kódování. Např. pro znakovou sadu Windows-1250 by to vypadalo takhle:

mail('mojeadresa@nekde.cz','předmět','zprávička','Content-Type: text/plain; charset="windows-1250"');

Tím máme ohledně háček a čárků vystaráno.

Také je dobré systém nějakým způsobem zabezpečit proti robotům, jinak by vám mohli zaspamovat schránku. Ale to necháme na jindy, až se budeme bavit o návštěvních knihách.

Co dál?

Za domácí úkol si procvičte používání formulářů, budou se vám hodit (podrobné informace najdete třeba na JakPsatWeb nebo Devbooku). Napište si pár jednoduchých skriptů, zorientujte se v manuálu k PHP, připravte si pokusné prostředí (třeba stránku na nějakém freeserveru) a hrajte si. Potom můžete pokračovat druhým dílem tohoto seriálu - dynamické sestavování stránek.

Zpět

Reklamy:
„Žádný člověk není tak bohatý, aby mohl koupit svoji minulost.“ Oscar Wilde