PHP
1. ÚVOD
V tomto referáte chcem ukázať čo je to PHP, základnú syntax a pár ilustračných príkladov. Programovanie v PHP sa podobá programovaniu v iných skriptovacích jazykoch. Syntax preberá od C.
PHP skript je vlastne obyčajná WWW stránka doplnená o špeciálne príkazy. Aby server vedel, že nebude mať do činenia len s obyčajnou WWW stránkou, používajú sa odlišné prípony. Klasická WWW stránka má príponu .html alebo .htm, stránka v jazyku PHP by mala mať príponu .php alebo .phtml.
Skript v PHP je v podstate textový súbor. Tento súbor obsahuje mix kódu HTML a PHP a môže byť napísaný v Notepade, Textpade.... Vytvorené súbory sa ukladajú tam, kde ukladáme WWW stránky. V našom prípade je to adresár C:\apache\htdocs .
2. ZÁKLADY PHP
Nakoľko PHP je program, je preto zložený z určitej sekvencie príkazov. Pretože býva uložený v HTML dokumente, treba WWW serveru jasne vymedziť, odkial ide o skript PHP a kde náš skript končí. Na to slúžia znaky ‘ <?’ resp. ‘ <?php’ a ‘?>’. Tieto znaky definuje norma SGML. Nasledujúce príklady sú ekvivalentné:
<?
echo("Hello World");
?>
<?php
echo("Hello World with XML");
?>
Prvý príklad je jasne najjednoduchší. Nestačí však, keď
chceme použiť PHP na generovanie XML dokumentov. Vtedy uprednostníme druhú
verziu, pretože XML je vlastne SGML jazyk.
Premenné:
Premenné sa vždy začínajú znakom dolár ‘$’ a môžu okrem písmen a číslic obsahovať aj znak poddtrhovník, pričom sa nesmú začínať číslicou. Premennú nie je nutné deklarovať, deklaruje sa automaticky. V prípade, že ju ani neinicializujeme, obsahuje imlicitne prázdny reťazec (STRING NULL).
Príklad 1:
<?
$premenna1 = "ahoj" ;
$premenna2 =5.13;
printf("%s<br>\n",$premenna1);
printf("%f<br>\n",$premenna2);
echo "bol vypisany
obsah premennych " ;
?>
Polia:
Pole je špeciálna dátová štruktúra, v ktorej sú jednotlivé premenné prístupné pomocou indexu.Index pola sa zapisuje do hranatých zátvoriek.
Pole môžeme
inicializovať priradením hodnôt ku každému prvku, alebo jednoduchšie a ľahšie
pomocou funkcie Array. Viac napovedia príklady:
$mesiac[ ]="Januar";// tu indexuje od 0
$mesiac[
]="Februar";
$mesiac[ ]="Marec";
Skúsme použiť
array.
$mesiac =
Array("Januar","Februar","Marec");// tu indexujem od 0
$mesiac =
Array(1=>"Januar","Februar","Marec");// tu index od 1
Úloha 1
Máme tri farby a tri čísla ktoré sú indexy tychto farieb. Náhodne vyberieme jeden index a text zafarbíme príslušnou farbou.
<HTML>
<HEAD>
<TITLE> Priklad 1 </TITLE>
</HEAD>
<BODY>
<?
?>
</BODY>
</HTML>
Objekty a triedy:
Trieda má v jazyku PHP nasledovný schématický tvar:
class meno_triedy
{
definícia premenných [ = inicializačná
hodnota ] ;
definícia funkcií ;
}
Napr:
class Cstudent
{
var $aMeno, $aPriezvisko,$aRC;
var
$aAdresa = "SLOVENSKO";
function Vypis()
{
printf("Meno: %s<br>\n",$this->aMeno);
}
}
Vo
funkcii musíme používať operátor this, ak chceme pristupovať
k premennej, nakoľko tá ešte fyzicky neexistuje.
Teraz vytvoríme inštanciu triedy:
$Student = new Cstudent;
$Student->aMeno = "Janko";
$Student->aPriezvisko = "Hrasko";
$Student->aRC = 7701116666;
$Student->Vypis();
Odporucanie jedneho mojho
dobreho kamosa (Samo K.):
triedy nedoporučujem pouzivat. Aj tak na nic prakticke sa nedaju pouzit. :)
Výrazy:
Zložitejší výraz tvorí nasledujúce priradenie:
premenná =
výraz bin_operátor výraz;
PHP podobne ako C-čko podporuje skrátený zápis priradení. V
nasledujúcej tabulke je uvedený prehľad operácií, ktoré PHP umožňuje zadávať v
skrátenej forme.
lný zápis Skrátený zápis
a = b +
c -
a = a +
c a += c
a = a -
c a -= c
a = a *
c a *= c
a = a /
c a /= c
a = a %
c a %= c
operácia |
PASCAL |
PHP |
rovnosť | = | == |
nerovnosť | <> | != |
log. súčin | and | && |
log. súčet | or | || |
negácia | not | ! |
Podmienený výraz:
Podmienený výraz je tiež novinkou, ktorá sa v jazyku Pascal nevyskytuje.
Patrí medzi ternárne operátory, čo znamená, že má až tri operandy. Jeho syntax
je nasledujúca:
výraz_podmienka ? výraz_1 : výraz_2
A má
význam: if výraz_podmienka then výraz_1 else
výraz_2, čiže výsledná hodnota výrazu je buď výraz_1 alebo
výraz_2, čo závisí na hodnote (pravdivosti) výrazu výraz_podmienka. Na
objasnenie malý príklad:
napr.
<?
$i=$j=$k=10;
$i=($j==10) ? 1:3; // i bude 10
$k=($i>$j) ? $i:$j;// k bude maximum z i a j, teda 10
echo "Maximum z
$i a $j je $k";
?>
Vetvenie programu:
Php
ponúka dva príkazy, ktoré umožňujú vykonávať určitú časť skriptu podmienene.
Slúžia na to príkazy if a switch v rôznych variáciách.
Príkaz
if-else
if ( výraz)
príkaz_A
;
else
príkaz_B ;
Príkaz if-elseif-else
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.
if ($a < $b)
echo ‘a je menšie ako b’;
elseif ($a == $b)
echo ‘a a
b sa rovnaju’;
else
echo ‘a je väčšie ako b’;
Príkaz 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. Časť default sa vykoná vtedy, ak ani jedna
hodnota sa nerovná výrazu1. Časť default je nepovinná.
Cyklus
Príkaz while
Tento príkaz testuje podmienky cyklu
ešte pred prechodom cyklu, čo znamená že cyklus nemusí prebehnúť ani raz.
while (výraz) príkaz ;
Napr.
$cislo = 0;
while (
$cislo < 10)
{
echo $cislo ." <BR>" ;
$cislo++ ;
}
Príkaz do-while
Tento príkaz je ekvivalent
Paskalovského REPEAT-UNTIL. Podmienka sa tu testuje a6 po prechode cyklom, teda
cyklus prebehne najmenej raz.
do
{
príkazy;
} while ( výraz) ;
Napr.
do
i++ ;
while ( i<100 );
Príkaz for
for (výraz1 ; výraz2; výraz3) príkaz;
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.
Napr.
for ($i = 1 ; $i < 10 ;
$i++)
{
echo $i ;
}
for ($i=10 , $j =20; $i+$j <100; $i++,
$j++);
PHP A
FORMULÁRE
Jazyk HTML obsahuje podporu formulárov, ktoré slúžia pre načítavanie dát
od používateľa. Formulár môže obsahovať tlačítka, editovacie boxy, listboxy,....
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>
Úloha 2
Zistite či zadané číslo na vstupe je prvočíslo.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
Transitional//EN">
<html>
<head>
<title>Priklad
2</title>
<meta content="text/html;
charset=windows-1250" http-equiv="Content-Type">
</head>
<body>
<?
echo"<form action=\"$PHP_SELF\" method=\"get\">\n";
echo"Napis cislo:\n";
echo"<input type=\"text\" size=10
maxlength=6 name=\"cislo\" value=\"$cislo\">\n";
echo"<input type=\"submit\" name=\"button\"
value=\"Vyskusaj\">\n";
echo"</form>\n";
if(isset($cislo)){
echo"<hr>\n";
if($cislo<1||$cislo>1000000){
echo"Cislo je mimo povoleneho rozsahu!";
}
else{
printf("Cislo
<strong>%d</strong> %s je
prvocislo.\n",$cislo,$ok?"":"nie");
}
}
?>
</body>
</html>
Funkcie
Definícia funckie je nasledovná:
function
meno_funkcie (parameter1, parameter2, ... )
{
príkazy ;
return hodnota
;
}
Pomocou parametrou predávame hodnoty, ktoré chceme
spracovať. Príkazom return funkcia vracia svoj výsledok. Pri jednoduchých
funkciách môžeme parametre úplne vynechať, podobne ako návrat hodnoty príkazom
return.
V tabuľke nižšie je uvedených zopár príkazov pre prácu so súbormi a adresármi.
Príkaz | Vysvetlenie |
chdir(adresar) |
funkcia nastavuje aktuálny adresár, ak sa zmena podarí, funkcia vracia true, inak flase |
closedir(ukazovatel na adresar) |
funkcia uzatvorí adresár otvorený na čítanie |
copy (zdroj, ciel) |
skopíruje |
fclose(ukazovatel na subor) |
funkcia uzatvorí súbor, ak sa súbor podarí uzatvoriť, funkcia vracia true, inak false |
feof(ukazovatel na subor) |
test konca suboru, ak je koniec vracia true, inak false |
fgetc(ukazovatel na subor) |
funkcia prečíta zo súboru jeden znak, ak sa dosiahol koniec súboru alebo došlo k chybe, funkcia vracia false, inak vracia prečítaný znak |
gfetss(ukazovatel na subor,
dlzka) |
funkcia prečíta jeden riadok zo súboru maximálne dĺžky dlzka-1 znakov, keď nastane chyba funkcia vráti false |
file(subor) |
funkcia načíta súbor do poľa, funkcia vráti pole, kde každý prvok obsahuje jeden riadok súboru |
file_exist(subor) |
funkcia testuje, či daný súbor existuje, ak áno vracia true, inak false |
filesize(subor) |
funkcia vracia veľkosť súboru v B |
fopen(subor, mod) |
funkcia otvorí súbor v zadanom móde a vracia
ukazovateľ na tento súbor, ak sa súbor nepodarí otvoriť, vracia
false ako mód môžeme použiť jeden z nasledujúcich reťazcov "r" (otvoriť pre čítanie), "w" (otvoriť pre zápis, ak súbor existuje, zmaže sa), "a" (doplňovanie, zápis na koniec), "r+" (otvorí súbor pre čítanie a zápis, súbor musí existovať), "w+" (otvorí súbor pre čítanie a zápis, ak súbor existuje je zmazaný), "a+" (otvorí súbor pre čítanie a doplňovanie), |
fpassthru(ukazovateľ na súbor) |
funkcia vypíše zostávajúci obsah súboru na štandardný výstup a súbor zatvorí |
fputs(ukazovatel na súbor,
retazec) |
funkcia zapíše reťazec do súboru (to isté ako fwrite) |
is_readable(súbor) |
zistí či sa daný súbor dá čítať, ak áno vracia true, inak false |
is_writeable(súbor) |
zistí či sa dá do súboru zapisovať, ak áno vracia true, inak flase |
mkdir(adresár, prava) |
príkaz vytvorí adresár s danými prístupovými právami, práva sa vyjadrujú číselne v osmičkovej sústave (napr.: 0700) |
opendir(adresar) |
funkcia otvorí adresár a vracia ukazovateľ na tento adresár, ak sa nepodarí adresár otvoriť, funkcia vracia false |
readdir(ukazivatel na adresar) |
funkcia prečíta názov jedného súboru z adresára, vracia názov tohto súboru, ak už boli všetky súbory prečítané, vracia false |
readfile(subor) |
vypíše obsah súboru na štandardný výstup |
rename(stare_meno, nove_meno) |
premenuje súbor, ak sa ho podarí premenovať, vracia true, inak false |
rewind(ukazovatel na subor) |
nastaví pozíciu v súbore na začiatok |
rewinddir(ukazovatel na adresar) |
presun na prvú položku v adresári |
rmdir(adresar) |
odstráni adresár |
tempnam(meno, prefix) |
funkcia vygeneruje jedinečné meno súboru v adresári začínajúce na prefix, funkcia vracia celé meno súboru vrátane cesty |
unlink(subor) |
zmazanie súboru, ak sa súbor podarí zmazať funkcia vracia true, inak false |
Úloha 3
Vytvorte program ktorý z daného adresára vypíše súbory s koncovkou .php a po kliknutí na súbor sa zobrazí jeho zdrják.
<?
function vypis($fname)
{
printf("<a href=\"obsah.php?subor=%s\">%s</a><br>\n",$fname,$fname);
}
}
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
Transitional//EN">
<html>
<head>
<title>Priklad
3</title>
<meta content="text/html; charset=windows-1250"
http-equiv="Content-Type">
</head>
<body>
<?
?>
</body>
</html>
PRÁCA S OBRÁZKAMI
Zisťovanie informácií o súbore s obrázkom
Pre
zistenie informácií o súbore s obrázkom existuje funkcia getimagesize, ktorá zistí formát obrázku a jeho
veľkosť.
Napr.
<html>
<head>
<title>Příklad 1. z
21. dílu</title>
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1250">
</head>
<body>
<?php
$informacia = getimagesize('obr1.jpg');
echo 'šírka
obrázku je ',$informacia[0],' pixelov.<br>';
echo 'výška obrázku je
',$informacia[1],' pixelov.<br>';
echo 'Formát obrázku je číslo
',$informacia[2],'.';
?>
</body>
</html>
Čo ktoré číslo formátu znamená se dozvieme v nasledujúcej tabuľke:
|
Funkcia getimagesize vracia pole, kde
index s číslom nula obsahuje šírku obrázku v pixeloch, index s číslom jedna
výšku obrázku a index s číslom dva vracia číslo formátu.
Ako vytvoriť premennú typu obrázok?
Premennú typu obrázok je možné vytvoriť niekoľkými spôsobmi. Tieto
spôsoby delíme podľa toho, či chceme vytvoriť nový prázdny obrázok alebo chceme
obrázok nahrať zo súboru.
Pre
tvorbu prázdneho obrázku používame funkciu imagecreatetruecolor. Táto funkcia vytvorí prázdny obrázok
so zadanou šírkou a výškou.
imagecreatetruecolor (šírka, výška)
Existujú
funkcie, ktoré vytvoria premennú typu obrázok nahratím zo súboru. Musí sa použiť
správna funcia podľa typu obrázku. Keď máme obrázok typu JPEG tak použijeme
funkciu imagecreatefromjpeg. Ak ide o obrázok typu
PNG tak sa používa funkcia typu imagecreatefrompng. Obe funkcie očakávajú ako
parameter meno súboru a vracajú premennú typu obrázok.
imagecreatefromjpeg (jméno_souboru)
imagecreatefrompng
(jméno_souboru)
Ďalšie dôležité funkcie:
imagesx() vráťi šírku obrázku
imagesy() vráťi výšku obrázku
imagecopyresampled($im, $res_im, 0, 0, 0, 0, $new_width+1, $new_height+1, $size[0], $size[1]) kopírovanie oblasti do cielového obázku
imagejpeg() vytvorí súbor typu JPEG
Úloha 4
Vytvorte program ktorý vytvorí fotoalbum z fotiek v súbore. Fotky
<?
function my_img($fname)
{
$a=getimagesize($fname);
printf("<img src=\"%s\" alt=\"Obrazok\" %s
border=\"0\">",$fname,$a[3]);
}
function
vytvor_zmenseninu($fname,$tname)
{
$jpg=imagecreatefromjpeg($fname);
if($jpg){
$th=imagecreatetruecolor($w,$h);
imagecopyresampled($th,$jpg,0,0,0,0,$w,$h,$ow,$oh);
imagejpeg($th,$tname);
}
}
function ukaz($fname)
{
if(substr($fname,0,3)=="th_") return 0;
if(substr($fname,-4,4)!=".jpg") return 0;
$thumb=sprintf("th_%s",$fname);
if(!file_exists($thumb))
{
vytvor_zmenseninu($fname,$thumb);
}
printf("<td><a href=\"%s\">",$fname);
my_img($thumb);
echo"</a></td>\n";
return
1;
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
Transitional//EN">
<html>
<head>
<title>Priklad
3</title>
<meta content="text/html;
charset=windows-1250" http-equiv="Content-Type">
</head>
<body>
<?
if($handle = opendir('.')){
$num=0;
echo"<table
border=1><tr>";
while(false!==($file=readdir($handle))){
if(is_file($file)){
if(ukaz($file)){
$num++;
if($num%5==0)
echo"</tr><tr>";
}
}
}
echo"</tr></table>\n";
closedir($handle);
}
?>
</body>
</html>
Linky: