PHP – Základy programování

Post on 17-Mar-2016

143 views 5 download

description

PHP – Základy programování. 1. Historie na úvod 2. Instalace a konfigurace 3. Syntaxe PHP 3.1. Proměnné 3.2. Operátory 3.3. Pole 3.4. Struktury příkazů 3.5. Funkce 4. Formuláře 4.1. Prvky formuláře 4.2. Zpracování formuláře v PHP 4.3. Přístup k datům z formuláře 5. Práce se soubory 1 - PowerPoint PPT Presentation

transcript

PHP – Základy programování

Obsah1. Historie na úvod2. Instalace a konfigurace3. Syntaxe PHP

3.1. Proměnné3.2. Operátory3.3. Pole 3.4. Struktury příkazů3.5. Funkce

4. Formuláře4.1. Prvky formuláře4.2. Zpracování formuláře v PHP4.3. Přístup k datům z formuláře

5. Práce se soubory 16. Protokol HTTP

7. Práce s hlavičkami v PHP8. Práce s grafikou v PHP9. Předávání dat do jiných stránek10. Proměnné SESSION11. Cookies12. Použití databází v PHP

12.1. Základní příkazy MySQL12.2. Použití MySQL v PHP12.3. Příklad použití PHP a MYSQL

13. Užitečné informace lze nalézt

1. Historie na úvodStatické stránky1990 – první použití služby WWW, stránky pouze statické, založené na

technologiích1. HTML – jazyk pro zápis webových stránek2. HTTP – přenosový protokol pro přenos HTML-stránek z WWW-serveru do

prohlížeče3. URL – každý objekt přístupný na WWW má jedinečnou adresu URL – lze na něj

odkazovatDynamické stránkynásledovaly inovace - automatické generování stránek proměnlivých v čase – CGI –skripty- ovlivnění chování CGI –skriptů uživatelem – formulářenevýhodou byly pomalé odezvy serveru, náročná správa1996 – Javascript – spouští skripty na lokálním počítači uživatele, nezatěžuje

server, oživení stránek, ověřování vstupních dat, interakce s objekty na stránce, zpracování cookies

1994 – PHP – skripty se provádí na straně serveru, interakce s objekty na serveru (databáze), menší objem přenesených dat, vyšší ochrana zdrojových programů

*uvedeny jsou pouze freeware produkty

2. Instalace a konfiguracePro tvoření a spouštění skriptů PHP na lokálním počítači je nutné nainstalovat:1. Překladač (interpret) jazyka PHP2. Software pro Web server – APACHE3. Databázový systém – MySQLPro zjednodušení lze nainstalovat vše dohromady jako balík PHP Triad, kde jsou vyřešené vzájemné vazby. Je vhodné upravit adresář pro ukládání souborů se skripty v konfiguračním souboru apache/conf/http.conf – parametr DocumentRoot obvykle c:/apache/htdocs/Adresy: www.php.net nebo zrcadlo www.php.czPro psaní programů lze použít Notepad, AceHTML, Phped, HomeSite a další.Jakýkoliv soubor obsahující PHP skript • má příponu .php• je uložen v adresáři obvykle c:/apache/htdocs/• před jeho spuštěním je nutné spustit apache.exe• spouští se v prohlížeči, URL je http://localhost/nazevsouboru.phpKontrolu správné instalace lze provést krátkým skriptem, který zobrazí informace o PHP:

<?phpPHPInfo();?>

3. Syntaxe PHPZpůsoby zápisu skriptů:1. <?php 2. <script language=”php”>

příkazy příkazy ?> </script>

- na velikosti písmen nezáleží, pokud nejsou v uvozovkách nebo apostrofech- psaní poznámek na jenom rádku //, více řádků /*…….*/- příkazy se oddělují středníkem nebo stojí samostatně na řádku- lze používat příkazy HTML zapsané v uvozovkách nebo apostrofech v příkazu echo

nebo lze skript kdekoliv ukončit, vložit kód HTML a vložit opět skript- řetězce lze uzavírat do apostrofů nebo uvozovek, rozdíl je v tom, že řetězce

v apostrofech jsou doslovné, u textu v uvozovkách se názvy proměnných nahrazují jejich aktuálními hodnotami

- znaky se speciálním významem začínají lomítkem - \”, \’, \$, \n – nový řádek- v příkazu echo lze použít řetězce typu HEREDOC – přiřazují text doslovně. Př. echo <<<HTXT

text s příkazy HTXT;

Pozn. - název textu HEREDOC musí začínat v 1.sloupci textu samostatně na řádku AceHTML nezná HEREDOC typ.

3.1. Proměnné

- nedeklarují se, typ proměnné se určí, když do ní přiřadíme hodnotu, automaticky se může konvertovat na jiný typ, existují funkce pro zjištění typu i přetypování proměnné

- základní typy : integer - celé číslo 2 147 483 648 až 2 147 483 647double - reálné číslo -1,7.10308 až +1,7.10308, nejmenší kladné 3,4.10 -324string - řetězec v uvozovkách nebo apostrofecharray – pole, počáteční index je 0 pokud se neurčí jinakobject – objektpokud je hodnota výrazu nenulová má současně hodnotu true, hodnotu false

má číslo 0, prázdný řetězec, pole nebo objekt a ukazatel null- název proměnné začíná značkou $ např. $a, ukazatel na proměnnou začíná

značkou & např. &$a

3.2. Operátory• aritmetické: +, -, *, /, % - zbytek po celočíselném dělení• přiřazovací: =, +=, -=, *=, /=, %=• inkrementace: ++• dekrementace: --• relační: == rovnost, != nerovnost, >=, <=, >, <• shoda hodnoty a datového typu: === stejná hodnota i typ, !== stejná

hodnota nebo stejný typ• logické: ! negace, && nebo and logický součin, || nebo or logický součet• podmíněný operator: podmínka?výraz1:výraz2• spojování řetězců: operator tečka .• operátor čárka , odděluje výrazy – v hlavičce cyklu for• bitové operátoryPříklady použití operátorů

3.3. Poleindexy se automaticky číslují od nuly pokud počátečný index nenastavíme jinakpole může obsahovat současně prvky různých typů – heterogenní polevícerozměrné pole vytváříme jako pole polívytvoření pole: $apole[ ] = 1; $pole[ ] = 2; $pole[ ] = 3; - indexy se zvyšují automaticky $bpole[0] = 1; $pole[1] = 2; $pole[2] = 3; $cpole = array (1,2,3 ); $dpole = array (“leden”,1,2,3 ); $epole = array (2 =>1,2,3 ); - indexy začínají od dvojky $fpole = array (array (1,2,3 ), array (1,2,3 ), array (1,2,3 )) $gpole[2] [3] = 10;asociativní pole má index určený řetězcem $clovek[ “jmeno”] = “Karel”; $clovek[ “prijm”] = “Novak”;funkce pro práci s poli: – count() – vrací počet prvků v policurrent() – vrací aktuální hodnotu indexunext() – posune index na další prvek v polimax(),min() – vrací maximální, minimální prvek v polisort() – setřídí prvky v poleimplode($pole,“oddělovač“) –spojí prvky pole do jednoho řetězce, mezi jednotlivé

prvky vloží oddělovač

3.4. Struktury příkazůPříkazy se oddělují středníkem.Příkaz echo vypíše texty a hodnoty proměnných na stránku. Příkazy HTML napsané v

apostrofech nebo uvozovkách provedePodmínky se píší do kulatých závorek, skupiny příkazů do složených závorek1. podmiňovací příkaz

a) neúplný if (podmínka) { příkazy }b) úplný if (podmínka) { příkazy } else { příkazy }

c) vnořený if (podmínka) { příkazy } elseif (podmínka) { příkazy } else { příkazy }2. vícenásobné větvení

switch (výraz){ case hodnota výrazu1: příkazy; break; case hodnota výrazu2: příkazy; break;

default: příkazy; - nepovinná část }provádí se příkazy ve větvi se stejnou hodnotou jakou má výraz za switch dokud se nenarazí

na break (nepovinný) nebo konec příkazu switchPříklady použití příkazů

3. cyklus whilewhile (podmínka){ příkazy }cyklus se provádí dokud platí podmínka, příkazy se nemusí provést ani jednou

4. cyklus do whiledo{ příkazy }while (podmínka)cyklus se provádí dokud platí podmínka, příkazy se provedou alespoň jednou

