PHP v spolupráci s MS Excel

1. Úvod

Než sa hlbšie ponoríme do tajov jazyka PHP, bolo by vhodné najprv sa stručne zoznámiť s jeho históriou, ak sa to tak vôbec dá povedať.  PHP sa zrodilo niekedy v roku 1994 a vznikol ako program v Perle, ktorý slúžil na evidenciu prístupov k WWW stránkam pána Rasmusa Lerdorfa, ktorý bol jeho pôvodným autorom. Nakoľko však Perl ako interpretovaný jazyk priveľmi zaťažoval WWW server, autor svoj software prepísal do jazyka C. Postupne ho používalo čoraz viac ľudí, stával sa viac a viac obľúbenejším a autor bol doslova donútený vydať k svojmu dielku dokumentáciu. Systém bol neskôr rozšírený o požiadavky jeho používateľov a bol uvolnený pod názvom Personal Home Page Tools.  Po zabudovaní SQL modulu, ktorý umožňoval PHP spolupracovať s databázami a vytvárať formuláre sa názov zmenil na Personal Home Page Form Interpreter PHP/FI. Tento systém vznikol ako kompilát prvotného PHP a programu, ktorý sprístupňoval výsledky databázových dopytov na Webe (Form Interpreter). Tak vznikol PHP/FI 2.0. V roku 2000 bola vydaná posledná verzia rady PHP 3.x. Oproti svojim predchodcom sa celý systém zrýchlil a rozšíril a kopec rôznych funkcií. Dnes najčastejšie používaná verzia PHP je verzia 4.x, ktorej základ tvorí jadro s názvom Zend.

Príklad 1-1. Prvý príklad
  1 
  2 <html>
  3 <head>
  4 <title>Príklad</title>
  5 </head>
  6 <body>
  7 <?php echo "Hi, Som PHP script!"; ?>
  8 </body>
  9 </html> 
 10

PHP sa týmto líši od CGI skriptov napísaných v Perle alebo C jazyku -- namiesto písania množstva kódu pre výpis HTML stačí napísať HTML kód, medzi ktorý je zakomponovaný príkaz PHP (ktorý v tomto prípade vypíše text). PHP kód sa začína a končí špeciálnym štartovacím a ukončovacím tagom <?php a ?> ktorý umožní skočiť do a z PHP módu. Aj keď je to síce smiešne - ale táto črta jazyka umožní začiatočníkom písať rýchlo výkonné PHP/HTML stránky - ale pri správe kódu je to veľmi nešťastné riešenie...

Čo odlišuje PHP od Javascriptu je, že tento jazyk je vykonávaný na strane servera. Ak sa spustí PHP skript na serveri, klientský prehliadač by dostal len výsledok behu skriptu, konkrétne kompletnú stranu v jazyku HTML. Jazyku HTML rozumie skoro každý prehliadač, čo sa o klient-side skriptoch akým je napríklad JAVASCRIPT povedať nedá.

Verzia jadra PHP, ktoré je vyvíjané pod kódovým názvom ZEND je základom tohto populárneho skriptového jazyka už od verzie PHP 4.0. Dnes je Zend vo verzii 2.0 momentálne už treťou verziou  jadra PHP. Predchádzajúca verzia ZENDu (verzia 1.0) bola postavená na rovnakých parsovacích pravidlách ako skriptovacie jadro PHP 3.x, ktorému dnes zvykneme hovoriť ZEND 0.5. To síce umožnilo veľmi ľahké migrovanie (prechod) z verzie PHP 3.x na verziu 4.0, ale zároveň zmemožňuje ďalší vývoj jazyka.

 

2. Klient a Server

PHP samotné funguje ako súčasť určitého systému, ktorý tvorí webový server, PHP jadro a prehliadač. Doporučujem zároveň nainštalovať aj databázový systém.

  • Internetový server HTTP je program, ktorý sa môže spustiť na ľubovoľnom počítači pripojenom na Internet. Pretože jeden počítač môže plniť úlohu viacerých serverov, sú v rámci komunikačného protokolu zavedené tzv. porty. Porty tvoria prístupové body, služby. Web server „načúva“ zvyčajne na porte 80. K tomuto portu taktiež smerujú požiadavky klientov. Aby server mohol súčasne obsluhovať viacej klientov, slúži port 80 iba pre nadviazanie spojenia a prenos dát prebieha na niektorom z práve voľných portov. V architektúre klient server tvorí serverovú stranu
     
  • Databázový systém je program ktorý slúži pre prácu s dátami. Spolupracuje pomocou natívnych drajvrov alebo ODBC či JDBC rozhrania s webovým serverom.
     
  • Prehliadač alebo browser je program, ktorý slúži na zobrazenie dát na strane klienta.
     

Architektúra klient/server je založená na nasledujúcej myšlienke: dáta by sa mali spracovávať predovšetkým tam, kde sú k dispozícii. To znamená, že pokiaľ nie sú uložené na užívateľskej stanici, nemali by sa tam spracovávať. Pokiaľ ich ale užívateľ chce spracovávať zo svojej stanice, mala by nastúpiť deľba práce - medzi miestom uloženia dát a užívateľskou pracovnou stanicou.

Výhody spomínanej architektúry sú predovšetkým zamedzenie redundancii dát (dáta sú uložené centrálne) pri zachovaní možnosti viac užívateľského prístupu za existencie viac užívateľského spracovávania dát. Centrálnym častiam, ktoré obsahujú dáta a poskytujú ich na spracovanie užívateľom hovoríme server. Naopak užívateľským staniciam, ktoré vyžadujú služby serveru hovoríme klient. Týmto dostaneme názov celej architektúry : klient / server. Klient a server pracujú na sebe úplne nezávisle.

V dobe rozmachu budovania informačných systémov založených na využití osobných počítačov, bolo možné zachytiť tendencie mohutného prechodu k technológii klient / server. Najčastejšie sú uvádzané tieto dôvody :

  • Zvýšená flexibilita a rýchlosť vývoja aplikácií

Toto je dané skutočnosťou, že časť zodpovednosti za spracovanie je prenesená na server. Jedná sa predovšetkým o prístup k dátam, zaistenie ich integrity a dodržiavanie pravidiel pre prácu s nimi. Práve tým, že klient môže využívať tieto služby servera, nemusia byť implementované na klientskej strane a tým je ich kód jednoduchší a ľahšie vytvorený a modifikovateľný.

  • Zvýšenie bezpečnosti systému

Bezpečnosť systému je možné dosiahnuť tým, že prostriedky prístupu k dátam, ako i zaistenia ich integrity a konzistencie sú implementované na strane servera, a teda nemôže dôjsť k ich obídeniu na strane klienta.

  • Intuitívnejší vývoj a prevádzka

Použitie technológie klient/server bolo od začiatku spojené s použitím intuitívneho grafického užívateľského prostredia (GUI), ktoré je umiestnené na klientskej strane.

  • Lepšia integrácia systému

Proces klienta môže naraz využívať informácie z niekoľkých serverov, bez toho aby sa musel prepínať medzi niekoľkými systémami.

  • Podpora decentralizovaných organizačných štruktúr

Na rozdiel od architektúry host-terminal poskytuje filozofia klient/server omnoho lepšie možnosti na prechod od centralizovaného uloženia dát k spracovaniu a uloženiu dát tam, kde je to najvýhodnejšie. Fyzické uloženie dát je pritom pre užívateľa úplne transparentné.

Na obrázku 1 vidíme typický príklad internetovej aplikácie typu klient/server.

Obr.1 - klient/server

Spôsob práce s objektami bol v novej verzii jadra kompletne prepracovaný. Zmeny prinášajú nielen nové funkcie, ale aj zvýšenie výkonu.

Pred ďalším čítaním tohto dokumentu odporúčam nainštalovať PHP na Váš počítač, preto má ďalšia kapitola názov...

3. Inštalácia

Predpokladajme, že PHP budete používať pre vývoj vlastných internetových aplikácií. Preto je nutné nainštalovať nielen samotné PHP, ale aj Web server, databázový server aj prehliadač. Začneme inštaláciou pod operačným systém Microsoft Windows.

Microsoft Windows a Apache (PHP HOME)

Ak používate systém MS Windows 95, aktualizujte si sieťovú vrstvu Winsock na verziu 2. Aktualizačný súbor nájdete na stránkach Microsoftu.

Pre správne fungovanie Web servera je nutné mať sieťovú podporu. Overte si, či Váš počítač má IP adresu, resp. disponuje sieťovým zariadením. Stačí sieťová karta alebo modem. Pre fungovanie domáceho WWW servera nemusíte byť pripojení na internet! Musíte si však nainštalovať podporu pre TCP/IP protokol (pozri obr. 2 a 2a)

Obr. 2 - Sieťová vrstva a protokol TCP/IP

Pre správnu funkciu Web servera musíte mať nainštalovaný TCP/IP protokol.

Obr. 2a

Jednoduché overenie funkčnosti TCP/IP protokolu: V okne shellu (command.com, cmd.exe) napíšte ping 127.0.0.1 a odpoveďou by mal byť správa reply from.... ako na obr. 3

Obr.3 - ping

Pre inštaláciu PHP, webového servera Apache a databázového systému MYSQL sme vytvorili balík PHP HOME. Jeho spustením na svoje PC nainštalujete základné komponenty pre vývoj aplikácií v PHP. Program automaticky skonfiguruje všetky potrebné nástroje. Program je možné stiahnuť si z http://www.php.sk/ alebo sa nachádza na CD PHP klubu (http://www.php.sk/registracia.php)



Obr. 4 - konfiguračný dialóg PHP Home 2

Po úspešnej inštalácii klikneme na ikonku Test My PHP alebo napíšeme do okna prehliadača URL: http://127.0.0.1 a mala by sa zobraziť naša prvá testovacia PHP stránka. Web server musí samozrejme bežať, čo je pri Apache signalizované malou zelenou šípkou v ikonke apache monitor v systray.

Poznámka: IP adresa 127.0.0.1 a localhost sú aliasy pre lokálnu IP adresu.

Okrem web servera Apache je možné nainštalovať PHP ako modul web servera IIS od Microsoftu. V ďalšom texte si ukážeme ako nainštalovať IIS do Windows XP /2000/.

Upozornenie! IIS obsahuje mnoho chýb, inštalaláciu a jeho prevádzkovanie neodporúčame a nesupportujeme. Pre akékoľvek informácie ohľadom IIS sa obráťte na Microsoft Corporation.

Microsoft Windows a Apache (PHP HOME)

Nainštalujeme IIS pomocou inštalačného CD Windows. Zvolíme ponuku START->CONTROL PANEL->ADD/REMOVE programs a zvolíme záložku SYSTEMS PROGRAMS a vyberieme službu IIS (obr. 4a).  Z ponuky vyberieme menu Podorbnosti a vyberieme len položky Common files, snap-in Internetová služba a Webová služba (obr. 4b). IIS nainštalujeme a reštartujeme PC.

Obr 4a

Obr 4b

Získame súbor php-4.x.x-Win32.zip a rozpakujeme ho do adresára napr. c:\php. Do adresára c:\windows\system32 skopírujeme knižnice php4ts.dll a php4ts.lib.

Potom spustíme ovládaciu konzolu IIS s názvom  intemgr a pre webový server nastavíme príslušné vlastnosti v menu Vlastnosti (klik pravým tlačidlom myši - obr 4c a 4d)

Obr 4c

Obr 4d

Vlastnosti nastavíme nasledovne:

1. HOME DIRECTORY-> CONFIGURATION->ADD -> Executable: C:\php\sapi\php4isapi.dll Extension .php

2. ISAPI Filters -> ADD -> Filter name: PHP Executable: C:\php\sapi\php4isapi.dll

3. Nastavíme Directory security podla manuálu k IIS, resp. necháme default.

4. Documents -> ADD index.php

4. Do adresára c:\intepub\wwwroot uložíme súbor index.php s obsahom

<?php
  phpinfo();
?>

  a spustíme IIS (štart). Prípadné chyby riešime s pomocou logu alebo nainštalujeme Apache :).

Druhou možnosťou je nainštalovať PHP do IIS pomocou CGI inštalátora. Súbor sa volá php-4.x.x-installer.exe

 

OS Unix/Linux

Operačný systém pre pravých mužov a ženy umožnuje prevádzkovať služby a moduly, ktoré pod OS Windows ani neexistujú. Proces inštalácie a konfigurácie nie je triviálny, radím však buď kompletne použiť RPM, DEB balíčky alebo všetko ručne kompilovať. Druhá možnosť je vhodná pre pravých expertov a "internet guru". Aj ja používam len ručnú kompiláciu Apache, PHP aj MYSQL.

Inštalácia v skratke (ako modul Apache)

1. gunzip apache_2.0.x.tar.gz
2. tar xvf apache_2.0.x.tar
3. gunzip php-4.0.x.tar.gz
4. tar xvf php-4.0.x.tar
5. cd apache_2.0.x
6. ./configure --prefix=/usr/local/apache
7. cd ../php-4.2.x
8. ./configure --sysconfdir=/etc --with-mysql --with-gd --with-apache=../apache_2.0.x --enable-track-vars
9. make
10. make install
11. cd ../apache_2.0.x
12. ./configure --prefix=/usr/local/apache --activate-module=src/modules/php4/libphp4.a
13. make
14. make install

Pred týmto krokom môžete prekopírovať httpd binárny súbor cez už existujúcu verziu. Nezabudnite však predtým vypnúť WWW server.

15. cd /etc

16. cp php.ini-dist php.ini

Teraz editujte /etc/php.ini súbor a nastavte PHP voľby. Ak chcete mať tento súbor inde, použite
--sysconfdir=/cesta v kroku 8.

17. Editujte httpd.conf a pridajte

AddType application/x-httpd-php .php .phtml .php3 .php4

Tu môžete nastaviť prípony, ktoré bude PHP spracovávať.

18. Použite normálny spôsob zastavenia a spustenia WWW servera Apache nielen HUP alebo USR1 signál.

cd /usr/local/apache/bin

apachectl stop

apachectl start

Príklad inštalácie pod OS LINUX Debian

Predpokladám, že mám server pripojený k internetu. Aktualizujem distribúciu príkazom

#atp-get update
#apt-get upgrade

a postupne kompilujem jednotlivé moduly. Nezabudnem cez apt-get stiahnuť potrebné knižnice, ak chýbajú hlavičkové súbory (*.h) tak aj ich dev verzie. Príklad je libgd2 a libgd2-dev

#apt-get install libgd2

Názov knižnice sa dá zistiť napríklad na http://www.debian.org/ v sekcii packages, pričom vyhľadávam všetky (ak testing) balíčky.


1. MYSQL

# cd /tmp/mysql
# ./configure --prefix=/usr/local/mysql --sysconfdir=/etc --with-charset=win1250
# ./make
# ./make install
# cd ..

2. OPENSSL - SSL zaklad

# cd openssl
# ./config
# ./make
# ./make install
# cd ..



MODSSL

cd modssl
SSL_BASE=/usr/local/ssl
export SSL_BASE
./configure --with-apache=../apache_1.3.26 --with-ssl=../openssl-0.9.6d/ --prefix=/usr/local/apache

PHP 4.2.x
cd php-4.xx

./configure --with-apache=../apache_1.3.26 --with-mysql=/usr/local/mysql --with-gd --with-ttf --sysconfdir=/etc --disable-debug --enable-track-vars --with-pdflib=/usr/local/pdflib --with-jpeg-dir --with-zlib-dir --enable-gd-native-ttf --with-tiff-dir --enable-ftp --enable-sockets
make
make install

APACHE 1.3.26

cd apache
./configure --prefix=/usr/local/apache --activate-module=src/modules/php4/libphp4.a --enable-module=ssl --enable-shared=ssl
make
make install

a spustím Apache

/etc/init.d/apache start alebo /usr/local/apache/bin/apactrl start


Konfigurácia PHP

Sú tu dve možnosti.

Použitie "setup" skriptu, ktorý je pribalený k PHP. Skript sa požaduje odpovedať na otázky a vygenetuje MakeFile. Skript spustíte príkazom ./setup.

Skript tiež vygeneruje súbor "do-conf", ktorý obsahuje voľby predané configure. Môžete tento súbor meniť bez spúštania setupu, stačí napísať ./do-conf a spusťiť configure s novými voľbami.

Ručné spustenie configure . Všetky možné voľby vypíše ./configure --help.

Podrobnejšie je možné nastaviť PHP v konfiguračných súboroch php.ini a httpd.conf.
 

4. Prvé kroky.

Pri inštalácii PHP Home sme nainštalovali aj databázu MYSQL. Pre jej správu slúži administrátorský nástroj phpMyAdmin naprogramovaný v PHP.

  • Overíme si, či bežia daemony pre webový server apache a databázu mysql.

Windows: v systemtray musia byť zelená inkonka zo semaforom a zelenou šípkou.
Unix: pomocou príkazu ps aux

Spustíme v prehliadači úvodnú testovaciu stránku. PHP parsuje (spracováva) len stránky, ktoré  prešli cez rozhranie WEB servera, takže PHP skript inicializujeme (spustíme) vždy len pomocou jeho internetovej URL adresy:

http://localhost/
http://localhost/phpMyAdmin
http://localhost/index.php
http://localhost/projekt_omega/test.php

K parsovaniu samozrejme nedôjde, ak skript zavoláme pomocou jeho lokálnej adresy v súborovom systéme, ako napr.

C:\www\adresar_one\test.php

Správne volanie je

http://localhost/adresar_one/test.php

Pre testovanie konfigurácie PHP sa používa funkcia phpinfo().  Preto ako prvý naozajstný príklad použijeme túto funkciu na vypísanie konfiguračných nastavení PHP.

Príklad 4-1. test.php
<?php
  // napis v notepade a uloz do webového adresara ako subor test.php (pozor! nie test.php.txt)
  phpinfo();
?>

Po uložení súboru do webového adresára (pozri httpd.conf, direktívu DocumentRoot, napr.
DocumentRoot "C:/www" je webový adresár c:\www) spusti test.php cez prehliadač

http://localhost/test.php

V prípade úspechu uvidíme výstup funkcie phpinfo(), v prípade neúspechu popis chyby. Ak súbor neexistuje (alebo sme ho uložili s príponou txt, v notepade sa to stáva), server vypíše chybu 404.

5. Editor a prehliadač

Pre editáciu skriptov v PHP môžeme použiť profesionálne vývojárske prostredie typu IDE, rozšírené editory alebo aj základné editory typu notepad alebo vi. Každý  nástroj má určité výhody a nevýhody a spôsob práce s ním je v drobnostiach odlišný. V dlhodobej vývojárskej praxi sa najviac osvedčili nasledujúce nástroje

  • Zend Studio - profesionálny IDE nástroj od http://www.zend.com/ , cena cca 150 USD/licencia,
    zabudovaný debugger, správa projektov, multiplatformný nástroj v Jave
  • Macromedia HomeSite - profesionálny editor na tvorbu Webov, zvýrazňovanie syntaxe, nepodporuje debugger, cena od 5000 Sk/licencia, len pre Windows http://www.macromedia.com/
  • UltraEdit - programátorský editor, zvýrazňovanie syntaxe, bez podpory debuggera, len Windows verzia http://www.ultraedit.com/
  • PHP Coder Pro - IDE nástroj, podpora debuggera, zadarmo, len pre Windows http://www.phpide.de/
  • Emacs,ViM - editor, bez podpory debuggera, Windows aj Linux http://www.gnu.org/

Pri debuggingu v IDE je možné trasovať program priamo v okne IDE, pri použití editora bez podpory debuggera je nutné stránku reloadovať pomocou príslušnej klávesy (Refresh). profesionálny kompilátor ZEND Compiler je dodávaný s príslušným IDE.

Obr. 6 - PHP Coder Pro IDE

Hotové stránky a skripty sú prezentované v prehliadači. V súčasnosti máme k dispozícii nasledujúce prehliadače:

  • Microsoft Internet Explorer - http://www.microsoft.com/ - najrozšírenejší prehliadač, implicitná súčasť OS Windows, nepísaný štandart, má chyby pri generovaní HTML,XML a CSS, zobrazuje aj neplatný kód, existuje len pre platformu Windows a Apple Macintosh, zadarmo, problémy s kešovanými stránkami
  • Opera - http://www.opera.com/ - moderný multiplatformný prehliadač, pomalá interpretácia JAVY, výborne generovaný HTML, CSS,XML kód, shareware resp. adware
  • Mozilla - http://www.mozilla.org/ - OpenSource multiplatformný prehliadač, občasné problémy s kešovaním stránok, prvá podpora CSS2 a XML
  • Netscape - http://www.netscape.com/ - multiplatformný prehliadač, často implicitná súčasť UNIXových systémov, pomalší vývoj, chyby v generovanom kóde, nesplňuje všetky štandardy http://www.w3c.org/
  • Konqueror - http://www.kde.org/ - výborný prehliadač, súčasť KDE (Unix)

Samozrejme existujú ešte ďalšie prehliadače, napr. LYNX, Arachne ale ich rozšírenie je veľmi obmedzené (okrem LYNXa). Cieľom vývojára by mala byť univerzálna HTML stránka (dokument), ktorá vyzerá rovnako pod všetkými prehliadačmi. Najnovšie normy a štandardy nájdete na stránke http://www.w3c.org/

Je doležité nastaviť prehliadač, aby sa nesnažil o pripájanie na internet pri práci s domácim WWW serverom. Nastavenie sa prevádza v príslušnej záložke, spravidla Preferencies (Opera, Mozilla, Netscape) alebo Nástroje (Tools) -> Internet Options -> Connections (MS Internet Explorer).

