PHP

1. úvod
Základnou otázkou prečo používať php je to, ako by sme mohli pomocou bezstavového kódu HTML realizovať bežné funkcie známe z webových stránok, ako je počítadlo návštev, ankety, internetové obchody, zoznamky, diskusné fóra a pod. Hlavnou prekážkou nie je iba jazyk HTML, ktorý nesleduje stav užívateľských relácií, ale je to nutnosť ukladania údajov do súborov a databáz. S výnimkou jednoduchých osobných stránok HTML, používajú všetky webové aplikácie kód spúšťaný na serveri. V súčasnosti je najnovšou verziou PHP 5.0.5.

2. podpora
Platformou pre php je www server. Je dostupné pre všetky OS postavené na unixových základoch a MS Windows. Php je schopné bežať ako CGI (spolupracuje so všetkými www servermi, ktoré umožňujú beh CGI) alebo ako modul (len s www serverom Apache). Ak beží ako CGI, poskytuje menší výkon a bezpečnosť (kvôli samotnej technológii CGI). Najvýhodnejšia kombinácia php je ako modul v Apache. Inštalácia php nie je predmetom tohto referátu, ale aby bolo možné kompilovať php skripty, je potrebné vykonať jednu z možností:
1.) skript napíšeme v notepade, a uploadneme ho na naše konto na s.ics.upjs.sk
2.) na konkrétny počítač nainštalujeme program phphome z http://sourceforge.net/projects/phphome/)

3. možnosti
Php má v sebe zabudovaných množstvo nástrojov. Sú realizované pomocou knihovní, ktoré je možné aktivovať a deaktivovať v konfiguračnom súbore. Sú to databáza (rôzne typy počnúc MySQL a končiac Sybase), LDAP (light-weight directory Access protocol), XML, PDF, Email. Php ponúka veľa možností ako bežný jazyk (od práce s poľami počnúc až po prácu s obrázkami), ale v tomto referáte nemá zmysel sa venovať všetkým a celej syntaxi, pretože je to časovo náročné a na internete je možné o ňom nájsť veľa materiálov a free skriptov. Budem sa venovať tomu, na čo je php najviac využívané a čo má najlepšie zvládnuté oproti konkurencii (ASP), a to je komunikácia s databázou.

4. “hello world”
PHP (hypertext preprocessor) je skriptovací jazyk zabudovaný na strane serveru. Syntax je založená na jazyku C. Pracuje vo vnútri dokumentu HTML a prepožičiava mu tak schopnosť generovania požadovaného obsahu.
Úloha: Chceme vypísať do stránky tučným písmom klasický text „hello world“.
Kód bude vyzerať nasledovne:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>1.uloha</title>
</head>
<body>
<?php echo ("obycajny text"); ?></br>
<?php echo ("<B>hello world</B>"); ?>
</body>
</html>

Z tohto príkladu vidíme, že príkazy php treba v kóde html uzatvárať do párového tagu <?php a ?>. Všetky príkazy, ktoré nepatria k syntaxi php musia byť mimo tagov <?php a ?>. Ak ich chceme zahrnúť do syntaxe php, treba použiť príkaz echo a dynamicky ich generovať. Príkaz echo vypisuje text. V tomto príklade vidíme aj dynamické generovanie kódu html, kde sa do html kódu stránky po skompilovaní vypíše text <b>hello world</b>, čo je tag pre tučné písmo.

5. konkretizácia : php a databáza
Budem sa venovať konkrétne databáze MySQL.
Príklad: Autentizácia menom a heslom (pomocou databázy).
Najprv budeme potrebovať tabuľku s menom a heslom každého užívateľa, aby systém mal kde overovať heslo konkrétneho používateľa. Nech má tabuľka „overenie“ 3 stĺpce: id, menoheslo. Predmetom tohto referátu nie je jazyk SQL, preto je táto tabuľka už vytvorená na databázovom serveri s.ics.upjs.sk, kde prístupové meno a heslo k databáze (s menom skola) je skola, skola. Pre jednoduchosť nebudeme uvažovať, že heslá sa budú ukladať do tabuľky zašifrované. Budeme tiež potrebovať formulár (poskytuje jazyk HTML) na zadanie mena a hesla – nech je to samostatný html súbor formular.html :

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>overenie</title>
</head>
<body>

<form name="form1" method="post" action="overenie.php">
Meno:<input type="text" name="txtmeno" size="19"><br>
Heslo:<input type="password" name="txtheslo" size="15">
<input type="submit" value="OK">
</form>

</body>
</html>

Keďže predmetom referátu nie je jazyk HTML, budem sa venovať len prvkom, ktoré sú pre PHP najdôležitejšie. PHP čerpá údaje najmä z formulárov ( <form>formulár</form>). Tento prvok má atribút action - určuje cestu k súboru so skriptom, ktorý bude spracovávať dáta z formulára. Atribút method určuje spôsob odoslania údajov zadaných do formulára skriptu. Metódou GET pošleme údaje ako súčasť adresy url a metódou POST budú údaje poslané osobitne (nebudú viditeľné v adrese url a nebudú sa dať nasimulovať priamo v prehliadači). Doporučuje sa práve táto metóda, pretože okrem ukrytia údajov ponúka tiež možnosť poslania väčšieho množstva dát. V našom prípade overovania hesla z pochopiteľných dôvodov použijeme metódu post.
Prvok <input> slúži na vkladanie informácií od návštevníka stránky. Pre PHP sú dôležité atribúty typename. Type určuje typ formulárového prvku: text – textové pole, password – textové pole pre vloženie hesla a submit – tlačidlo pre odoslanie formulára. Atribút name definuje unikátne meno pre prvok formulára a PHP sa pomocou neho odkazuje na premenné.
Pri väčšine stránok s prihlasovaním, PHP pracuje aj so súbormi cookie, pomocou ktorých sa zabezpečí to, aby užívatelia mohli po určitú dobu prechádzať všetky podstránky bez neustáleho prihlasovania sa na každú podstránku. Pre jednoduchosť neuvažujme prácu s cookie súbormi.

Súbor overenie.php:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>overenie</title>
</head>
<body>

<?php
$spojenie=mysql_connect("s.ics.upjs.sk","skola","skola");
mysql_select_db("skola");
$pom=$_REQUEST['txtmeno'];

$sql="SELECT heslo FROM overenie WHERE meno='$pom' ";
$vysledok= mysql_query($sql);

if(!$vysledok): echo "Overovanie prave nefunguje, skuste sa prihlasit neskor"; exit; endif;
if (!mysql_num_rows($vysledok)) : echo "uzivatel neexistuje!"; exit;
else:
if(mysql_result($vysledok,"heslo") != $_REQUEST['txtheslo']):echo"zle heslo!";exit;else:
endif;
endif;
?>

<p>overenie bolo uspesne- vitaj <?php echo($pom)?></p>
</body>
</html>

Funkcie mysql _connect a mysql_select_db slúžia na spojenie php a databázy. mysql _connect má 3 parametre, a to (“databázový server”, “prihlasovacie meno do databázy”, “prihlasovacie heslo do databázy”). Keď je pripojenie úspešné, vracia funkcia identifikátor spojenia, v opačnom prípade vracia FALSE. mysql_select_db(“meno databázy”) nastaví pracovnú databázu na skôr zadanom servri a priradí ju k identifikátoru spojenia. Aby sme nemuseli ukladať údaje z polí <input> do premenných použijeme pole $_REQUEST, v ktorom je priamo uložená hodnota z prvku <input> s menom txtmeno. Takto do skriptu pošleme užívateľské mená a heslá. Teraz si môžeme pripraviť SQL dopyt, ktorý vráti heslo, ktoré patrí používateľovi v textovom poli txtmeno. Príkaz databáze pošleme pomocou funkcie mysql_query(“sql reťazec ”). Ak sa nepodarilo vykonať tento dopyt, vypíše sa hláška o nefunkčnosti a skript skončí. Teraz je potrebné skontrolovať, či je v databáze používateľ, ktorému by zadané meno vo formulári odpovedalo. Je to realizované pomocou funkcie mysql_num_rows, ktorá vracia počet riadkov vo výsledku dopytu z databázy. Do databázy bol poslaný SQL s podmienkou obmedzenia výberu len na určité používateľské meno. Ak počet riadkov vo výsledku je nula, znamená to, že užívateľ neexistuje a môžeme o tom vypísať hlášku a skript ukončiť. Ak užívateľ existuje, treba skontrolovať jeho heslo. To realizujeme pomocou funkcie mysql_result, ktorá vracia záznamy jedného stĺpca z výsledku zadaného dotazu. Ak sa to nezhoduje, môžeme vypísať hlášku o zlom hesle, a skript skončiť. Ak nenastanie žiadne skončenie skriptu, overenie hesla bolo úspešné a môžeme pracovať s konkrétnym užívateľom, napríklad sprístupniť mu citlivé údaje

6. Polia superglobalných premenných
V php sa často využívajú tieto polia na komunikáciu so stranou klienta (informácie o prehliadači, informácie z formulárov, a pod.). Najviac z nich využívané sú polia $_COOKIE, $_FILES, $_GET, $_POST, $_REQUEST, $_SERVER.
$_COOKIE – slúži na načítanie hodnoty konkrétneho súboru cookie: $_COOKIE[‘subor’]
$_FILES – nájdeme v ňom informácie o súbore prijímanom na serveri. Jeho jednotlivé prvky obsahujú pre každý prenesený súbor nasledujúce informácie:

- $_FILES[‘subor’][‘name’] – originálny názov súboru na strane klienta
- $_FILES[‘subor’][‘type’] – typ MIME súboru
- $_FILES[‘subor’][‘size’] – veľkosť súboru v bajtoch
- $_FILES[‘subor’][‘tmp_name’] – dočasný názov súboru na servri

$_GET – do tohto poľa sú ukladané hodnoty doručené metódou GET: $_GET[‘txtmeno‘]
$_POST – do tohto poľa sú ukladané hodnoty doručené metódou POST: $_POST[‘txtmeno‘]
$_REQUEST – slúži na to, aby sme nemuseli hodnoty zadané užívateľom do prvkov INPUT formulárov ukladať do premenných
$_SERVER – používa sa na zistenie interných informácií servera. Niektoré jeho možnosti sú uvedené v príklade:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>ukazka pola server</title>
</head>
<body>
<?php
echo $_SERVER['HTTP_USER_AGENT']." - <B>informacia o prehliadaci</B>"."</BR>";
echo $_SERVER['PHP_SELF']." - <B>aktualny skript</B>"."</BR>";
echo $_SERVER['SERVER_NAME']." - <B>meno servera</B>"."</BR>";
echo $_SERVER['REMOTE_ADDR']." - <B>ip adresa klienta</B>"."</BR>";
echo $_SERVER['SERVER_PORT']." - <B>port servra</B>"."</BR>";
echo $_SERVER['SERVER_SOFTWARE']." - <B>informacia o programoch na servri (www server)</B>"."</BR>"
?>

7. Niektoré funkcie vhodné pre prácu s databázou mysql:
mysql _affected_rows ([identifikator. spojenia]) – vracia počet ovplivnených riadkov dotazom
mysql _data_seek (id. spojenia,cislo riadku) – presunie sa na daný riadok sady výsledkov
mysql _error (id. spojenia) – vracia chybovú správu poslednej operácie
mysql _fetch_array (id. vysledku) – načíta ďalší riadok sady výsledkov do poľa
mysql _fetch_row (id. vysledku) – načíta ďalší riadok sady výsledkov do číslovaného poľa
mysql _free_result (id. vysledku) – uvolní pamäť, ktorú používa sada výsledkov
mysql_pconnect([host][:port][/cesta k socketu],[uzivatel],[heslo]) – vytvára trvalé spojenie s databázovým servrom
mysql_close(id. spojenia) – ukončí spojenie s mysql

8. Úlohy
a.) vytvorte formulár a PHP skript pre zaevidovanie nového užívateľa do tabuľky overenie (pre jednoduchosť bez ošetrení (nie je potrebné vytvárať <input> aj pre zopakovanie hesla nového užívateľa, o vkladanie id sa stará databáza sama)
b.) vytvorte formulár a PHP skript pre zmenu hesla konkrétneho užívateľa (nezabudnite na možnosti, že nemôžte meniť heslo užívateľa, ktorý neexistuje, že je potrebné overiť pôvodné heslo aby sa dalo vložiť nové do databázy) a pridajte ošetrenie, že nie je možné zmeniť heslo na prázdne.

Ako majú vyzerať vyriešené úlohy : s.ics.upjs.sk/~dzuris/sps