5. cyklus forfor (inicializace;podmínka;inkrementace) {příkazy;}for ($i=1;$i<10;$i++) {echo $i;} vypíše čísla 1 až 10for ($i=1, ($s=0;$i<10;$i++,$s+=+$i) echo $i; echo $s; vypíše čísla 1 až 10 a

nakonec jejich součetcyklus se provádí dokud platí podmínkaPříklady použití příkazů

6. cyklus foreach používá se při procházení všemi prvky poleforeach ($pole as $hodnota) {příkazy;} – odkaz pouze na prvek poleforeach ($pole as $index =>$hodnota) {příkazy;} - odkaz na prvek pole i jeho index

7. přerušení cyklua) break – úplné ukončení cyklub) continue – ukončí aktuální průchod cyklu a vrátí se na jeho začátek, cyklus

pokračujec) break počet; continue počet; - opustí několik cyklů najednou

8. příkazy pro vkládání souborůa) require “soubor.php” – vloží soubor, když ho nenajde, fatální chybab) include “soubor.php” – vloží soubor, když ho nenajde vypíše zprávu a pokračuje

dálc) readfile (“text.txt”) – vložení textu ze souborupokud je uveden pouze název volaného souboru, hledá se ve stejném adresáři, ve

kterém je uložen volající soubor - include “soubor.php”, odkaz z na soubor v podadresáři adresáře volající stránky - include“./soubor.php”,odkaz z kořenového adresáře - include “/soubor.php”Příklady použití příkazů

3.5. Funkce- deklarace funkce - deklaruje se kdekoliv před prvním voláním funkce, kulaté závorky

u názvu jsou povinné i když funkce nemá parametry function NAZEV (formální parametry) { příkazy; return hodnota; - nepovinné }- volání funkce NAZEV(skutečné parametry);- funkci lze volat i s menším počtem parametrů něž má uvedeno v deklaraci- funkci lze nadeklarovat se standardní hodnotou parametru- funkce automaticky používají lokální proměnné, když chceme pracovat s globální

proměnnou, máme možnost: a) definovat ji jako globální uvnitř funce – global $proměnná; b) použít pole globálních proměnných $GLOBALS[“proměnná”]c) použít parametr nahrazovaný odkazem v hlavičce deklarace funkce (ukazatel na proměnnou – označen &)

- funkce můžou používat statické proměnné označené static, přiřadí se jim hodnota pouze při prvním volání funkce

Příklady použití funkcí

4. FormulářeJsou jednou z možností jak může komunikovat uživatel (stránka HTML ) se

serverem kde jsou stránky uloženy.

4.1. Prvky formulářePrvky formuláře a jejich vlastnosti si prohledněte v exploreru a ve zdrojovém

kódu souboruFormulář lze vytvořit také dynamicky pomocí příkazů php – příklad

Příklad vytvoření formuláře pro přihlášení nebo registraci

4.2. Zpracování formuláře v PHPAtribut action v příkazu HTML <form> musí odkazovat na skript v php pro jeho

zpracování. Action se provede jako odezva na událost onsubmit.Tato událost nastane např. při zmáčknutí tlačítka typu submit. Pokud je skript i formulář v jednom souboru, lze pro zpracování volat proměnnou PHP_SELF

Př. action = “zpracuj.php” Pokud je skript i formulář v jednom souboru, voláme pro zpracování stejnou

HTML stránku jejíž adresa je vproměnné PHP_SELFPř. action = “<?php PHP_SELF ?>“

Atribut method lze nastavit na get - data z formuláře jsou předávaná přímo v URL a jsou v poli $_GETpost - data z formuláře jsou předávaná v hlavičce http požadavku a jsou v poli

$_POST

4.3. Přístup k datům z formuláře• $jmeno_prvku_formuláře – nevhodné z hlediska bezpečnosti, v souboru

php.ini nastavit parametr register_globals=On• $_GET [“jmeno_prvku_formuláře“] – odeslané metodou get• $_POST [[“jmeno_prvku_formuláře“] ] – odeslané metodou post• $GLOBALS[“jmeno_prvku_formuláře“] - pole globálních proměnných

V proměnných se přenášejí hodnoty parametru value u příslušných prvků formuláře

V proměnné $REMOTE_ADDR je IP adresa počítače, který vyslal požadavek

Příklad vyhodnocení formuláře