Pri práci s domácim WWW serverom je nutné nastaviť voľbu Pripojenie (Connection) na Nepripájať sa (Never dial a connection) - pozri obr. 7 a napísať adresu URL domáceho WWW servera (napr. http://localhost alebo http://127.0.0.1) a v dialógovom okne potvrdiť voľbu Skúsiť znovu (Try Again) alebo Pripojiť sa (Connect) - pozri obr. 8.

Obr. 7 - nastavenie IE na nepripájanie sa k internetu

Ak sme pripojení pomocou sieťového pripojenia ( počítač má sieťovú kartu alebo podobné zariadenie) je nutné nastaviť PROXY server v nastavení prehliadača tak, aby bola voľba Bypass proxy server for local address zaškrtnutá (Nepoužívať proxy server pre lokálne WWW servery).

Obr. 8 - Dialóg pre pripojenie k lokálnemu WWW serveru

6. Databáza a jej správa

Pri práci s databázou MYSQL je vhodné použiť administračný nástroj phpMyAdmin, ktorý je samotný naprogramovaný v PHP. Pre komunikáciu s databázou slúži buď natívny drajver (ovládač) alebo všeobecné ovládače typu ODBC a JDBC. Typ ovládača je nutné zvoliť pri kompilácii PHP alebo v súbore php.ini. Zabudované ovládače vypisuje funkcia phpinfo().

Po spustení nástroja phpMyAdmin (URL http://localhost/phpMyAdmin) sa zobrazí okno pre zadanie loginu a hesla. Je nutné zadať rovnaký login a heslo ako pri vstupnom inicializovaní databázy MYSQL, inak sa phpMyAdmin nemôže k databáze pripojiť. Prípadné zmeny nastavenia phpMyAdmin sa prevádzajú v súbore config.inc.php

Nastavenie phpMyAdmin-a v subore congig.inc.php, najdôležitejšie časti sú zvýraznené.

/**
* Server(s) configuration
*/
$i = 0;
// The $cfg['Servers'] array starts with $cfg['Servers'][1]. Do not use $cfg['Servers'][0].
// You can disable a server config entry by setting host to ''.
$i++;
$cfg['Servers'][$i]['host'] = 'localhost'; // názov servera alebo jeho IP
$cfg['Servers'][$i]['port'] = ''; //
$cfg['Servers'][$i]['socket'] = ''; //
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['controluser'] = '';
$cfg['Servers'][$i]['controlpass'] = '';
$cfg['Servers'][$i]['auth_type'] = 'http'; // Authentication method (config, http or cookie based)?
$cfg['Servers'][$i]['user'] = 'uzivatelske_meno'; // MySQL user
$cfg['Servers'][$i]['password'] = 'hesielko'; // MySQL password (only needed

Po spustení phpMyAdmin-a sa zobrazí hlavná stránka, z ktorej je možné riadiť databázový systém MYSQL. Podrobnejší popis phpMyAdmin-a nájdete v dokumente PhpMyAdmin - uživateľký sprievodca, ktorý je k dispozícii pre členov PHP klubu. Nečlenovia môžu využiť dokumentáciu k danému software.


Obr. 9 - phpMyAdmin

Dôležité údaje sú v RDBMS MYSQL uložené v databáze mysql. Po akejkoľvek zmene údajov je nutné databázu MySQL znovunačítať (pozri obr. 9).

Dôležité tabuľky v databáze MYSQL:

  • USER - globálna tabuľka s uživateľmi a globálnymi prístupovými právami. Odporúčame všetkym uživateľom okrem admina nastaviť práva na N /No/ a práva k príslešnej databáze nastaviť v tabuľke DB.

    Pri ukladaní hesiel je nutné použiť funkciu PASSWORD!!!
     
  • DB - lokálna tabuľka s prístupovými právami k jednotlivým dababázam.

7. Základná syntax jazyka

V nasledujúcich kapitolách je opísaná základná syntax a príkazy jazyka PHP. Pri štúdiu je vhodné ihneď odskúšať tu zverejnené príklady, resp. pokúšať sa o naprogramovanie podobných konštrukcií, aby Vám PHP prešlo ako sa hovorí "do krvi". Učenie sa programovacieho jazyka bez skúšania a elaborovania nemá podľa mojich skúseností väčší význam, vhodné je len napríklad pri prechode z jedného programovacieho jazyka na druhý.

Ako som už spomínal, jazyk PHP slúži na vygenerovanie HTML stránky. Nakoľko ide o väčšinou interpretovaný skript, výstupom je HTML dokument. Spôsob vygenerovania HTML dokumentu pomocou jazyka PHP je zobrazený na  obrázku 10.


Obr. 10 - spôsob generovania HTML dokumentu

Tvorba HTML dokumentu pomocou PHP prebieha vo viacerých fázach. Približne sú zobrazené na predchádzajúcom obrázku:

  1. Klient uvedie URL adresu dokumentu, ktorý chce zobraziť. Prehliadač pomocou HTTP (Hyper Text Transfer protokol) požiada server o vrátenie požadovaného dokumentu.

    GET http://localhost/index.php
     
  2. Server zistí, že nejde o statický dokument (podľa prípony .php) a zavolá modul PHP, ktorý interpretuje PHP dokument a výsledok vráti WWW prehliadaču (vráti vygenerovaný HTML dokument). Server vygenerovaný HTML dokument odošle pomocou metódy PUT HTTP protokolu klientskej strane, ktorá ho zobrazí. V prípade, že príde požiadavka na generovanie statického WWW dokumentu (napríklad s príponou .html), modul PHP nie je volaný. Nastavenie, ktorý dokument interpretovať a ktorý nie, je možné v súbore httpd.conf

Jazyk PHP je samozrejme možné kombinovať s klasickými "HTML tagmi". Preto je znalosť HTML nevyhnutná pre každého webového programátora.

Zapúzdrenie do HTML

Prvá možnost je k dispozícii len ak je zapnutá možnosť spracovávania skrátených tagov. Zabezpečí to funkcia short_tags(), prípadne konfiguračná voľba short_open_tag v PHP konfiguračnom súbore, či pri kompilácii direktíva --enable-short-tags. Štvrtá možnosť je používať ASP tagy. Musí to byť povolené v nastavení asp_tags Ak je to možné, vyhýbajte sa tomuto štýlu programovania, PHP je dosť dobré na to, aby sa nemuselo po ASP opičiť.

Odporúčam používať tagy <?php  a ?>

 

Oddelenie príkazov a komentáre

Príkazy sú od seba oddelené podobne ako v PERLE alebo jazyku C - bodkočiarkou. Koncový tag (?>) znamená tiež koniec príkazov, takže nasledujúce dva príklady sú rovnocenné. PHP samozrejme podporuje viac príkazov na jednom riadku.

Príklad 7-2. Oddelenie príkazov
  1 
  2 <?php
  3     echo "Toto je test";
  4 ?>
  5 
  6 <?php echo "Toto je test" ?>
  7       

PHP podporuje komentáre v štýle  'C', 'C++' a Unix.

Príklad 7-3. Komentáre
  1 
  2 <?php
  3     echo "test"; // Toto je jednoriadkový komentár  
  4     /* Toto je viacriadkový
  5        komentár */
  6     echo "iný test";
  7     echo "posledný test"; # Toto je komentár v štýle UNIXu
  8 ?>
  9      

Jednoriadkový komentár zahŕňa blok do konca riadku alebo ukončovacieho tagu, podľa toho, čo príde skôr.

Príklad 7-4. Komentáre
  1 
  2 <h1>Toto je <?# echo "jednoduchy";?> príklad.</h1>
  3 <p>Hlavička vypíše 'Toto je príklad'.
  4 

PHP však nepodporuje tzv. hniezdenie komentárov, nasledujúci príklad je preto nefunčný.

Príklad 7-5. Komentáre
 
  2 <?php
  3  /*
  4     echo "Toto je test"; /* Tento komentár robí problémy
  5  */
  6 ?>
  7    

8. Typy

Všetky premenné v PHP sú určitého typu, podobne ako ľudia v reálnom svete. PHP podporuje nasledujúce typy

  • pole
  • desatinné čísla
  • celé čísla
  • objekty
  • reťazce

Typ použitej premennej spravidla nezadáva programátor, ale automaticky vyberá PHP podľa povahy uloženej informácie. Ak chcete sami stanoviť typ použitej premennej, je možné pretypovať premennú pomocou funkcie settype(). Nezabudnite, že premenné sa môžu správať rôzne podľa ich typu a situácie.

Celé čísla môžu byť použité s nasledujúcou syntaxou:

Príklad 8-1. Rôzne typy
  1 
  2 $a = 1234; # desatinné čísla
  3 $a = -123; # záporné čísla
  4 $a = 0123; # osmičkové číslo (rovnaké ako 83d
  5 $a = 0x12; # šestnástkové číslo (rovnaké ako 18d)
  6      

Desatinné čísla ("double") môžu byť definované nasledovne:

Príklad 8-2. Desatinné číslo do premennej
  1  
  2 $a = 1.234; $a = 1.2e3;
  3      

Reťazce môžu byť ohraničené dvomi druhmi oddeľovačov.

Ak je reťazec ohraničený úvodzovkami ("), premenné v jeho tele sú spracovávané. Ako v jazyku C a PERLi, spätné lomítko ("\") je nutné použiť pri definovaní špeciálnych znakov.

Tabuľka 8-3. Špeciálne znaky
sekvencia význam
\n nový riadok
\r vozík
\t vodorovný tabulátor
\\ spätné lomítko
\$ znak dolára
\" úvodzovka
\[0-7]{1,3} reg. výraz /oktálny/
\x[0-9A-Fa-f]{1,2} reg.výraz /hexadecimálny/

Druhou možnosťou je uzavrieť reťazec do apostrofov ("'"). Tento reťazec nebude vo vnútri parsovaný, špeciálne znaky nie je možné použiť - budú zobrazené tak ako sú.

Ďalšou možnosťou je použiť dokumentačnú syntax. ("<<<"). Dokumentácia začína za týmto znakom a končí pri tagu, ktorý je uvedený za ním (napríklad EOD). Tento tag musí byť na začiatku riadka. 

Príklad 8-4. Rôzne typy
  1 
  2 $str = <<<EOD
  3 Príklad of string
  4 spanning multiple lines
  5 using heredoc syntax.
  6 EOD;
  7      

Pozn: Pridané v PHP 4.

Reťazce je možné spájať pomocou operácie čiarka '.'  Znaky reťazca sú vlastne znakovým poľom, preto k nim môžeme aj takto pristupovať:

Príklad 8-5. Reťazec
  1 
  2 <?php
  3 /* priradenie. */
  4 $str = "This is a string";
  5 
  6 /* pridanie. */
  7 $str = $str . " with some more text";
  8 
  9 /* iné pridanie */
 10 $str .= " and a newline at the end.\n";
 11 
 12 /* Tento reťazec končí cislom '<p>Number: 9</p>' */
 13 $num = 9;
 14 $str = "<p>Number: $num</p>";
 15 
 16 /* Toto bude '<p>Number: $num</p>' */
 17 $num = 9;
 18 $str = '<p>Number: $num</p>';
 19 
 20 /* Vráti prvý znak reťazca  */
 21 $str = 'This is a test.';
 22 $first = $str[0];
 23 
 24 /* Vráti posledný znak reťazca. */
 25 $str = 'This is still a test.';
 26 $last = $str[strlen($str)-1];
 27 ?>	  
 28      
 

Reťazcové konverzie   

Ak je reťazec vrátený ako číslo, jeho typ bude nasledujúci:

Bude typ double (desatinný) ak bude obsahovať jeden zo znakov '.', 'e', alebo 'E'. Inak bude celočíselný (integer).

Hodnota čísla je daná úvodnou hodnotou reťazca. Ak je to číslo, bude to toto číslo, v inom prípade to bude nula. (0). Platné číslené dáta začínajú nepovinným znamienkom, po ktorom nasleduje jedno alebo viac číslic. (volitelne aj s desatinnou čiarkou), nasledované nepovinným exponentom. Exponent je znak 'e' alebo 'E' nasledovaný jednou alebo viacerými číslicami.

Ak je prvý výraz reťazec, typ premennej bude závisieť na druhom reťazci.

Príklad 8-6. Reťazcové konverzie
  1 
  2 $foo = 1 + "10.5";              // $foo je double (11.5)
  3 $foo = 1 + "-1.3e3";            // $foo je double (-1299)
  4 $foo = 1 + "bob-1.3e3";         // $foo je integer (1)
  5 $foo = 1 + "bob3";              // $foo je integer (1)
  6 $foo = 1 + "10 malych svin";     // $foo je integer (11)
  7 $foo = 1 + "10 malych sviniek"; // $foo je integer (11)
  8 $foo = "10.0 svin " + 1;        // $foo je integer (11)
  9 $foo = "10.0 svin " + 1.0;      // $foo je double (11)     
 10      

 

Ak si chcete otestovat tento priklad, za každý riadok zaradte nasledujúci príkaz:

Príklad 8-7. Zistenie typu
  1 
  2 echo "\$foo==$foo; typ je " . gettype( $foo ) . "<br>\n";
  3       

Polia

  • Jednorozmerné polia

PHP podporuje skaláry a asociatívne polia. V podstate medzi nimi nie je žiadny rozdiel, môžete ich vytvoriť pomocou funkcie  list() alebo array() alebo explicitne definovať každý prvok poľa:

Príklad 8-8. Naplnenie poľa
  1  
  2 $a[0] = "abc"; 
  3 $a[1] = "def"; 
  4 $b["foo"] = 13;
  5       

Vytvoriť môžete tiež pole prostým pridaním hodnôt do poľa. V prípade že použijete prázdne zložené zátvorky, prvok bude zaradený na koniec poľa.

Príklad 8-9. Naplnenie poľa bez použitia indexu
  1  
  2 $a[] = "ahoj"; // $a[2] == "ahoj"
  3 $a[] = "svet"; // $a[3] == "svet" 
  4       

Polia môžeme triediť pomocou  asort(), arsort(), ksort(), rsort(), sort(), uasort(), usort() a uksort() funkcií.

Funkcia count() vráti počet prvkov poľa.

Po poli môžete prechádzať pomocou funkcie Next() a Previous(). Inou obľúbenou možnosťou je zavolať funkciu  each().

Viacrozmerné polia sú veľmi jednoduché, stačí pridať inú [kľúčovú] hodnotu na koniec. Viacrozmerné pole je možné naplniť rôznymi spôsobmi.

Príklad 8-10. Naplnenie viacrozmerného poľa
  1  
  2 $a[1]      = $f;               # jednorozmerné polia
  3 $a["foo"]  = $f;   
  4 
  5 $a[1][0]     = $f;             # dvojrozmerné pole
  6 $a["foo"][2] = $f;             # (mix asociatívneho a numerického poľa)
  7 $a[3]["bar"] = $f;             # 
  8 
  9 $a["foo"][4]["bar"][0] = $f;   # štvorrozmerné pole
 10       
  1 
  2 $a[3]['bar'] = 'Bob';
  3 echo "This will work: {$a[3][bar]}";
  4       

 

Príklad 8-11. Naplnenie viacrozmerného poľa
  1  
  2 # Príklad 1:
  3 
  4 $a["color"]	= "red";
  5 $a["taste"]	= "sweet";
  6 $a["shape"]	= "round";
  7 $a["name"]	= "apple";
  8 $a[3]		= 4;
  9 
 10 # Príklad 2:
 11 $a = array(
 12      "color" => "red",
 13      "taste" => "sweet",
 14      "shape" => "round",
 15      "name"  => "apple",
 16      3       => 4
 17 );
 18       

Funkcia array() môže byť vložená aj pre viacrozmerné polia

Príklad 8-12. Naplnenie viacrozmerného poľa pomocou array
  1  
  2 <?
  3 $a = array(
  4      "apple"  => array(
  5           "color"  => "red",
  6           "taste"  => "sweet",
  7           "shape"  => "round"
  8      ),
  9      "orange"  => array(
 10           "color"  => "orange",
 11           "taste"  => "tart",
 12           "shape"  => "round"
 13      ),
 14      "banana"  => array(
 15           "color"  => "yellow",
 16           "taste"  => "paste-y",
 17           "shape"  => "banana-shaped"
 18      )
 19 );
 20 
 21 echo $a["apple"]["taste"];    # vypíše "sweet"
 22 ?>
 23       

Pretypovanie

PHP nepodporuje explicitné určenie typu prememnej pri jej deklarácii, jej typ je určený pri jej prvom použití. Znamená to, že ak do premennej priradíte na začiatku reťazec, bude typu reťazec.

Príklad automatickej konverzie typov je operácia sčítania. '+'. Ak je jeden z operandov double, všetky operandy sú vyhodnotené ako double. a výsledok bude tiež double. Inak budú operandy interpretované ako celočíselný typ integer a výsledok bude tiež integer.

Príklad 8-13. Automatické pretypovanie
  1 
  2 $foo = "0";  // $foo je reťazec (ASCII 48)
  3 $foo++;      // $foo je reťazec "1" (ASCII 49)
  4 $foo += 1;   // $foo je teraz integer (2)
  5 $foo = $foo + 1.3;  // $foo je teraz double (3.3)
  6 $foo = 5 + "10 malych svin "; // $foo je integer (15)
  7 $foo = 5 + "10 malych svin";     // $foo je integer (15)
  8      

Ak chcete vyskúšať jeden z príkladov, doplnte nasledujúci riadok za každý príkaz.

Príklad 8-14. Určenie typu
  1 
  2 echo "\$foo==$foo; type is " . gettype( $foo ) . "<br>\n";
  3      

Pretypovanie

Príklad 8-15. Pretypovanie
  1 
  2 $foo = 10;   // $foo is an integer
  3 $bar = (double) $foo;   // $bar is a double
  4       

Povolené pretypovanie je:

  • (int), (integer) - na integer
  • (real), (double), (float) - na  double
  • (string) - na reťazec
  • (array) - na pole
  • (object) - na objekt

Nezabudnite, že tabulátory a medzery sú povolené.

Príklad 8-16. Pretypovanie
  1 
  2 $foo = (int) $bar;
  3 $foo = ( int ) $bar;
  4       

Nie je Vám jasné, čo sa deje? Napríklad pri pretypovaní skaláru na pole sa stane premenná prvým prvkom poľa:

Príklad 8-17. Pretypovanie na pole
  1 
  2 $var = 'ahoj';
  3 $arr = (array) $var;
  4 echo $arr[0];  // vypise 'ahoj'  
  5       

Podobne je to aj s objektom.:

Príklad 8-18. Pretypovanie na objekt
  1 
  2 $var = 'zdar';
  3 $obj = (object) $var;
  4 echo $obj->scalar;  // vypise 'zdar'
  5       

9. Premenné

Premenné sú v PHP reprezentované znakom dolár, za ktorým nasleduje názov premennej. Názov je citlivý na veľkosť písmen. Nezabudnime na to, že protokol HTTP je bezstavový, čo znamená, že všetky premenné strácajú svoju platnosť po ukončení behu skriptu. Jedinou možnosťou je uložiť premenné pomocou cookie na strane klienta alebo pomocou session na strane servera.

Príklad 9-1. Naplnenie premennej
  1  
  2 $var = "Bob";
  3 $Var = "Joe";
  4 echo "$var, $Var"; // vypíše "Bob, Joe"
  5      

V PHP sú implicitne použité premenné, ktoré sú vždy volané hodnotou. Znamená to, že pri priradení jednej premennej do druhej je vždy skopírovaná jej hodnota zo zdrojovej premennej do cieľovej. Neskoršia zmena jednej hodnoty však neovplyvní hodnotu druhej premennej, zostávajú na sebe nezávislé. Previac informácií o tomto type priradenia pozri kapitolu Výrazy.

PHP ponúka inú možnosť volania premennej - odkazom. Znamená to,  že pri priradení jednej premennej do druhej sa nová premenná stáva akýmsi aliasom, obidve premenné ukazujú na rovnaké miesto v pamäti, sú to vlastne pointre. Pri zmene jednej premennej sa automaticky zmení aj obsah druhej premennej. Priradenie je tiež rýchlejšie, nakoľko nie je nutné žiadne kopírovanie hodnoty, toto zrýchlenie je však merateľné len vo veľkých cykloch, prípadne pri prístupe k veľkým objektom či poliam.

Pre volanie odkazom je nutné pred názov premennej zaradiť znak ampersand (&).

Príklad 9-2. Volanie odkazom
  1 
  2 <?php
  3 $foo = 'Bob';              // prirad hodnotu 'Bob' do $foo
  4 $bar = &$foo;              // referencia $foo via $bar.
  5 $bar = "My name is $bar";  // zmen $bar...
  6 echo $foo;                 // $foo sa zmenilo tiez
  7 echo $bar;
  8 ?>
  9      

Nezabudnite, že len pomenované premenné môžu byť volané odkazom! Sú to vlastne premenné, ktoré majú meno, nie je to napr. matematický výraz.

Príklad 9-3. Pomenovaná premenná
  1 
  2 <?php
  3 $foo = 25;
  4 $bar = &$foo;      // Platné priradenie.
  5 $bar = &(24 * 7);  // Chyba; volanie nepomenovanej premennej  
  6 
  7 function test() {
  8    return 25;
  9 }
 10 
 11 $bar = &test();    // Invalid.
 12 ?>
 13    

Preddefinované premenné

PHP poskytuje bežiacim skriptom veľké množstvo preddefinovaných premenných. Veľa z nich však nemôže byť úplne popísaná, nakoľko závisia od servera, na ktorom bežia, od verzie OS a od iných faktorov.  Niektoré z nich nie sú k dispozícii, ak beží PHP ako CGI wrapper, prípadne ako program spustený z príkazového riadku. Pre úplný zoznam preddefinovaných premenných prosím pozrite a požite funkciu  phpinfo().

Platnosť premennej

Platnosť premennej závisí od kontextu, v akom bola definovaná. Na príklad:

Príklad 9-4. Platnosť premennej
  1 
  2 $a = 1;
  3 include "b.inc";
  4     

Tu má premenná $a platrnosť aj v includovanom súbore b.inc. Napríklad v uživateľsky definovanej funkcii môže mať premenná aj lokálnu platnosť - je inicializovaná len v tele funkcie.

Príklad 9-5. Globálna a lokálna premenná
  1  
  2 $a = 1; /* globálna premenná */ 
  3 
  4 Function Test () { 
  5     echo $a; /* referencia na lokalnu premennu */ 
  6 } 
  7 
  8 Test ();
  9     

Tento skript nevypíše nič, nakoľko lokálna premenná $a neobsahuje nič, navyše nebola ani inicializovaná. Tu je známy jeden rozdiel oproti jazyku C, kde globálne premenné sú automaticky prístupné aj v lokálnej funkcii, ak neboli prepísané lokálnou premennou. V PHP musia byť globálne premenné deklarované pomocou slova global v tele funkcie:

Príklad 9-6. Premenná typu global
  1 
  2 $a = 1;
  3 $b = 2;
  4 
  5 Function Sum () {
  6     global $a, $b;
  7 
  8     $b = $a + $b;
  9 } 
 10 
 11 Sum ();
 12 echo $b;
 13     

Skript vypíše "3". Deklaráciou  $a a $b ako globálne premenné v tele funkcie umožnilo ich naplnenie aj napriek tomu, že sú použité v tele funkcie. Ak dôjde k ich zmene v tele funkcie, táto zmena bude platná aj mimo nej. Druhou možnosťou použitia globálnych premenných je využitie špeciálne definovaného asociatívneho poľa $GLOBALS:

Príklad 9-7. Pretypovanie na objekt
  1 
  2 $a = 1;
  3 $b = 2;
  4 
  5 Function Sum () {
  6     $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];
  7 } 
  8 
  9 Sum ();
 10 echo $b;
 11     

Inou možnosťou je použitie statickej premennej. Statická premenná exituje len v tele funkcie, nestratí však platnosť, ak ju program opustí:

Príklad 9-8. Nefunkčná statická premenná
  1 
  2 Function Test () {
  3     $a = 0;
  4     echo $a;
  5     $a++;
  6 }
  7     

Funkcia je nefunkčná, nakoľko vždy vypíše nulu a nastaví  $a na 0. Skúste však toto:

Príklad 9-9 Statická premenná
  1 
  2 Function Test () {
  3     static $a = 0;
  4     echo $a;
  5     $a++;
  6 }
  7     

Statické premenné ponúkajú možnosť práce s rekurziou. Rekurzívna funkcia je funkcia, ktorá volá sama seba. Nasledujúca funkcia rekurzívne počíta do 10 a zastane.

Príklad 9-10. Statické počítadlo
  1 
  2 Function Test () {
  3     static $count = 0;
  4 
  5     $count++;
  6     echo $count;
  7     if ($count < 10) {
  8         Test ();
  9     }
 10     $count--;
 11 }
 12     

Premenná premenných

Niekedy je užitočné používať aj meno premennej, napríklad pri dynamickej inicializácii premenných. Normálna premenná je naplnená takto:

Príklad 9-11. Premenná premennej
  1 
  2 $a = "hello";
  3     

Premenná premennej zoberie hodnotu premennej a spracuje ju ako názov premennej, takto:

Príklad 9-12. Premenná premennej
ť  1 
  2 $$a = "world";
  3     

V tomto bode boli definované dve premenné v PHP $a obsahuje "hello" a premenná  $hello obsahuje "world". Preto príkaz:

Príklad 9-13. Premenná premennej
  1 
  2 echo "$a ${$a}";
  3     

bude generovať rovnaký výsledok ako

Príklad 9-14. Premenná premennej
  1 
  2 echo "$a $hello";
  3     

čo znamená, že oba vypíšu hello world.

V prípade, že používate premennú premennej v súvislosti s poľom, je nutné parseru určiť, čo je pole a čo premenná premennej. Pre pole $$a[1] musíte zadať : ${$a[1]} alebo ${$a}[1]  - podľa toho, čo chcete.

10. HTML formuláre

HTML Formuláre  (GET a POST)

Jazyk HTML obsahuje podporu formulárov, ktoré slúžia pre načítavanie dát od používateľa. Formulár vyzerá ako dialogový box v okne prehliadača, môže obsahovať tlačítka, editovacie boxy, listboxy, zaškrtávacie a prepínacie tlačítka a iné komponenty. Script získané dáta z formulára spracuje a výsledok odošle na okno prehliadača.

V jazyku HTML slúži pre vloženie formulára do stránky tag FORM. Má dva atribúty ACTION  a METHOD. Atribút ACTION určí URL adresu skriptu, ktorý slúži pre spracovanie dát získaných z daného formulára. Atribút METHOD určí, akým spôsobom budú dáta z formulára predané serveru, buď metódou GET, ktorá pripojí prenášané dáta za URL odslužného skriptu alebo metódou POST, ktorá zakomponuje prenášané dáta do tela HTTP. Základ formulára by mal dodržiavať nasledujúcu syntax:

<FORM ACTION=”URL skriptu“ METHOD=“GET|POST“>
  ...telo formulára...
</FORM>

V prípade, ak URL skriptu nezadáme, spracováva formulár rovnaký skript, čo sa často využíva. Ak je odoslaný HTML formulár, všetky premenné z tohto formulára je možné využiť a použiť v PHP:

Príklad 10-1. Jednoduchý HTML formulár odoslaný pomocou metódy GET a POST
  1 
  2 <form action="skript.php" method="get" enctype="multipart/form-data">
  3 <input type="text" name="meno">
  4 <input type="submit" name="akcia" value="Odoslat">
  5 </form>
  6
  7 <form action="skript.php" method="post" enctype="multipart/form-data">
  8 <input type="text" name="meno">
  9 <input type="submit" name="akcia" value="Odoslat">
 10 </form>
 11      

Obr. 11 - HTML formulár

Vo formulároch je možné používať rôzne elementy, napríklad: TEXTAREA, INPUT, SELECT, LABEL, FIELDSET, BUTTON. Doporučujem preštudovať HTML príručku (http://www.w3c.org/)

Po odoslaní PHP vytvorí premennú $name, ktorá bude obsahovať to, čo ste zadali do políčka Meno: vo Vašom formulári.

Upozornenie!

PHP od verzie 4.2.x  používa iný typ odovzdávanie premenných. Horeuvedený typ je nutné implicitne povoliť voľbou Register Globals = On v súbore php.ini.

V novej verzii PHP je nutné pristupovať k získaným premenným pomocou asociatívnych polí $HTTP_POST_VARS, $HTTP_GET_VARS a  $HTTP_POST_FILES

Príklad 10-2. Jednoduchý HTML formulár odoslaný pomocou metódy GET a POST

  1 <form action="" method=post enctype="multipart/form-data">
  2 <table frame=box rules=none border=1 cellpadding=4>
  3  <tr><td> Meno:       </td><td><INPUT TYPE=TEXT NAME=Meno       SIZE=30></td></tr>
  4  <tr><td> Priezvisko: </td><td><INPUT TYPE=TEXT NAME=Priezvisko SIZE=30></td></tr>
  5  <tr><td> E-mail:     </td><td><INPUT TYPE=TEXT NAME=Email      SIZE=20></td></tr>
  6  </table>
  7  
  8  <B> Suhlasim s odoslatim tohto dotaznika: </B><BR><BR>
  9 
 10 <input type=Submit name="Potvrdenie" value="Ano">
 11 <input type=Submit name="Potvrdenie" value="Nie"><BR>
 12 </form>
 

Časť pre spracovanie premenných môže vyzerať napríklad takto:

Príklad 10-3. Spracovanie jednoduchého formulára
  1 
  2 <?php 
  3 echo $Meno;  //povolene Register Globals = on
  4 echo $HTTP_POST_VARS["Meno"]; // nove PHP
  5 if ($HTTP_POST_VARS["Potvrdenie"]=="Ano") 
  6 echo "Dakujem za udaje"; 
  7 else 
  8 echo 'No nic...'; 
  9 ?>
  10
    

PHP tiež podporuje polia vo forme formulárových premenných. Príklad získania poľa z multiselectu:

Príklad 10-4. Multiselect
  1 
  2 <form action="array.php" method="post" enctype="multipart/form-data">
  3     Meno: <input type="text" name="personal[name]"><br>
  4     Email: <input type="text" name="personal[email]"><br>
  5     Pivo: <br>
  6     <select multiple name="beer[]">
  7         <option value="tatran">Tatran
  8         <option value="bazant">Zlaty Bazant
  9         <option value="krusovice">Krusovice
 10         </select>
 11     <input type="submit">
 12 </form>
 13       
 

Ak je zapnutá konfiguračná voľba  PHP  track_vars , potom je možné k získaným premenným pomocou metód  POST či GET pristupovať aj v globálnych asociatívnych poliach $HTTP_POST_VARS, $HTTP_GET_VARS, $HTTP_POST_FILES. V nových verziách je táto možnosť kvôli bezpečnosti zapnutá implicitne.

OBRÁZKOVÉ TLAČIDLO

Pri odosielaní formulára je možné namiesto klasického textového tlačítka použiť aj obrázkové, napríklad využitím tagu:

Príklad 10-5. Obrázkové tlačidlo
  1
  2 <form action="" method="post" enctype="multipart/form-data">
  3 <input type=image src="image.gif" name="sub">
  4 </form>
  5

Pri stlačení tlačidla bude serveru odovzdaná aj poloha stlačenia pomocou premennách $sub_x a $sub_y.

 
Príklad 10-6. Kompletný HTML formulár so spracovaním skript.php
 1  // Register global = on
 2  <?php
 3  function spracujForm() {
 4  global $odosli,$meno,$priezvisko,$heslo;
 5  echo "Meno - ".$meno.NL;
 6  echo "Priezvisko - ".$priezvisko.NL;
 7  echo "Heslo - ".$heslo.NL;
 8  echo '<a href="skript.php">Reload</a>';
 9  } //spracujForm
 10
 11 function showForm() {
 12 ?>
 13 <html>
 14 <head>
 15 <title>Zadavanie dat</title>
 16 </head>
 17 <body>
 18 <h1>Zadaj data</h1>
 19 <hr>
 20 <form action="" method="post">
 21 Meno:       <input type="text" name="meno"><br>
 22 Priezvisko: <input type="text" name="priezvisko"><br>
 23 Heslo:      <input type="password" name="heslo"><br>
 24 <input type="submit" name="odosli" value="Odoslat">
 25 </form>
 26 </body>
 27 </html>
 28 <?php
 29 }
 30 
 31 define("NL","<br/>\n");
 32 if ($odosli=="Odoslat") spracujForm();
 33 else showForm();
 34 ?>
 35
 

HTTP sušienky (cookies)

PHP transparentne podporuje HTTP sušienky podľa definície v špecifikácii NETSCAPE. Sušienky alebo Cookies je mechanizmus určený pre uloženie dát na vzdialenom prehliadači a tým označenie a identifikáciu uživateľov. Sušienku (cookie) je možné nastaviť funkciou  SetCookie(). Sušienky sú časťou HTTP hlavičky, takže volanie SetCookie musí nastať pred osolaním hocakých dát prehliadaču - toto obmedzenie platí aj pre funkciu Header(). Všetky sušienky sú automaticky konvertované na zodpovedajúce premenné PHP - podobne ako pri metódach GET a POST.

Ak chcete nastaviť viac hodnôt v jednej sušienke pridajte  [] k názvu sušienky. Príklad:

Príklad 10-7. Nastavenie cookie s platnosťou 1 hodina
  1 
  2 SetCookie ("MojaCookie[]", "Test", time()+3600);
  3      

Nezabudnite, že každá sušienka nahradí predchádzajúcu s rovnakým názvom, pokiaľ nie je zmenený prehliadač ani doména. Príklad pre nákupný košík, ktorý bude rešpektovať rozdielnych klientov - obmedzene...

Príklad 10-8. Cookie pre podporu košíka
  1 
  2 $Count++;
  3 SetCookie ("Count", $Count, time()+3600);
  4 SetCookie ("Cart[$Count]", $item, time()+3600);
  5      

Premenné prostredia

PHP automaticky konveruje premenné prostredia na normálne PHP premenné.
 

Príklad 10-9. Výpis premennej HOME
  1 
  2 echo $Home;  /* zobrazi nastavenie premennej prostredia Home, ak je nastavená*/
  3       

Nakoľko sú však informácie získané pomocou susšienok alebo metód  GET a POST automaticky konvertované priamo na premenné, je niekedy užitočné explicitne prečítať premennú prostredia, napríklad pomocou funkcie  getenv(). Premennú prostredia tiež môžete nastaviť pomocou funkcie  putenv().

Bodka v získaných premenných

PHP obvykle neparsuje získané premenné, pretože však bodka nie je povoleným znakom v názve premenných, PHP bude generovať chybu, ak Vaša premenná bude v názve obsahovať bodku.
 

Príklad 10-10. Nesprávny názov premennej
  1 
  2 $varname.ext;  /* chybný názov premennej */
  3      

PHP automaticky nahradí všetky bodky znakom podtržník.

Získanie typu premennej

Nakoľko PHP neposkytuje mechanizmus explicitného určenia typu, je možné typ premennej indikovať volaním funkcií gettype(), is_long(), is_double(), is_string(), is_array(), a is_object().

 

11. Konštanty

PHP definuje viac konštánt a poskytuje mechanizmus k ich definovaniu pri behu programu.  Konštanty sa používajú rovnako ako premenné, inicializované sú však použitím funkcie define() a po inicializácii už nemôžu zmeniť hodnotu.

Predefinované konštanty sú:

__FILE__
Názov skriptu, ktorý je v súčasnosti spracovávaný. V prípade, že je použité v includovanom súbore, je vrátené meno includovaného súboru, nie súboru, ktorý includovaný súbor zavolal.
__LINE__
Číslo riadku v skripte, ktorý je práve parsovaný. 
PHP_VERSION
Vráti číslo verzie PHP, napríklad '4.2.2'.
PHP_OS
Vráti názov operačného systému, na ktorom PHP beží, napríklad 'Linux'.
TRUE
hodnota true
FALSE
hodnota false.
E_ERROR
Označuje inú chybu než chybu pri parsovaní skriptu, nie je možné zotavenie.
E_WARNING
Označuje stav, kde PHP vie, že niečo nie je v poriadku, ale pokračuje ďalej v spracovaní skriptu. Príkladom môže byť chybný regexp výraz vo funkcii ereg().
E_PARSE
Parser oznámil chybu pri parsovaní skriptu. Zotavenie nie je možné.
E_NOTICE
Stalo sa niečo, čo môže byť chybou a nemusí. Spracovanie skriptu pokračuje aj ďalej. 

Konštanty E_* sú používané vo funkcii error_reporting() pre definovanie úrovne chýb.Môžete tiež definovať aj iné konštanty použitím funkcie define().Nezabudnite, že konštanty nie sú C-čkové makrá, iba platný skalár môže byť konštantou.

Príklad 11-1. Definovanie konštanty
  1 
  2 <?php
  3 define("CONSTANT", "Ahoj svet.");
  4 echo CONSTANT; //  vypise "Ahoj svet."
  5 ?>
  6      
 
Príklad 11-2. Použitie __FILE__ a __LINE__
  1 
  2 <?php
  3 function reportError($file, $line, $message) {
  4     echo "Nastala chyba v skripte $file na riadku $line: $message.";
  5 }
  6 
  7 reportError(__FILE__,__LINE__, "Nieco sa stalo!");
  8 ?>
  9  

 

12. Výrazy

Výrazy sú základným stavebným kameňom PHP. V PHP je možné skoro všetko zapísať ako výraz. Najľahším spôsobom, ako definovať výraz je "všetko čo má hodnotu".

Najčastejšou formou výrazov sú konštanty a premenné. Ak napíšete "$a = 5", priradíte hodnotu '5' do premennej $a. '5', má obvykle hodnotu 5, alebo inými slovami '5' je výraz s hodnotou 5 (v tomto prípade je '5' celočíselná konštanta).

Po tomto priradení môžeme očakávať, že premenná $a bude mať tiež hodnotu 5, takže ak napíšeme $b = $a, bude to mať rovnaký účinok ako by sme napísali $b = 5. Inými slovami, $a je výraz s hodnotou 5. 

Zložitejšie príklady výrazov sú funkcie:

Príklad 12-1. Jednoduchá funkcia vracajúca 5
  1 
  2 function foo () {
  3     return 5;
  4 }
  5      

Predpokladám, že už rozumiete princípu funkcií. Ak nie, pozrite si prosím kapitolu venovanú funkciám. Ak napíšete $c = foo()  je to rovnaké akoby ste napísali  $c = 5. Funkcie sú teda výrazmi s hodnotou ich návratovej hodnoty. Keďže  foo() vracia 5, hodnota výrazu 'foo()' je 5. Obvykle funkcie namiesto statického výrazu vracajú vypočítanú hodnotu.

PHP nepodporuje len celočíslené hodnoty, ale aj iné typy skalárov - neceločíselné a reťazce. Skalár je hodnota, ktorá už nemôže byť rozdelené na menšie časti, napríklad ako pole. to znamená, že pole nie je skalár. PHP tiež podporuje dva kompozitné typy, ktoré nie sú skalármi - objekty a polia.

Uživatelia starších verzií PHP/FI 2/PHP3 sa nemusia obávať. PHP spracováva výrazy rovnako ako iné jazyky. PHP je výrazovo orientovaný jazyk, čo znamená, že skoro všetko je výraz. Napríklad niečo ako '$b = ($a = 5)' je vlastne skrátená forma '$a = 5; $b = 5;' (bodkočiarka znamená koniec príkazu). nakoľko výrazy sú spracovávané sprava doľava, môžeme tiež napísať: '$b = $a = 5'.

Iný dobrý príklad na použitie výrazov je inkrementácia a dekrementácia. Poznáme pre a post verziu týchto operácií. Jediný rozdiel je v poradí, v akom dôjde k predaniu hodnoty a zvýšeniuzníženiu príslušnej premennej.

Ďalším známym typom výrazov je porovnávanie výrazov. Tieto výrazy vracajú buď 0 alebo 1, čo značí FALSE /nepravda/ alebo TRUE /pravda/ y). PHP podporuje  > (väčší než), >= (väčší alebo rovný), == (rovný), != (nerovný), < (menší) and <= (menší alebo rovný). Tieto výrazy sa načastejšie používajú v podmienkach, napríklad pri vetvení programu.

Ďalším typom výrazov je ternárny operátor:

Príklad 12-2. Ternárny operátor
  1 
  2 $first ? $second : $third
  3 

Ak je hodnota prvého výrazu nenulová /pravda - true/, je vyhodnotený druhý výraz, inak je vyhodnotený 3 výraz.

Príklad 12-3. Výrazy
  1 
  2 function double($i) {
  3     return $i*2;
  4 }
  5 $b = $a = 5;        /* priradi hodnotu 5 do premennych $a a $b */
  6 $c = $a++;          /* post-inkrement, priradi povodnu hodnotu $a 
  7                        (5) do $c */
  8 $e = $d = ++$b;     /* pre-inkrement, priradi zvysenu hodnotu 
  9                        $b (6) do $d a $e */
 10 
 11 /* v tomto bode su $d a $e rovnake a maju hodnotu 6 */
 12 
 13 $f = double($d++);  /* priradi dvakrat hodnotu $d pred zvysenim,
 14			 2*6 = 12 do $f */
 15 $g = double(++$e);  /* priradi dva krat hodnotu $e po zvyseni
 16                         2*7 = 14 do $g */
 17 $h = $g += 10;      /* najprv je $g zvysene na 10 a skonci s hodnotou 24.
 18                        potom je tato hodnota priradena do 
 19                        premennej $h, a $h skonci tiez s hodnotou 
 20                        24. */
 21 

 

13. Operátory

Aritmetické operátory

Pamätáte sa ešte na základy zo školy?

Tabuľka 13-1. Aritmetické operátory
Príklad názov výsledok
$a + $b Sčítanie súčet $a a $b.
$a - $b Odčítanie rozdiel $a a $b.
$a * $b Násobenie súčin $a a $b.
$a / $b Delenie podiel $a a $b.
$a % $b Modulo zvyšok $a pri delení $b.

Operátory priradenia

Základný operátor priradenia je znak "=". Váš prvý dojem môže byť, že to znamená rovná sa. Nie. Znamená to, priraď hodnotu výrazu na pravej strane výrazu na ľavej strane.

Príklad 13-2. Priradenie
  1 
  2 $a = ($b = 4) + 5; // $a je teraz rovné 9, $b je nastavené na 4.
  3 

Okrem základného operátora priradenia existujú tiež "kombinované operátory" pre všetky binárne aritmetické operácie a operácie s reťazcami.

Príklad 13-3. Aritmetické operátory
  1 
  2 $a = 3;
  3 $a += 5; // nastaví $a na 8, tak ako keby sme povedali: $a = $a + 5;
  4 $b = "Ahoj ";
  5 $b .= "svet!"; // nastaví $b na "Ahoj svet!", rovnako ako $b = $b . "svet!";
  6 

PHP podporuje už aj odkaz volaním, napríklad takto $premenna = &$inapremenna; Referencia odkazom znamená, že obidve premenné smerujú na rovnaký pamäťový blok, dáta medzi nimi nie sú kopírované, ide vlastne o dva pointre, ktoré smerujú na rovnaké miesto a tým pádom majú aj rovnakú hodnotu. Zmenou hodnoty jedného automaticky zmeníme hodnotu druhého.

Logické a bitové operátory

Umožnujú zapnúť špecifický bit v INTEGERi.

Tabuľka 13-4. Logické operátory
Príklad názov výsledok
$a & $b And Bity rovnaké v $a aj $b sú nastavené
$a | $b Or Bity ktoré sú nastavené v $a alebo $b sú nastavené.
$a ^ $b Xor Bity ktoré sú nastavené v $a alebo $b ale nie sú rovnaké.
~ $a Not Bity ktoré sú nastavené v $a nie sú nastavené
$a << $b posun vľavo posunie bity doľava ***
$a >> $b posun vpravo posunie bity doprava ***

Porovnávacie operátory

Umožnujú porovnať dve hodnoty

Tabuľka 13-5. Porovnávacie operátory
Príklad názov výsledok
$a == $b rovné True ak je $a rovné $b.
$a === $b identické True ak je $a rovné ako $b, a sú rovnakého typu. (len v PHP4)
$a != $b nerovné True ak nie je $a rovné $b.
$a < $b menšie True ak je $a menšie než $b.
$a > $b väčšie True ak je $a väčšie než $b.
$a <= $b menšie alebo rovné True ak je $a menšie alebo rovné než $b.
$a >= $b väčšie alebo rovné True ak je $a väčšie alebo rovné než $b.

Iný porovnávací operátor je "?:" (alebo ternárny) operátor, ktorý pracuje rovnako ako v jazyku C

Príklad 13-6. Ternárny operátor
  1 
  2 (vyraz1) ? (vyraz2) : (vyraz3);
  3 	 

Tento operátor vykoná expr2 ak expr1 je true, inak vykoná expr3.

Operátory kontroly chýb

PHP podporuje jediný takýto operátor, operátor (@). Ak je vložený pred výraz v PHP, hocaké chybové hlásernie generované týmto výrazom bude ignorované.

Ak je zapnuté sledovanie_chýb, všetky chybové hlásenia budú uložené do premennej $php_errormsg

Príklad 13-7. Porovnávacie operátory
  1 
  2 <?php
  3 /* vnútorná SQL chyba (extra apostrof): */
  4 $res = @mysql_query( "select name, code from 'namelist" ) or
  5    die( "Dopyt zlyhal - chyba je '$php_errormsg'" );
  6 ?>
  7      

Vykonávacie operátory

PHP podporuje vykonávacie operátory (``). PHP sa pokúsi spustiť príkaz uvedený v týchto operátoroch ako príkaz SHELLu.

Príklad 13-8. Vykonávací operátor
  1 
  2 $output = `ls -al`;
  3 echo "<pre>$output</pre>";
  4 	 

Inkrementačné/dekrementačné operátory

PHP podporuje syntax jazyka C pre inkrementačné a dekrementačné operátory.

Tabuľka 13-9. Ikrementačné/dekrementačné operátory
Príklad názov efekt
++$a Pre-inkrement zvýši $a o jeden a vráti $a.
$a++ Post-inkrement vráti $a, potom zvýši $a o jeden
--$a Pre-dekrement zníži $a o jeden, potom vráti $a.
$a-- Post-decrement vráti $a, potom zníži $a o jeden.

Nejaký užitočný príklad na precvičenie

Príklad 13-10. Inkrementácia a dekrementácia
  1 
  2 <?php
  3 echo "<h3>Postinkrement</h3>";
  4 $a = 5;
  5 echo "Má byť 5: " . $a++ . "<br>\n";
  6 echo "Má byť 6: " . $a . "<br>\n";
  7 
  8 echo "<h3>Preinkrement</h3>";
  9 $a = 5;
 10 echo "Má byť 6: " . ++$a . "<br>\n";
 11 echo "Má byť 6: " . $a . "<br>\n";
 12 
 13 echo "<h3>Postdekrement</h3>";
 14 $a = 5;
 15 echo "Má byť 5: " . $a-- . "<br>\n";
 16 echo "Má byť 4: " . $a . "<br>\n";
 17 
 18 echo "<h3>Predekrement</h3>";
 19 $a = 5;
 20 echo "Má byť 4: " . --$a . "<br>\n";
 21 echo "Má byť 4: " . $a . "<br>\n";
 22 ?>	  
 23 	 

Logické operátory

Tabuľka 13-11. Logické operátory
Príklad názov výsledok
$a and $b And True ak $a aj $b sú true.
$a or $b Or True ak jeden z $a alebo $b sú true.
$a xor $b Or True ak jeden z $a alebo $b sú true, ale nie obidva
! $a Not True ak $a nie je  true.
$a && $b And True ak $a aj $b sú true.
$a || $b Or True ak jeden z $a alebo $b sú true.

Príčina, že existujú rôzne operátory pre "and" a "or" je že pracujú s rôznou prioritou. (Pozri Priorita operátorov.)

Priorita operátorov

Priorita operátorov definuje, v akom poradí sa budú vo výraze vyhodnocovať. Napríklad výraz  1 + 5 * 3, je výsledok 16 namiesto 18 pretože operácia násobenie ("*") má vyššiu prioritu ako operácia sčítanie ("+").

Nasledujúca tabuľka udáva prioritu operátorov od najvyššej po najnižšiu.

Tabuľka 13-12. Priorita operátorov
Spracovanie Operátor
zľava ,
zľava or
zľava xor
zľava and
sprava print
zľava = += -= *= /= .= %= &= |= ^= ~= <<= >>=
zľava ? :
zľava ||
zľava &&
zľava |
zľava ^
zľava &
neasociatívna == != ===
neasociatívna < <= > >=
zľava << >>
zľava + - .
zľava * / %
sprava ! ~ ++ -- (int) (double) (string) (array) (object) @
sprava [
neasociatívna new

Reťazcové operátory

Existujú dva reťazcové operátory. Prvým je spojovací operátor ('.'), ktorý vráti spojenie pravého a ľavého argumentu. Druháým je operátor spojovacieho priradenia ('.='). Pre viac informácií si prečítajte Priradovacie operátory.

Príklad 13-13. Spájanie reťazcov
  1 
  2 $a = "Ahoj ";
  3 $b = $a . "svet!"; // teraz $b obsahuje "Ahoj svet!"
  4 
  5 $a = "Ahoj ";
  6 $a .= "svet!"; // teraz $a obsahuje "Ahoj svet!"
  7      

 

14. Riadiace príkazy

Všetky skripty PHP tvoria série príkazov. Príkazom môže byť priradenie, výraz, volanie funkcie, cyklus alebo podmienený príkaz, prípadne aj prázdny príkaz. Príkazy sa obvykle končia bodkočiarkou. Príkazy môžu byť združené do blokov príkazov, ktoré sú ohraničené zloženými zátvorkami { }. 

Riadiace príkazy tvoria logiku programu alebo skriptu. Podla úrovne zápisu je možné usúdiť, aký vyspelý bol programátor, ktorý danú aplikáciu vytváral. Preto je vhodné dodržovať pár základných pravidiel pri tvorbe programov. Tieto pravidlá zvyknem nazývať aj...

Štábna kultúra:

Túto kapitolu som sem zaradil schválne, nakoľko si to žiada situácia. Zo všeobecných skúseností je známe, že najme odporúčania týkajúce sa úpravy programov vyvolávajú nechuť a odpor. Pokiaľ však chceme písať väčšie programy, je nutné zaviesť nejaký poriadok a ak už nejaký zaviesť, tak je zbytočné vymýšľať už vymyslené. Takmer za každým odporučením skúsim uviesť aj príklad.

  • Odsazujte o 2 medzery každý logický úsek programu
Príklad 14-1. Odsadzovanie o 2 medzery
  1 
  2 if ($a == $b) {
  3   //vetva cislo 1
  4   echo "A je rovne B";
  5 }//end vetva 1 
  6 else {
  7   //vetva 2
  8   echo "A je ine ako B";
  9 }//endif    
  • Nezabúdajte vkladať prázdne riadky, zlepšujú čitateľnosť programu
     
  • Unárne operárory neoddeľujte od operandu medzerou!
Príklad 14-2. Unárne operátory
  1 
  2 $i++;
  3 $j = $i --   //zle!!!
  4   
  • Ľavá zložená zátvorka označujúca blok je vždy v riadku sama. Podobne aj ukončujúca zložená zátvorka. Úvodná zátvorka môže byť spolu s if, else, for, while, switch, return (pozri príklad 14-1)
     
  • Každý výraz (priradenie) na samostatný riadok. Výnimku tvoria príkazy s tesnou súvislosťou.
Príklad 14-3. Tesná súvislosť
  1 
  2 $x  = GetPositionX; $y = GetPositionY; 
  3   
  • Mená objektov, premenných či funcií píšte zásadne malými písmenami (prípadne prvé veľké – to je moja odchýlka od normy, budem sa ďalej snažiť). Využívajte podtrhovník. Nepoužívajte podobné identifikátory a identifikátory odlíšené len veľkosťou písma (syst, ssyt, Meno,meno).
     
  • Mená objektov musia mať význam, napr. meno a nie m1. Ak sa ku programu neskôr vrátite, nemusíte zabiť 30 minút dumaním, čo premenná x1zf4 vlastne znamená. Nehovorím už o prípadných spolupracovníkoch, ktorí majú chuť vraždiť pri lúštení Vášho špagetového kódu.
     
  • Tvorte mená racionálne, podľa určitého predpisu, napr:

View_file, print_file, Get_Your_Name()  

  • využívajte tzv. prefixy napr C – class, O – object, a – atribút, T – typ, R – record F-pole, P-pointer

Bežne používané významové identifikátory

i,j,k      -           indexy, parametre cyklu

c,ch      -           znaky

m,n      -           čítače

f,r         -           reálne čísla

p          -           pointer

s           -           reťazec

  • Nezabúdajte na komentáre  

if

Príkaz if je jeden z najdôležitejších príkazov všetkých programovacích jazykov, vrátane PHP. Umožnuje vykonávať úsek kódu v závislosti od splnenia podmienky. Syntax je rovnaká ako  v jazyku C.

Príklad 14-4. Štruktúra príkazu if
  1 
  2 if (výraz1)
  3     príkaz1
  4      

Ak je výraz výraz1 vyhodnotený ako pravdivý (TRUE) PHP vykoná príkaz príkaz1. Ak je výraz vyhodnotený ako nepravdivý (FALSE), PHP bude príkaz1 ignorovať - preskočí ho.

Nasledujúci príkaz vypíše a je väčšie ako b ak je premenná $a väčšia ako premenná $b.

Príklad 14-5. Jednoduchý if
  1 
  2 if ($a > $b)
  3     print "a je väčšie ako b";
  4      

V prípade, že chcete v závislosti od splnenia podmienky vykonať nielen jeden, ale viac príkazov, uzavrite ich do príkazového bloku:

Príklad 14-6. If s blokom
  1 
  2 if ($a > $b) {
  3     print "a je väčšie ako b";
  4     $b = $a;
  5 }
  6      

Príkaz if môže byť aj súčasťou iného if-u.

else

Častejšie sa však stretávame so situáciou ak pri splnení podmienky potrebujeme vykonať činnosť A a pri nesplnení činnosť B. Nato slúži výborne príkaz else. Blok za else sa vykoná vtedy, ak podmienka v prvej časti príkazu /if/ nie je splnená (FALSE).  

Príklad 14-7. if-else
  1 
  2 if ($a > $b) {
  3     print "a je vacsie ako b";
  4 } else {
  5     print "a je mensie alebo rovne b";
  6 }
  7      

elseif

Táto konštrukcia opäť rozširuje možnosti príkazu if. Príkaz uvedený za elseif sa vykoná, ak nie je splnená podmienka pre if a zároveň je splnená podmienka za elseif. Časť elseif môžeme použiť aj viackrát. Príkaz else sa vykoná len vtedy, ak nie je splnená žiadna podmienka elseif.

Môžeme používať aj zložené príkazy, či už pomocou zložených zátvoriek alebo dvojbodky a príkazu endif.

Príklad 14-8. If-elseif-else
  1 
  2 if ($a > $b) {
  3     print "a je vacsie ako b";
  4 } elseif ($a == $b) {
  5     print "a je rovneb";
  6 } else {
  7     print "a je mensie ako b";
  8 }
  9      

Alternatívna syntax pre riadiace príkazy

PHP ponúka alternatívnu syntax pre riadiace príkazy ako if, while, for, a switch. V základe je to zámena úvodnej zloženej zátvorky { za dvojbodku ':' a koncovej zloženej zátvorky } za  endif;, endwhile;, endfor;, alebo endswitch;,  - podľa toho, akú konštrukciu používate. Alternatívna syntax je v PHP len z historických dôvodov, v budúcnosti nebude ďalej podporovaná.

Príklad 14-9. Akternatívna syntax - blok
  1 
  2  <?php if ($a == 5): ?>
  3  A je rovné 5-tim
  4  <?php endif; ?>
  5      

V predošlom príklade, HTML blok "A = 5" je vložený vo vnútri príkazu if napísaného v alternatívnej syntaxi. HTML blok bude vypísaný len v prípade, že $a sa rovná číslu 5.

Podobne je to aj pri použití else a elseif.

Príklad 14-10. Alternatívna syntax if-elseif-else
  1 
  2 if ($a == 5):
  3     print "a je rovné 5";
  4     print "...";
  5 elseif ($a == 6):
  6     print "a je rovné 6";
  7     print "!!!";
  8 else:
  9     print "a nie je ani 5 ani 6";
 10 endif;
 11      

while

while je najjednoduchší cyklus v PHP. Správa sa rovnako ako while v jazyku C. 

Príklad 14-11. Syntax príkazu while
  1 
  2 while (výraz) príkaz
  3      

Tento iteračný príkaz testuje podmienky cyklu ešte pred prechodom cyklu, čo znamená že cyklus nemusí prebehnúť ani raz. Príkaz while používame, ak závisí ukončovacia podmienka na nejakom príkaze v tele cyklu. Zadaný cyklus sa teda prevádza len vtedy, ak je splnená podmienka na začiatku, preto sa mu aj hovorí cyklus s podmienkou na začiatku.

Pri tomto príkaze môžeme použiť aj alternatívnu syntax:
 

Príklad 14-12. Alternatívna syntax príkazu while
  1 
  2 while (expr): statement ... endwhile;
  3      

Výpis čísel od 1 do 10:

Príklad 14-13. Cyklus s podmienkou na začiatku
  1 
  2 /* Príklad 1 */
  3 
  4 $i = 1;
  5 while ($i <= 10) {
  6     print $i++;  /* vypis cisla $i
  7                   pred jeho inkrementaciou, tzv.
  8                   post-inkrementacia */
  9 }
 10  
 11 /* Príklad 2 */
 12  
 13 $i = 1;
 14 while ($i <= 10):
 15     print $i;
 16     $i++;
 17 endwhile;
 18      

do..while

Tento príkaz je ekvivalent Paskalovského REPEAT-UNTIL. Podmienka sa tu testuje až po prechode cyklom, teda cyklus prebehne najmenej raz a hovorieva sa mu cyklus s podmienkou na konci.

Jediná možná syntax cyklu do..while.

Príklad 14-14. Cyklus s podmienkou na konci
  1 
  2 $i = 0;
  3 do {
  4    print $i;
  5 } while ($i>0);
  6      

K príkazu do-while neexistuje alternatívna syntax. Pozor! Medzi Pascalom a PHP je podstatný rozdiel vo vyhodnocovaní záverečnej podmienky. Pascal opúšťa cyklus pri splnení záverečnej podmienky, PHP práve naopak, pri jej nesplnení.         

do
  i++ ;
while ( i<100 );

Pokiaľ do-while obsahuje zložený výraz, je vhodné písať podmienku while za uzatváracou zloženou zátvorkou “}”  zloženého príkazu.

Znalci jazyka C môžu použiť aj rozdielne použitie cyklu  do..while, ktoré umožnuje zastaviť vykonávanie cyklu v strede bloku príkazov pomocou  do..while(0), a použitím príkazu break. Viac asi napovie príklad:

Príklad 14-15. Prerušenie cyklu
  1 
  2 do {
  3     if ($i < 5) {
  4         print "i nieje dost vela";
  5         break;
  6     }
  7     $i *= $factor;
  8     if ($i < $minimum_limit) {
  9         break;
 10     }
 11     print "i je ok";
 12 
 13      ...spracuj i...
 14 
 15 } while(0);
 16      

for

Je príkaz cyklu, ktorý použijeme v prípade, že je predom známy počet prechodov cyklom. Jeho syntax je nasledovná:

Príklad 14-16. Syntax cyklu s pevným počtom iterácií - for
  1 
  2 for (vyraz1; vyraz2; vyraz3) prikaz
  3      

výraz1 je vyhodnotený pred začiatkom prevádzania cyklu. Potom je vyhodnotený výraz2. Aj je vrátené TRUE, prevádza sa telo cyklu príkaz. Na konci každého prechody cyklom sa vyhodnotí výraz3, čo sa deje tak dlho, pokiaľ má výraz2 hodnotu TRUE. Obvykle sa výraz1 používa na inicializáciu riadiacej premennej cyklu, výraz2 je podmienka prevádzania cyklu a výraz3 slúži na pravidelnú aktualizáciu riadiacej premennej cyklu.

Každý výraz /1,2,3/ môže byť prázdny. 

Výpis čísel od 1 do 10:

Príklad 14-17. Cyklus for
  1 
  2 /* Príklad 1 */
  3  
  4 for ($i = 1; $i <= 10; $i++) {
  5     print $i;
  6 }
  7  
  8 /* Príklad 2 */
  9  
 10 for ($i = 1;;$i++) {
 11     if ($i > 10) {
 12         break;
 13     }
 14     print $i;
 15 }
 16  
 17 /* Príklad 3 */
 18  
 19 $i = 1;
 20 for (;;) {
 21     if ($i > 10) {
 22         break;
 23     }
 24     print $i;
 25     $i++;
 26 }
 27  
 28 /* Príklad 4 */
 29  
 30 for ($i = 1; $i <= 10; print $i, $i++) ;
 31      

PHP tiež umožnuje použiť alternatívnu syntax:
 

Príklad 14-18. Alternatívna syntax cyklu for
  1 
  2 for (expr1; expr2; expr3): statement; ...; endfor;
  3      

foreach

PHP4 ( PHP3 nie) zahŕňa konštrukciu foreach, podobne ako perl a iné jazyky. Umožnuje jednoducho obsluhovať celé polia. Má dve syntaxe, aj keď druhá je len vedľajším rozšírením prvej:

Príklad 14-19. Syntax Foreach
  1 
  2 foreach(pole as $value) prikaz
  3 foreach(pole as $kluc => $hodnota) prikaz
  4      

Prvý riadok definuje cyklus v poli pole. Počas každého cyklu je aktuálnemu prvku poľa priradená hodnota $value a index aktuálneho prvku poľa je zvášený o jeden.  Druhý riadok robí to isté, s tým rozdielom, že aktuálnemu kľúču prvku poľa bude priradená premenná $hodnota počas každého priebehu cyklu.

Pri prvom volaní funkcie foreach je index poľa automaticky nastavený na jeho prvý prvok, takže volanie reset() je zbytočné.

Tieto dve konštrukcie sú teda úplne rovnaké.

Príklad 14-20. Konštrukcia Foreach 1
  1 
  2 reset ($arr);
  3 while (list(, $value) = each ($arr)) {
  4     echo "Hodnota: $value<br>\n";
  5 }
  6 
  7 foreach ($arr as $value) {
  8     echo "Hodnota: $value<br>\n";
  9 }
 10      

Podobne aj tieto:

Príklad 14-21. Konštrukcia Foreach 2
  1 
  2 reset ($arr);
  3 while (list($key, $value) = each ($arr)) {
  4     echo "Kluc: $key; Hodnota: $value<br>\n";
  5 }
  6 
  7 foreach ($arr as $key => $value) {
  8     echo "Kluc: $key; Hodnota: $value<br>\n";
  9 }
 10      

Pre demonštráciu použitia nasledujú ďalšie príklady:

Príklad 14-22. Konštrukcia Foreach 3
  1 
  2 /* foreach Príklad 1: value only */
  3 
  4 $a = array (1, 2, 3, 17);
  5 
  6 foreach ($a as $v) {
  7    print "Current value of \$a: $v.\n";
  8 }
  9 
 10 /* foreach Príklad 2: value (with key printed for illustration) */
 11 
 12 $a = array (1, 2, 3, 17);
 13 
 14 $i = 0; /* for illustrative purposes only */
 15 
 16 foreach($a as $v) {
 17     print "\$a[$i] => $k.\n";
 18 }
 19 
 20 /* foreach Príklad 3: key and value */
 21 
 22 $a = array (
 23     "one" => 1,
 24     "two" => 2,
 25     "three" => 3,
 26     "seventeen" => 17
 27 );
 28 
 29 foreach($a as $k => $v) {
 30     print "\$a[$k] => $v.\n";
 31 }
 32      

break

break umožnuje okamžité prerušenie prevádzania štruktúry if, for, while alebo switch.

break má nepovinný numerický argument, ktorý udáva, z koľkých zapúzdrených cyklov alebo iných štruktúr má vyskočiť.

Príklad 14-23. Break v praxi
  1 
  2 $i = 0;
  3 while ($i < 10) {
  4     if ($arr[$i] == "stop") {
  5         break;  /* mozem napisat aj 'break 1;'. */
  6     }
  7     $i++;
  8 }
  9 
 10 /* Pouzitie volitelneho parametru o kolko urovni vyskocit. */
 11 
 12 $i = 0;
 13 while ( ++$i ) {
 14     switch ( $i ) {
 15     case 5:
 16         echo "At 5<br>\n";
 17         break 1;  /* Ukonci len prikaz switch. */
 18     case 10:
 19         echo "Pri 10; koncim>\n";
 20         break 2;  /* Ukonci switch aj while. */
 21     default:
 22         break;
 23     }
 24 }
 25      

continue

continue okamžite preskočí ďalšie príkazy cyklu a začne prevádzať ďalšiu iteráciu cyklu.

continue má nepovinný číselný argument, ktorý udáva, koľko cyklov sa má preskočiť.

Príklad 14-24. Continue v praxi
  1 
  2 while (list ($key, $value) = each ($arr)) {
  3    if (!($key % 2)) { // preskoc parne cleny
  4        continue;
  5    }
  6    do_something_odd ($value);
  7 }
  8 
  9 $i = 0;
 10 while ($i++ < 5) {
 11     echo "Vonkajsi<br>\n";
 12     while (1) {
 13         echo "  Stredny<br>\n";
 14         while (1) {
 15              echo "  Vnutorny<br>\n";
 16              continue 3;
 17         }
 18         echo "Toto sa nikdy nevypise.<br>\n";
 19     }
 20     echo "Neither does this.<br>\n";
 21 }
 22      

switch

V prípade, že máme viac podmienkových vetiev, oplatí sa používať príkaz switch. Jeho syntax je nasledovná:

switch ( výraz1 )
{
                case HODNOTA A :
                     príkazA1;
                     príkazA2;
                     ......
                     break;
                case HODNOTA B :
                     príkaz B1;
                     príkaz B2;
                     ...
                     break;
          ...........
                default:
                     príkaz XXX1;
}

Ako to funguje? Najprv sa vyhodnotí výraz1 a potom sú postupne prechádzané hodnoty za case, až kým sa nenájde hodnota, ktorá sa rovná výrazu1. Následne sa vykonávajú príkazy, až kým sa nenarazí na príkaz break alebo koniec príkazu switch. Upozorňujem na to, že sa spracovávajú všetky príkazy (aj za case, pokiaľ sa nenarazí na break). Časť default sa vykoná vtedy, ak ani jedna hodnota sa nerovná výrazu1. Časť default je nepovinná.

Príklad 14-25. Kaskádový if a jeho nahradenie cez príkaz switch
  1 
  2 if ($i == 0) {
  3     print "i je rovne 0";
  4 }
  5 if ($i == 1) {
  6     print "i je rovne 1";
  7 }
  8 if ($i == 2) {
  9     print "i je rovne 2";
 10 }
 11  
 12 switch ($i) {
 13     case 0:
 14         print "i je rovne 0";
 15         break;
 16     case 1:
 17         print "i je rovne 1";
 18         break;
 19     case 2:
 20         print "i rovne 2";
 21         break;
 22 }
 23      

require()

Príkaz require() doplní miesto seba obsah zadaného súboru, podobne ako v jazyku C príkaz #include.

Nezabudnite, že súbory spracovávané príkazom include() alebo require() sú spracovávané ako PHP dokument, čo znamená, že časti ohraničené platnými PHP štart/stop tagom sú spracované ako PHP skript, ostatok ako HTML dokument. PHP časť musí začínať a končiť platným PHP štart/stop tagom

Táto require() nevracia žiadnu hodnotu.

Na rozdiel od include(), require() vždy číta cieľový súbor, aj keď sa príslušný riadok kódu vo Vašom skripte nikdy nevykonáva. Pre podmienené includovanie súboru použite radšej include()

Podobne, cykly takisto neovplyvňujú správanie require(). Ak je príkaz  require() súčasť cyklu, includovanie súboru sa vykoná len raz!

Ak chcete includovať rôzne súbory v cykle, použite  include().

Príklad 14-26. Zavolanie hlavičky
  1 
  2 require ('header.inc');
  3      

Nezabudnite, že include() aj require() získajú obsah súboru vlastnou cestou cez lokálny súborový systém, nie pomocou  HTTP .

Príklad 14-27. Pripojenie súboru
  1 
  2 require ("file.php?varone=1&vartwo=2"); /* nepracuje. */
  3 
  4 $varone = 1;
  5 $vartwo = 2;
  6 require ("file.php");  /* $varone a $vartwo budú k dispozícii v file.php */
  7      

 

15. Funkcie

Uživateľsky definované funkcie

Funkcie slúžia na zjednodušenie našich programov. V záujme skrátenia a spehľadnenia kódu delíme bloky kódu do jednoduchších častí, ktoré nesú názov podľa funkcie ktorú vykonávajú. Tieto programové bloky voláme procedúry alebo funkcie. Názov procedúry alebo funkcie by mal výstižne popisovať to, čo funkcia vykonáva. Funkcie môžeme volať s viacerými vstupnými parametrami, funkcia vracia jednu návratovú hodnotu. Príkladom môže byť funkcia pre sčítanie dvoch čísel, ktorá vracia výsledok:

Príklad 15-1. Scitanie dvoch cisel
  1 
  2 function scitaj ($scitanec_1, $scitanec_2) {
  3     $vysledok = $scitanec_1 + $scitanec_2;
  4     return $vysledok;
  5 }
  6    
  7 //priklad pouzitia
  8 $aritmetika = scitaj(5,5);
  9 echo "Vysledok je".$aritmetika;
 10 //skratene
 11 echo "Skrateny vysledok je".scitaj(5,5);  

Platný kód musí byť telom funkcie, podobne ako pri iných funkciách alebo triedach. Telo funkcie začína a končí blokovými operátormi { a }.

Argumenty funkcií

Informácie pre funkciu môžu byť dodané ako zoznam argumentov, ktorý je vlastne zoznamom premenných alebo konštánt oddelený čiarkami.

PHP podporuje volanie argumentov hodnotou (implicitne), volanie_odkazom, a implicitné hodnoty_argumentov. Zoznam argumentov s premenlivou dĺžkou je podporovaný len v PHP 4.xx. Pre viac informácií pozri zoznam argumentov_s_premenlivou_dĺžkou a popis funkcií func_num_args(), func_get_arg() a func_get_args(). Rovnaký efekt môžeme dosiahnuť aj v PHP 3 predaním poľa ako argumentu.

Príklad 15-2. Funkcia s argumentom typu pole
  1 
  2 function vezme_pole($vstup) {
  3     echo "$vstup[0] + $vstup[1] = ", $vstup[0]+$vstup[1];
  4 }
  5      
  6 $vstup = array ('jano','Fero');
  7 vezme_pole ($vstup);

Predávanie argumentov odkazom

Implicitne sú argumenty funkcie volané hodnotou, čo v skratke znamená, že ak zmeníme hodnotu argumentu vo vnútri funkcie, neovplyvní to hodnotu argumentu mimo nej. V opačnom prípade musíte použiť volanie funkcie odkazom. Ak chcete, aby bol argument funkcie volaný odkazom, musíte pred neho dať znak ampersand (&).

Príklad 15-3. Volanie odkazom
  1 
  2 function pridaj(&$string) {
  3     $string .= 'a niečo extra';
  4 }
  5 $str = 'Toto je reťazec ';
  6 pridaj($str);
  7 echo $str;    // vypíše 'Toto je reťazec a niečo extra'
  8       

Ak chcete volať aj normálnu funkciu (volanú hodnotou) odkazom, môžete pripojiť znak ampersand pred jej názov pri jej volaní.

Príklad 15-4. Volanie odkazom
  1 
  2 function foo ($bar) {
  3     $bar .= ' a niečo extra.';
  4 }
  5 $str = 'Toto je reťazec, ';
  6 foo ($str);
  7 echo $str;    // vypíše 'Toto je reťazec'
  8 foo (&$str);
  9 echo $str;    // vypíše 'Toto je reťazec a niečo extra'
 10       

Implicitné hodnoty argumentov

Funkcia môže použiť implicitnú hodnotu argumentov v prípade, že argument pri volaní neinicializujeme (nedodáme hodnotu). V prípade, že varíme kávu v reštaurácii /pomocou funkcie urobKavu/, predpokladáme, že 95% hostí si objedná kapučíno. To umožní zjednodušiť funkciu urobKavu tak, že ak nezadáme iný vstupný argument - iný typ kávy, tak nám implicitne uvarí kapučíno.

Príklad 15-5. Funkcia urobKavu s implicitnym argumentom
  1 
  2 function urobKavu ($type = "cappucino") {
  3     return "Urob salku kavy $type.\n";
  4 }
  5 echo urobKavu ();
  6 echo urobKavu ("espresso");
  7       

Výstup bude nasledujúci

Urob salku kavy cappucino.
Urob salku kavy espresso.

Implicitná hodnota musí byť konštanta, nemôže to byť premenná alebo člen triedy. Znamená to, že v tele definície funkcie sa implicitná hodnota môže definovať len raz. Nezabudnite, že implicitné argumenty môžu byť zaradené až za "klasickými" argumentmi, teda vždy v pravo v zozname argumentov. Nasledujúci príklad nebude preto fungovať.

Príklad 15-6. Chybny implicitny argument
  1 
  2 function urobJogurt ($type = "probio", $prichut) {
  3     return "Urob pohar jogurtu typu $type $flavour.\n";
  4 }
  5  
  6 echo urobJogurt ("jahoda");   // nefunguje
  7       

Vypíše

Warning: Missing argument 2 in call to urobJogurt() in 
xxx.php on line 6
Urob pohar jogurtu typu probio jahoda

A takto je to správne:

Príklad 15-7. Správny implicitný argument
  1 
  2 function urobJogurt ($prichut, $type = "probio") {
  3     return "Urob pohar jogurtu $type $flavour.\n";
  4 }
  5  
  6 echo urobJogurt ("jahoda");   // funguje
  7       

Výstup:

Urob pohar jogurtu probio jahoda.     

Návratové hodnoty

Návratová hodnota funkcie je inicializovaná nepovinným príkazom return. Vrátený môže byť hocaký typ, vrátane zoznamu či objektu.

Príklad 15-8. Návratová hodnota
  1 
  2 function mocnina ($num) {
  3     return $num * $num;
  4 }
  5 echo mocnina (4);   // vypíše '16'.
  6      

Aj keď v PHP nemôžete získať viac premenných z funkcie jednotlivo, ale môžete ich vrátiť pomocou poľa.

Príklad 15-9. Viac návratových hodnôt
  1 
  2 function male_cisla() {
  3     return array (0, 1, 2);
  4 }
  5 list ($nula, $jedna, $dve) = male_cisla();
  6      

Funkcie premenných

PHP podporuje aj návrh funkcie premenných. Znamená to, že názov premennej je použitý ako funkčné volanie funkcie.

Príklad 15-10. Funkcia premennej
  1 
  2 <?php
  3 function foo() {
  4     echo "Vo funkcii foo()<br>\n";
  5 }
  6 
  7 function bar( $arg = '' ) {
  8     echo "Vo funkcii bar(); argument bol '$arg'.<br>\n";
  9 }
 10 
 11 $func = 'foo';
 12 $func();
 13 $func = 'bar';
 14 $func( 'test' );
 15 ?>
 16      

16. Triedy a objekty

Prívrženci OOP (objektovo orientovaného programovania) sa doteraz určite len pousmievali a zabávali sa nad týmito „prízemnosťami“. Mám tu však aj niečo pre nich. Jazyk PHP prináša možnosť definície tried. Trieda je určitý typ, ktorý obsahuje dáta a dátové štruktúry (ale aj nemusí) a funkcie (metódy), ktoré su nad danými dátovými štruktúrami definované. Inštancia triedy v programe sa nazýva objekt. Objekt je teda fyz. štruktúra v pamäti počítača, pričom trieda je len akýsi predpis, ako objekt vytvoriť. Pomocou tried a objektov dosiahneme väčšiu čistotu a bezpečnosť programu, nakoľko to vychádza z objektovo orientovaného programovania a jeho troch základných vlastností:

  • dedičnosti

  • polymorfizmu

  • zapúzdrenosti.

Trieda má v jazyku PHP nasledovný schématický tvar:

class meno_triedy
{
    definícia premenných [ = inicializačná hodnota ] ;
    definícia funkcií ;
}

Trieda je súhrn premenných a funkcií, ktoré s týmito premennými pracujú. Triedu definujeme pomocou nasledujúcej syntaxe:

Príklad 16-1. Definicia triedy s 2 metodami
  1 
  2 <?php
  3 class Kosik {
  4     var $polozky;  // polozky v nakupnom kosiku
  5    
  6     // pridaj $pocet poloziek tovaru $cislo_vyrobku do kosika
  7  
  8     function pridaj_do_kosika ($cislo_vyrobku, $pocet) {
  9         $this->polozky[$cislo_vyrobku] += $pocet;
 10     }
 11    
 12     // zober $pocet kusov tovaru $cislo_vyrobku z kosika
 13  
 14     function vyber_z_kosika ($cislo_vyrobku, $pocet) {
 15         if ($this->polozky[$cislo_vyrobku] > $pocet) {
 16             $this->polozky[$cislo_vyrobku] -= $pocet;
 17             return true;
 18         } else {
 19             return false;
 20         }   
 21     }
 22 }
 23 ?>
 24      

Toto definuje triedu s názvom Kosik, ktorá pozostáva z asociatívneho poľa tovarov a dvoch funkcií - na pridávanie do košíka a vyberanie z košíka.

Triedy sú typy, co znamená, ze ak chceme vytvoriť premennú (inštanciu) triedy, musíme použiť operátor new

Príklad 16-2. Volanie triedy
  1 
  2  $kosik = new Kosik;
  3  $kosik->pridaj_polozku("10", 1);
  4     

Ten vytvorí objekt  $kosik triedy Kosik. Potom je zavolaná funkcia pridaj_do_kosika() pre vloženie 1 kusu tovaru číslo 10 do košíka.

Triedy môžu byť tiež rožšíreniami iných tried. Rozšírená alebo odvodená trieda má všetky premenné a funkcie pôvodnej triedy. Je nutné použiť kľúčové slovo extended. Viacnásobné dedenie nie je zatiaľ povolené, povolené sú len vnorené triedy.

Príklad 16-3. Definicia triedy Upraveny_Kosik
  1 
  2 class Upraveny_Kosik extends Kosik {
  3     var $vlastnik;
  4   
  5     function nastav_vlastnika ($meno) {
  6         $this->vlastnik = $meno;
  7     }
  8 }
  9     

Tento príklad definoval triedu Upraveny_Kosik ktorá má všetky premenné a funkcie triedy Kosik plus dodatočnú premennú $vlastnik a dodatočnú funkciu nastav_vlastnika(). Vytvoríte pomenovaný košík klasickou cestou a môžete nastaviť a získať názov vlastníka.

Príklad 16-4. Pouzitie triedy Upraveny_Kosik
  1 
  2 $novy_kosik = new Upraveny_Kosik;    // vytvorí  pomenovaný košík
  3 $novy_kosik->nastav_vlastnika ("kris"); // nastaví vlastníka
  4 print $novy_kosik->vlastnik;        // vypíše vlastníka
  5 $novy_kosik->pridaj_polozku ("10", 1); // (zdedená vlastnosť od triedy cart)
  6     

Vo funkcii triedy premenná $this značí tento objekt. Musíte použiť $this->niečo pre prístup ku premenným vo Vašom objekte.

Konštruktor je funkcia v triede, ktorá je automaticky zavolaná pri vytvorení inštancie objektu. Už jadro Zend 1.0 zaviedlo známu objektovú metódu konštruktor, ktorá je volaná pri vytváraní objektu. Jej opak však v tejto verzii jadra chýbal, ale nová verzia Zend 2.0 prináša podporu deštruktora, čo je metóda volaná pri rušení objektu. Deštruktor je automaticky volaný pri zrušení poslednej referencie na objekt. V predchádzajúcej verzii mal konštruktor meno danej triedy, v jadre 2.0 sa volá __construct(). Podobne má deštruktor meno __destruct().

Príklad 16-5. Definicia triedy pre Zend 1 a Zend 2
  1 
  2 class MojaTriedaZend1 { 
  3   function MojaTriedaZend1() { //stary typ konštruktora 
  4     print "Konstruktor pre Zend 1.0"; 
  5     $this->meno = "MojaTriedaZend1;
  6   }
  7 }//Zend 1.0
  8
  9 class MojaTriedaZend2 { 
 10   function __construct() { 
 11     print "Konstruktor\n"; 
 12     $this->meno = 'MojaTriedaZend2'; 
 13   }//nový konštruktor 
 14   function __destruct() { 
 15     print 'Zrusim ' . $this->meno . "\n"; 
 16   }//novy deštruktor
 17 }//Zend 2.0 
 18

Podobne ako konštruktor ani deštruktor nevolá implicitne svoj rodičovský konštruktor alebo deštruktor. V prípade, že chcete zavolať aj rodičovskú metódu, použite konštrukciu vo Vašom kóde:

  • rodičovský_objekt::__construct()

alebo

  • rodičovský_objekt:__destruct()

Zend 1.0 neposkytuje žiadnu možnosť odstránenia objektu, na ktorý ešte existuje referencia. Novozavedený príkaz delete umožnuje nútene zavolať deštruktor objektu a uvoľniť objekt z pamäte. Referencie, ktoré odkazovali na tento objekt budú neplatné a pokus o prístup k objektu bude sprevádzaný kritickou chybou.

Ak máte uživateľskú funkciu delete(), bude ju nutné premenovať, nakoľko toto kľúčové slovo je rezervované pre nútené volanie deštruktora. Pre zmeny v jadre ZEND 2 a novinky v objektovom modeli PHP 4.2 a vyššie si prečítajte dokument Zend 2 - Zmeny v PHP
 

17. PHP a Grafika

Knižnica GD umožnuje v spolupráci s PHP ľahko generovať dynamické obrázky a v spolupráci s inými knižnicami aj grafy. Spôsob použitia knižnice GD na dynamické generovanie orázkov je veľmi jednoduché.

Základnou podmienkou pre funkčnosť knižnice GD je jej aktivácia pri konfigurácii PHP. Ak používame systém PHP Home 2, stačí povoliť v súbore php.ini extension=php_gd.dll:

V súbore php.ini upravte časť extension na:

extension_dir = "C:\Program Files\PHP Home Edition 2\Apache2\php\extensions"
...
;extension=php_fdf.dll
;extension=php_filepro.dll
extension=php_gd.dll

V prípade ručnej kompilácie je nutné PHP skompilovať napríklad s týmito voľbami:

./configure --with-gd --with-ttf --sysconfdir=/etc --disable-debug --enable-track-vars --with-pdflib=/usr/local/pdflib --with-jpeg-dir --with-zlib-dir --enable-gd-native-ttf --with-tiff-dir --enable-ftp --enable-sockets --with-ttf --with-freetype

respektíve trochu okresane:

./configure --with-gd --with-ttf  --disable-debug --enable-track-vars  --with-jpeg-dir --with-zlib-dir --enable-gd-native-ttf --with-tiff-dir

Potrebné knižnice je nutné na systém nainštalovať napríklad cez príkaz apt get install <nazov kniznice> pričom inštalujeme nielen základnú verziu knižnice, ale aj jej vývojársku verziu končiacu na dev. Názov knižnice získame na http://www.debian.org/ v sekcii Packages, dáme all Packages. Príklad inštalácie knižnice GD:

#apt-get install libgd2
#apt-get install libgd2-dev

Príklad 17-1. Subor obrazok.php
  1 
  2 <?php
  3  Header("Content-type: image/png");
  4  $string=implode($argv," ");
  5  $im = ImageCreateFromPng("images/button_pozadie.gif");
  6  $orange = ImageColorAllocate($im, 220, 210, 60);  
  7  $px = (imagesx($im)-7.5*strlen($string))/2;
  8  ImageString($im,3,$px,9,$string,$orange);
  9  ImagePng($im);
 10  ImageDestroy($im);
 11 ?>

Knižnica GD umožnuje generovať obrázky typu JPG,PNG a staršie verzie knižnice aj GIF. Podpora posledného formátu bola ukončená vzhľadom na patentové problémy, je však možné knižnicu získať a skompilovať vlastnými silami.

Použitie predchádzajúceho príkladu je potom veľmi jednoduché, príkladom je tzv. dynamicky generované menu:

Príklad 17-2. Použitie dynamicky generovaného obrázka
  
  <!-- menu -->
  <table border="0">
  <tr>
    <td><a href="auta.html"><img src="obrazok.php?auta"></a></td>
    <td><a href="vlaky.html"><img src="obrazok.php?vlaky"></a></td>
    <td><a href="lietadla.html"><img src="obrazok.php?lietadla"></a></td>
    <td><a href="bicykle.html"><img src="obrazok.php?bicykle"></a></td>
  </tr></table>
  <!-- koniec menu -->

18. PHP a databázy

Pre správu databázového systému slúžia specializované nástroje. Viac informácií o relačných a objektových databázach je možné nájsť v príslušnej literatúre. Taktiež je vhodné rozumieť správe databázy, resp. poriadne si preštudovať kapitolu číslo 6.

V ďalších príkladoch bude pre správu DBS použitý nástroj phpMyAdmin a databáza MYSQL.

  • V hlavnom menu vytvoríme databázu test
     
  • Po úspešnom vytvorení databázy test ju vyberieme v ľavom selectboxe a klikneme na záložku SQL, kde nakopírujeme doleuvedený text do poľa Spustiť SQL dotaz/dotazy na databázu test a klikneme na tlačidlo Vykonať. Rovnaký efekt dostaneme ručnou definíciou tabuliek, resp. importom súboru test.sql
     
  • Nastavíme práva pre prístup k databáze test pre webového uživateľa (pre viac informácií pozri manuál k MYSQL) a reloadneme databázu v hlavnom menu: (Domov->Znovu-načítať MYSQL). Vhodné práva pre našu aplikáciu sú SELECT,INSERT,UPDATE,DELETE

Po týchto krokoch je databáza pripravená k použitiu.

# subor test.sql
# phpMyAdmin MySQL-Dump
# http://phpwizard.net/phpMyAdmin/
#
# Hostiteľ: localhost Databáza : test

# --------------------------------------------------------
#
# Štruktúra tabulky pre tabulku 'predmet'
#

USE DATABASE test;

CREATE TABLE predmet (
cp int(4) NOT NULL auto_increment,
nazov varchar(30) NOT NULL,
kredity tinyint(4) DEFAULT '0' NOT NULL,
PRIMARY KEY (cp)
);

#
# Dumping dát pre tabuľku 'predmet'
#

INSERT INTO predmet VALUES ( '1', 'Matematika', '4');
INSERT INTO predmet VALUES ( '2', 'Fyzika', '8');
INSERT INTO predmet VALUES ( '3', 'Operacna analyza', '100');
INSERT INTO predmet VALUES ( '4', 'Psychologia', '10');
INSERT INTO predmet VALUES ( '5', 'Malovanie', '3');

# --------------------------------------------------------
#
# Štruktúra tabulky pre tabulku 'student'
#

CREATE TABLE student (
id_st int(11) NOT NULL auto_increment,
meno varchar(30) NOT NULL,
priezvisko varchar(30) NOT NULL,
rc varchar(11) NOT NULL,
adresa varchar(50) NOT NULL,
stav char(1) DEFAULT 's',
PRIMARY KEY (id_st)
);

#
# Dumping dát pre tabuľku 'student'
#

INSERT INTO student VALUES ( '1', 'Milan', 'Gacik', '7701116236', '191', '');
INSERT INTO student VALUES ( '2', 'Janko', 'Hraško', '7688252222', '515', '');
INSERT INTO student VALUES ( '3', 'Janka', 'Nezabudkova', '7999223333', '454', 's');
INSERT INTO student VALUES ( '4', 'Janko', 'Luptak', '7810102222', 'Fazulova 25', 's');
INSERT INTO student VALUES ( '5', 'Ferkova', 'Bozenkova', '48489488484', 'Nevadzova 25', 's');

# --------------------------------------------------------
#
# Štruktúra tabulky pre tabulku 'zap_pred'
#

CREATE TABLE zap_pred (
id_st int(11) DEFAULT '0' NOT NULL,
cp int(11) DEFAULT '0' NOT NULL,
PRIMARY KEY (id_st, cp)
);

#
# Dumping dát pre tabuľku 'zap_pred'
#

INSERT INTO zap_pred VALUES ( '1', '1');
INSERT INTO zap_pred VALUES ( '1', '2');
INSERT INTO zap_pred VALUES ( '2', '2');

 

Príklad 18-1. Vypis všetkých údajov z tabuľky predmet
 1 <?php
 2 do {
 3   $conn = Mysql_Connect("localhost", "uzivatel", "heslo");  //tu nastav 
 4   if (!$conn;){
 5     echo "Nepodarilo sa pripojit k databaze";
 6     break;
 7   }//endif
 8   Mysql_Select_DB("test");
 9   $vysledok = @mysql_query("SELECT * FROM predmet");
10   if (!$vysledok) {
11     echo "Chybny dopyt SQL";
12     break;
13   }//endif;
14   echo "<table border=\"1\"";
15   while($riadok = mysql_fetch_array($vysledok)) {
16     echo "<tr>\n";
17     echo "<td>".$riadok["cp"]."</td>";
18     echo "<td>".$riadok["nazov"]."</td>";
19     echo "<td>".$riadok["kredity"]."</td>";
20     echo "</tr>\n";
21   } // endwhile
22   echo "</table>";
23   } while (false);
24 ?> 

Niekedy je vhodné prepájať viac tabuliek, tento typ výpisu sa volá MASTER-DETAIL výpis:

Príklad 18-2. Master-detail výpis
  
<?php
  Header("Expires: ".GMDate("D, d M Y H:i:s")." GMT");
?>
<h2>Vypis studentov s predmetmi</h2>
<?php 
  function showForm() {
  //vypise formularik
  do {
    $conn = @Mysql_Connect("localhost","root","root");
    if (!$conn){
      echo "Nepodarilo sa pripojit k databaze";
      break;
    }//  endif;
    Mysql_Select_DB("test");
    $query = "SELECT priezvisko FROM student ";
    $vysledok = @mysql_query($query);
    if (!$vysledok) {
      echo "Chybny dopyt";
      break;
    }//endif;
?>

<form action="" method="post">
<select name="priezvisko">

<?php
  while($riadok = mysql_fetch_array($vysledok)) {
    echo "<OPTION VALUE=\"".$riadok["priezvisko"]."\">";
    echo $riadok["priezvisko"]."\n";
  } //endwhile
} while (false);
?>

  </select>
  <input type="submit" name="odosli" value="Odosli">
</form> 

<?php
} //end show form 

function spracuj() {
  global $priezvisko;
?>

<table border="1">
<?
do {
  $conn = @Mysql_Connect("localhost","root","root");
  if (!$conn) {
    echo "Nepodarilo sa pripojit k databaze";
    break;
  }//  endif;
  Mysql_Select_DB("test");
  if (!isSet($tried)) $tried="ASC";
  $query="SELECT nazov,kredity FROM predmet,student,zap_pred WHERE
 priezvisko='$priezvisko' AND student.id_st=zap_pred.id_st AND zap_pred.cp=predmet.cp ";
  // echo $query; //<!-- ak testujes, vyremuj komentar
  $vysledok = @mysql_query($query);
  if (!$vysledok) {
    echo "Chybny dopyt";
    break;
  } //endif;
  while($riadok = mysql_fetch_array($vysledok)) {
    echo "<tr>\n";
    echo "<td>".$riadok["nazov"]."</td>";
    echo "<td>".$riadok["kredity"]."</td>";
    echo "</tr>\n"; 
  } //endwhile
} while (false);
echo "</table>";
}
?>
<div align="center"><a href="index.php">INDEX</a></div>

<?php
//end function Spracuj
if (!isSet($priezvisko)) showForm();
else spracuj();

?>