5. Práce se soubory 1Informace lze na serveru ukládat do souborů nebo databází.Scripty mohou pracovat se soubory jak celky (kopírování, mazání) nebo s daty

které obsahují (čtení, zápis)

a) manipulace s celými souboryfile_exists (“soubor.dat”) – vrací true, když soubor existujecopy (“zdroj.dat”,”cil.dat”) – kopíruje souborrename (“starejmeno.dat”,”novejmeno.dat”)– přejmenuje souborunlink(“soubor.dat”) – smaže souborV případě, že se příkazy provedou, vrací hodnotu true

b) manipulace s obsahem souboru- otevření souboru $fp=fopen(“zdroj.dat”, režim) – otevře soubor s log. jménem $fp v uvedeném

režimurežimy: r – čtení, r+ - čtení i zápis, w - zápis, w+ - zápis i čtení, a – zápis na

konec souboru, a+ - zápis na konec souboru i čtení- čtení ze souboru$znak = fgetc($fp) – načte znak ze souboru$retezec = fread($fp, 1024) – načte určenou velikost bloku dat do řetězce

5. Práce se soubory 2$radek = fgets($fp, 4096) – načte řádek do řetězce pokud není delší než je

uvedeno$pole = explode(”oddělovač”, $radek ) – rozdělí řádek na řetězce podle

zadaného oddělovače řetězců a uloží je do pole$pole = file($fp) – načte celý soubor do pole – každý řádek je prvek polefilesize($fp) – vrací velikost souborufpassthru($fp) – vypíše obsah souboru na výstup- zápis do souborufwrite($fp, řetězec, délka pokud se nezapisuje celý) – zápis řetězcefputs($fp, znak) - zápis řetězcepráce s ukazatelemrewind($fp) – nastaví ukazatel na začátek souboruftell($fp) – vrací aktuální pozici ukazatelafseek($fp, pozice) – nastaví ukazatel na uvedenou pozici, začátek souboru je 0feof($fp) – vrací true, když je ukazatel na konci souboru- uzavření souborufclose($fp)Příklad použití souboru – počitadlo přístupů Příklad použití souboru – chat

6. Protokol HTTPPro komunikaci mezi prohlížečem a serverem se používá protokol HTTP. Prohlížeč pošle na server požadavek ve formátu:

metoda, hlavičky, prázdná řádkaMetody jsou: GET – získání dokumentu ze serveru POST – odeslání dat z formuláře, za prázdnou řádkou jsou data z formuláře HEAD – zaslání pouze hlaviček PUT – uložení stránky na serveru DELETE – odstranění stránky ze serveru TRACE, CONNECT, OPTIONS – analýza způsobu připojeníHlavička slouží pro přenos doplňujících informací, je ve tvaru jméno_hlavičky : hodnotaPovinná je pouze hlavička je Host:www.server.czServer odešle odpověď ve formátu: protokol, stavový kód, stavové hlášení, hlavičky, prázdná řádka, obsah

odpovědi

7. Práce s hlavičkami v PHP

V PHP lze číst hlavičky, které odeslal prohlížeč, nebo vytvářet hlavičky, které se posílají serveru. V tomto případě je musíme do skriptu vložit před jakýmkoliv výstupem na stránku, nesmí předcházet ani příkaz HTML <head> </head>.

Hlavičky se vkládají funkcí HeaderHeader(“název hlavičky : hodnota”)Př. Header(“Content -type : image/gif”) – skript generuje obrázekHeader(“Location : http://www.jaroska.cz”) – skript nahraje uvedenou stránku

Příklad použití hlavičky pro odkaz na stránku

8. Práce s grafikou v PHPPro použití grafických funkcí je nutné v souboru php.ini smazat středník před řádkem extension=php_gd.dllPostup:1. Určíme obsah stránky jako obrázek

header("Content-type: image/png");2. Vytvoříme prázdný obrázek – zadáme rozměr v pixelech

$img = imagecreate(200, 200);nebo vytvoříme obrázek načtením ze souboru

$img = imagecreatefrompng(“název souboru“);3. Pro vložení textu a kreseb použijeme funkce z manuálu např.

$white = imagecolorallocate($img, 255, 255, 255); nastavení barev$black = imagecolorallocate($img, 0, 0, 0);imagearc($img, 100, 100, 150, 150, 0, 360, $black); nakreslení kružnice

4. Nakreslený obrázek pošleme prohlížečiimagepng($img);

5. Uvolníme paměťimagedestroy($img);

Příklad

9. Předávání dat do jiných stráneka) v adrese URL URL stránky?parametr=hodnota&parametr=hodnotahttp://localhost/test.php?a=1&b=’ahoj‘Příklad použití proměnné následují za znakem ? a jsou oddělené znakem &b) pomocí funkce HeaderHeader(“Location : URL stránky?parametr=hodnota”)Header(“Location : login.php?back=$PHP_SELF”) – návrat z přihlašovací

stránky na původníc) pomocí odkazu (hyperlink)<a href=”soubor.php?a=10&amp;b=’ahoj’></a>d) pomocí formuláře<form action=“soubor.php“ method=“GET/POST“> … </form>přístup k datům $_GET[$jmeno_prvku_formuláře] nebo

$_POST[$jmeno_prvku_formuláře]

10. Proměnné SESSION http je bezstavový protokol – každý požadavek prohlížeče na server je

nezávislý na jiném požadavku, po obsluze požadavku se spojení zruší. Pro udržení spojení – uložení informací o něm (stavové aplikace) lze použít

proměnné session nebo cookies. Postup:a) zahájení volání - na přihlašovací stránku vložíme session_start(); vytvoří se identifikátor spojení 32-místné číslo, které identifikuje volání a uloží

se na serverub) proměnné které charakterizují spojení ukládáme do superglobálního pole

$_SESSIONPř. <?php

session_start(); $_SESSION[“username“] = … ;

?>

10. Proměnné SESSION 2c) na další stránky vložíme přesměrování na přihlašovací stránku, aby jsme

zajistili přístup na stránky pouze z přihlašovací stránkyPř. <?php

if (!$_SESSION[“username“] ) Header(“Location : login.php?back=$PHP_SELF”);

else { pokračování skriptu }

?>d) ukončení volání – funkce session_unset() nebo session_destroy(). Pro

odhlášení také stačí zavřít okno prohlížeče Př. <?php

session_unset ($_SESSION[“username“] );if (!$_SESSION[“username“] )echo “odhášen”?>

Příklad použití je uveden v příkladě aukce obrazů

11. CookiesJsou to řetězce znaků, které lze posílat mezi serverem a prohlížečem v rámci

hlavičky HTTP.Uchovávají se v textových souborech na lokálním počítačia) uložení cookies – možnosti:SetCookie(nazev,hodnota, doba platnosti);Header(“Set-Cookie nazev = hodnota; expires = doba platnosti”);Když se zadá pouze název, je cookies smazáno, když se nezadá doba

platnosti je platné pouze pro dané spojení, doba platnosti se zadává ve vteřinách, které se přičtou k aktuálnímu času získanému funkcí time()

Př. SetCookie(“hlasoval”,“ano“, time()+3600*24*365); - platí 1 roka) čtení cookies - z pole $_COOKIESPř. if ($_COOKIES[“hlasoval”]) {echo “nelze hlasovat vicekrat“;}

12. Použití databází v PHPInformace můžou být uložené na serveru v souborech nebo databázích.

Databází rozumíme data a programy pro práci s nimi. Principy práce PHP s různými databázemi jsou velmi podobné. PHP pro spolupráci s databázemi používá funkce jejichž název začíná zkratkou použité databáze např. MySQL_..., ODBC_... atd. Velmi často se používá databáze MySQL .

Je nutné spustit mysql.exe a WinMySQLadmin.exe.

12.1. Základní příkazy MySQL 11) Vytvoření databáze- součástí instalace MySQL je WinMySQLadmin.exe kde vytvoříme databázi

pomocí nabídky- v editoru mysql.exe příkazem CREATE DATABASE nazevdatab;2) Otevření databáze

USE nazevdatab;3) Vytvoření struktury tabulkyData jsou uložena v tabulkách řádek – věta obsahuje všechny informace o

záznamu v tabulce, sloupec – pole je stejný údaj v každé větě. Primární klíč je pole jehož hodnota je v dané tabulce jedinečná, tj. neexistují dvě věty, které mají stejnou hodnotu v tomto poli.

Při vytváření tabulky se nejdříve navrhne její struktura tj. názvy polí a typ údajů v nich uložen, primární klíč – hodnota určena při definici primary key příp. auto_increment, když ji vytváří procesor automaticky.

Typy polí – INTEGER, FLOAT, DATE, CHAR [délka] – řetězec pevné délky, VACHAR [maxdélka] - řetězec libovolné délky menší než maxdélka, IMAGE, BLOBCREATE TABLE nazevtab ( 1.pole typpole1, 2.pole typpole2, 3.pole typpole3, …);

12.1. Základní příkazy MySQL 24) Vkládání záznamů (vět) do tabulky

INSERT INTO nazevtab ( seznam polí) VALUES (seznam hodnot), (seznam hodnot), …; - vkládají se hodnoty do vyjmenovaných políINSERT INTO nazevtab VALUES (seznam hodnot), (seznam hodnot), …;- vkládají se hodnoty do všech polí v pořadí jak jsou nadeklarované, nic nelze vynechat

5) Změna struktury tabulky- přidání pole na konec věty, na začátek, za konkrétní poleALTER TABLE nazevtab ADD nazevpole typpole; na konec věty

ALTER TABLE nazevtab ADD nazevpole typpole FIRST/AFTER nazevpole; - smazání poleALTER TABLE nazevtab DROP nazevpole;- změna definice poleALTER TABLE nazevtab MODIFY nazevpole novytyppole;

12.1. Základní příkazy MySQL 36) Výběr a zobrazení záznamů

SELECT seznam polí FROM seznam tabulekWHERE podmínkaORDERED BY uspořádání podle pole;

lze použít i další funkce – SUM, MAX, …7) Aktualizace záznamů

UPDATE nazevtab SET nazevpole=hodnota WHERE podmínka;8) Mazání záznamů

DELETE FROM nazevtab; - smaže všechny záznamyDELETE FROM nazevtab WHERE podmínka; - smaže záznamy, které splňují podmínku

9) Mazání databáze a tabulkyDROP DATABASE nazevdatab;DROP TABLE nazevtab;

12.2. Použití MySQL v PHP 11) Připojení k serveru MySQL

$spojeni=MySQL_Connect(server,uživatel,heslo); nebo stačí$spojeni=MySQL_Connect(“localhost“);

v proměnné $spojeni je číslo, které identifikuje připojení k serveru

2) Výběr databázeMySQL_Select_DB (nazevdatab);

3) Příkazy pro práci se záznamy$vysledek=MySQL_Query(“příkaz MySQL“, $spojeni); nebo stačí$vysledek=MySQL_Query(“příkaz MySQL“); když pracujeme s jednou databází

v proměnné $vysledek je číslo, které identifikuje výsledek, můžeme se na něj odvolávat u dalších funkcí

počet záznamů ve výsledku vrací funkce MySQL_Num_Rows($vysledek)

12.2. Použití MySQL v PHP 2přístup k jednotlivým záznamům poskytuje funkce

MySQL_Fetch_Array(($vysledek) – vrací jeden řádek tabulky uložený do asociativního pole řetězců, prázdný řetězec má hodnotu false

Př. výpis záznamů tabulky while ($zaznam=MySQL_ Fetch_Array($vysledek))

{ foreach ($zaznam as $hodnota) echo $hodnota;echo “<br />”; }

4) Ukončení připojeníMySQL_Close($spojeni);

12.3. Příklad použití PHP a MYSQLPoužití MySQL v PHP je předvedeno na rozsáhlejším příkladě – zadání je zde. Dílčí kroky jsou vysvětlené v příkladech:Příklad vytvoření formuláře pro přihlášení nebo registraciPříklady vytvoření tabulkyŘešení je zde. Celý adresář je nutné zkopírovat do adresáře apache/htdocsPostup:1. Vytvoříme databázi aukce pomoci WinMySQLadmin2. V databázi vytvoříme struktury tabulek obrazy a users spuštěním programů

vytstrtabobr.php a vystrtabu.php3. Vložíme záznamy do tabulky obrazy spuštěním programu vlozobrazy.php 4. Přihlášení anebo registrování se provede spuštěním programu prvni.php

13. Užitečné informace lze nalézt

• http://php.kn.vutbr.cz/to.en/manual/cs/index.php• http://www.tizag.com/phpT/• http://www.tvorba-webu.cz/php.php3• http://www.linuxsoft.cz/php/• http://interval.cz/clanek.asp?article=252