Felhasználói eszközök

Eszközök a webhelyen


oktatas:programozas:php:php_nyelv

Tartalomjegyzék

< PHP

PHP nyelv

  • Szerző: Sallai András
  • Copyright © Sallai András, 2011, 2012, 2013, 2014, 2015
  • Licenc: GNU Free Documentation License 1.3

Bevezetés

Rasmus Lerdorf (kanadai programozó) Perl nyelven alkalmazást ír 1994-ben, hogy megtudja kik látogatják az önéletrajzát. A gép, ahol a weblap volt, lassú volt, ezért úgy gondolta C nyelven újra írja. Mások is szerették volna használni. Később más eszközöket is létrehozott, és a sikerét látva programcsomagot állított össze belőle. Ekkor adata első nevét:

  • Personal Home Page Tools

Rövidesen újabb nevet adott neki.

  • Personal Home Page Construction Kit

Készített egy másik csomagot, amely SQL adatbázisból tudott lekérdezni. Ennek neve:

  • Form Interpreter

Mindkét eszközt alaposan átírta és egyesítette 1997 végére a neve ekkor:

  • PHP/FI 2.0

A végleges 2.0 változatban bekerült a regex támogatás is.

1998-ban kiadták a 3.0-ás változatot, már Zeev Suraski (izraeli prog.) és Andi Gutmans (izraeli prog.) közreműködésével. A neve ekkor lett „PHP Hypertext Preprocessor”

  • PHP 3.0

Ekkor a PHP csak CGI-ként futtatható programok halmaza.

A PHP 4.0 változatát az apache már a mai formájában támogatta. Más webszervereken ekkor csak CGI formában futtatható.

A PHP nyelv sajátosságai

A PHP nyelv kis- és nagybetűérzékeny. Vannak utasítások amelyek nyelvi elemként vannak megvalósítva, és vannak amelyek függvényként. A függvényként megvalósított utasítások esetén mindig kötelező a zárójel. A függvények használhatók változóként meghívva.

Gyakorlat 01

Válaszoljon a következő kérdésekre:

  1. alkotójának neve
  2. mikor kezdődött a fejlesztés
  3. mi volt az első változat neve?
  4. milyen eszköz került a 2.0 végleges verzióba?
  5. mikor jött ki a 3.0 változat?
  6. kis és nagybetűérzékeny-e a PHP nyelv?

Helló Világ

Alaphelyzet, hogy készítünk egy .php kiterjesztésű állományt, amelyben leírjuk a PHP programunkat.

index.php
<?php
  echo("Helló Világ");
?>

A PHP programot <?php karaktersorozattal indítjuk, és ?> karakterekkel fejezzük be. A kettő közzé kerülnek a kódjaink. Lentebb látni fogjuk, hogy egy .html kiterjesztésű fájlba is beágyazható a phpkód.

Ha csak PHP kódot írunk (nem HTML-be ágyazott PHP), akkor megengedett a záró rész elhagyása:

index.php
<?php
  echo("Helló Világ");

Ezt megoldást sokak alapszabálynak tekintik, mások vitatják, merthogy mindent le kell zárni.

Megjegyzések

A programkódunkba megjegyzéseket tehetünk magunknak vagy más programozóknak. Ezeket a PHP értelmező nem dolgozza fel. A megjegyzések lehetnek egy vagy több sorosak.

Több soros:

/* több
   soros
   megjegyzés
 */

Egy soros:

//egy soros megjegyzés

Kiíratás

echo "Szöveg";
print "Szöveg";

Gyakorlat 02

Válaszoljon a következő kérdésekre:

  1. Mi a szerepe egy PHP programban a következő öt karakternek: <?php
  2. Mi a szerepe egy PHP kódban a következő két karakternek: ?>
  3. Van e olyan sor a következő kódok közöt, ami kihagyható egy PHP kódban?
    • <?php
    • ?>
    • mindkettő kötelező
    • egyik sem kötelező
  4. Hogyan lehet egysoros megjegyzést tenni PHP-ban?
  5. Hogyan lehet többsoros megjegyzést tenni PHP-ban?
  6. Írjon minimum két utasítást, amellyel kiíratás végezhető PHP nyelven.

HTML-be ágyazva

Az alábbi példában HTML-be ágyazva látjuk a PHP kódunkat. A nyitó és záró karaktersorozat megegyezik a fentiekkel, csak a <body> tegek közzé ágyaztuk azokat.

index.php
<html>
  <head>
    <title>Példa</title>
  </head>
  <body>
    <?php
    echo "Helló, vagyok!";
    ?>
  </body>
</html>

Vegyük észre, hogy a fájl kiterjesztése .php továbbra is. A fájlban viszont HTML oldalt írunk, annak csak egy kis része tartalmaz PHP kódot.

Escape szekvenciák

A PHP nyelven is használhatunk Escape szekvenciákat. Ezek a generált HTML oldal forráskódjában fognak megjelenni. A legjellemzőbben használt ilyen szekvencia a \n, amellyel egy újsor jelet írunk a HTML forrásban. Az alábbi táblázatban láthatjuk a többi escape szekvenciát.

Szekvencia Jelentés
\n újsor (LF vagy 0x0A (10) az ASCII táblában)
\r kocsi vissza (CR vagy 0x0D (13) az ASCII táblában)
\t vízszintes tabulátor (HT vagy 0x09 (9) az ASCII táblában)
\v függőleges tabulátor (VT vagy 0x0B (11) az ASCII táblában) (PHP 5.2.5 verziótól)
\e escape (ESC vagy 0x1B (27) az ASCII táblában) (PHP 5.4.0 verziótól)
\f lapdobás (FF vagy 0x0C (12) az ASCII táblában) (PHP 5.2.5 verziótól)
\\ backslash
\$ dollárjel
\„ idézőjel
\[0-7]{1,3} megegyezik a szabályos kifejezésekben szereplő oktális jelzéssel
\x[0-9A-Fa-f]{1,2} megegyezik a szabályos kifejezésekben szereplő hexadceimális jelzéssel

Kisérlet képpen írjunk egy „\n” escape szekvenciát a Helló és Világ szavak között található szóköz helyére:

index.php
<?php
  echo("Helló\nVilág");
?>

Nézzük meg az eredményt böngészőben. A böngészőben megtekintve új sorba nem fog kerülni a második szó. Ha a forrást megnézzük, akkor azonban felfedezhetjük a sortörést.

Ne felejtsük el, hogy mi állandóan HTML oldalakat generálunk. A HTML oldal forrásában szereplő sortörést szolgálhatja az átláthatóságot, de megjelenített HTML oldalon az nem jelenik meg. Ha a HTML oldalon szeretnénk sortörést, azt a <br /> tag HTML forrásba írásával érhetjük el.

Az alábbi példában a HTML oldalon szeretnénk a „Világ” szót új sorban látni:

index.php
<?php
  echo("Helló<br />Világ");
?>

Létezik még egy másik gyakran használt kiírató parancs is a print:

index.php
<?php
  print("Helló<br />Világ");
?>

Gyakorlat 03

Válaszoljon a következő kérdésekre.

  1. Milyen kiterjesztést kap az állomány, ha HTML kódba ágyazzuk a PHP kódot?
  2. Mire való a \n escape szekvencia?
  3. Mire való a \t escape szekvencia?
  4. Mire való a \” escape szekvencia?
  5. Mi íródik a böngészőbe weblap szinten a következő utasítás hatására:
    • echo „alma\nkörte”;
  6. Mi íródik a böngészőbe a weblap forrásának szintjén a következő utasítás hatására:
    • echo „alma\nkörte”;
  7. Mi íródik a böngészőbe weblap szinten a következő utasítás hatására:
    • echo „alma<br>körte”;
  8. Mi íródik a böngészőbe a weblap forrásának szintjén a következő utasítás hatására:
    • echo „alma<br>körte”;

Készítsen PHP programot:

  1. A program írja ki egymás alá a következő településneveket:
    • Miskolc, Szolnok, Szeged, Hatvan

HTML oldal generálása

Az eddig PHP kódjaink nagyon siralmas HTML oldalakat generáltak, azok semmilyen HTML szabványnak nem feleltek meg. Egy HTML5-ös verzióban írt szabályos HTML oldal a következő minimális tartalommal rendelkezik:

index.html
<!doctype html>
<html>
<head>
<meta charset="UTF-8" />
<title>Cím</title>
</head>
<body>
 
 
<p>Helló Világ</p>
 
</body>
</html>

Ha az eddig generált HTML oldal forrását megnézzük, akkor ezeket a tageket sehol nem látjuk. Generáljunk szabályos html odalakat. Ez azt jelenti, hogy minden egyes sor ki kell íratni echo vagy print utasítással:

index.php
<?php
print "<!doctype html>";
print "<html>";
print "<head>";
print "<meta charset=\"UTF-8\" />";
print "<title>Cím</title>";
print "</head>";
print "<body>";
 
 
print "<p>Helló Világ</p>";
 
print "</body>";
print "</html>";
 
?>

Vegyük észre a karakterkódolás beállításainál az escape szekvenciákat. Mivel az idézőjelnek külön szerepe van a PHP-ban, ha ilyen karaktert szeretnénk generálni egy HTML oldalon, akkor az csak escape szekvenciával tehetjük meg.

Később látni fogjuk, hogy van egy heredoc nevű szintaxis, amely segítségével egyetlen print utasítás is elég a HTML generálásához:

index.php
<?php
 
print <<<EOT
<!doctype html>
<html>
<head>
<meta charset="UTF-8" />
<title>Cím</title>
</head>
<body>
 
 
<p>Helló Világ</p>
 
</body>
</html>
EOT;
 
?>

Ha ezt használjuk nincs szükség escape szekvenciákra, a HTML forrásban is ugyanígy jelennek meg a tagek és a tartalom.

Gyakori hiba a „print <<<EOT” után tett egy vagy több szóköz vagy más nem látható karakter. Az „EOT” után csak a sortörés legyen!

Változók használata

A PHP nyelvben a változókat használatuk előtt nem kell deklarálni. Azok típusa fordítási időben dől el. A változónevek elé mindig egy „$” karaktert teszünk, amely nem tartozik a változó nevéhez. A változókat úgy hozzuk létre, hogy értéket adunk neki:

$szam = 35;

A fentiekben egy „szam” nevű változót hoztunk létre, amelyben a 35-ös egész számot tároltuk el. A „szam” karakter sorozat egy változót azonosít, ezért néha az ilyen azonosítóként említjük a munkánk során.

index.php
<?php
 
print <<<EOT
<!doctype html>
<html>
<head>
<meta charset="UTF-8" />
<title>Cím</title>
</head>
<body>
 
 
<p>Helló Világ</p>
 
EOT;
 
$szam = 35;
 
print $szam * 2;
 
print "</body>\n</html>";
 
 
?>

Szöveg megadása:

$nev = "Nagy János";

vagy:

$nev = 'Nagy János';

Ebből is láthatjuk, hogy karaktersorozatot idézőjellel, vagy aposztróffal adhatunk meg.

Gyakorlat 004

  • Készítse el az előző két fejezetben szereplő egyszerű PHP programot
  • Válaszoljon a következő kérdésre:
    • Milyen karakterrel vezetjük be a változóneveket.

Számok

A matematikából tudjuk, hogy vannak egész és valós számok. A programozás során mindkét számmal dolgozunk, a kétféle szám között különbséget teszünk.

Egész számok

$a = 1234; // decimális szám
$a = -123; // egy negatív szám
$a = 0123; // oktális szám (egyenértékű 83 decimálissal)
$a = 0x12; // hexadecimális szám (egyenértékű 18 decimálissal)

Valós számok

$a = 1.234;  //fixpontos szám
$a = 1.2e3;  //lebegőpontos szám

Konstansok

Konstans, azaz állandó. A programozó azt vállalja, hogy ezen a memóriaterületen elhelyezett értéket a program további részében nem változtatjuk meg. Egyszóval, olyan mint a változó, de később ez nem módosítható.

Előre definiált konstansok

A PHP nyelv tartalmaz jó-néhány előre meghatározott konstanst. A LINE konstans például az éppen olvasott fájlról ad információt.

Lássunk néhány előre definiált állandót a teljesség igénye nélkül.

__FILE__   Az aktuális fájl útvonal, neve, kiterjesztése egyben.
__LINE__   Az aktuális fájlban hányadik sorban vagyunk (ahol hivatkozunk erre a változóra /PHP forráskódban/)
PHP_VERSION
PHP_OS
TRUE        Értéke 1
FALSE       Nincs értéke
E_ERROR     Nem feldolgozás során bekövetkezett hiba
E_WARNING   Valami nincs rendben ("Ez nem biztos, hogy jó lesz így")
E_PARSE     Szintaktikai hiba
E_NOTICE    Lehet, hogy hiba, lehet nem
E_ALL       Minden E_* formátumú hiba
DIRECTORY_SEPARATOR   Könyvtárszeparátor

Az előre definiált konstansokat kiírathatjuk a következő paranccsal:

print_r(get_defined_constants());

Saját állandó definiálása

define("MAX", 300);
const MAX = 300;
const A = 3;	//Definiálunk egy állandót
echo defined("A") . "\n"; //Megvizsgáljuk van-e ilyen

Operátorok használata

Az operátorokról

Bármely programozási nyelvben az operátorok csinálnak valamit a változókkal és az állandókkal. Lehet, hogy összeszorozza őket, vagy összeadja, vagy különbséget von, vagy oszt stb. A változókat és az állandókat szokás operandus néven is emlegetni. Ebben a tekintetben azt mondhatjuk, hogy az operátorok az operandusokon csinálnak valamit.

Léteznek egy és két operandusú operátorok. Ha azt mondom: a * b. Az azt jelenti van egy „*” operátor, amely az „a” és „b” operandus szorzatát adja. De vannak olyan operátorok is, amelyeknek csak egy operandusok van. Ilyen például az az operátor amely egy változó értékét eggyel növeli: a++; Az operátor a „++”. Az operandus az „a”. Az „a” operandus (változó) értéke eggyel nő.

Aritmetikai operátorok

Operator Név Leírás Példa Visszatérési érték
x + y Összeadás x és y összege 2 + 2 4
x - y Különbség x és y különbsége 5 - 2 3
x * y Szorzat x és y szorzata 5 * 2 10
x / y Osztás x és y hányadosa 15 / 5 3
x % y Modulus x és y osztás maradéka 5 % 2
10 % 8
10 % 2
1
2
0
- x Negáció x ellentéte - 2
a . b Konkatenáció két sztring összefűzése „Hi” . „Ha” HiHa
index.php
<?php
print 5 * 3;
?>

Értékadó operátorok

Az alapértelmezett értékadó operátor a PHP-ban a „=”. Baloldalon mindig egy változó áll, jobboldalon pedig egy kifejezés, melynek értékét a változó felveszi.

Például:

$x = 5;
Értékadás Jelentése Leírás
x = y x = y A baloldali operátor felveszi a jobboldali kifejezés értékét
x += y x = x + y Összeadás
x -= y x = x - y Kivonás
x *= y x = x * y Szorzás
x /= y x = x / y Osztás
x %= y x = x % y Maradékok
a .= b a = a . b Két karaktersorozat összefűzése

Inkrementáló/Dekrementáló operátorok

Operátor Név Leírás
++ x Pre-increment Előbb növeli x értékét, majd visszaadja x értékét
x ++ Post-increment Visszatér x érétkével, majd növeli x-et.
-- x Pre-decrement Csökkenti x értékét eggyel, majd visszatér x-el
x -- Post-decrement Visszatér x-el, majd csökkenti x értékét

Összehasonlító operátorok

Két értéket hasonlítunk össze.

Operátor Név Leírás Példa
x == y Equal True ha x és y egyenlő 5==8 false értékkel tér vissza
x === y Identical True ha x és y egyenlő és azonos típusúak 5===„5” false értékkel tér vissza
x != y Not equal True ha x és y nem egyenlő 5!=8 true értékkel tér vissza
x <> y Not equal True ha x és y nem egyenlő 5<>8 true értékkel tér vissza
x !== y Not identical True ha x és y nem egyenlő vagy nem azonos a típusuk 5!==„5” true értékkel tér vissza
x > y Greater than True ha x nagyobb mint y 5>8 false értékkel tér vissza
x < y Less than True if x kisebb mint y 5<8 true értékkel tér vissza
x >= y Greater than vagy equal to True ha x nagyobb vagy egyenlő mint y 5>=8 false értékkel tér vissza
x <= y Less than vagy equal to True ha x kisebb vagy egyenlő mint y 5⇐8 true értékkel tér vissza

Logikai operátorok

Operátor Név Leírás Példa
x and y And Igaz ha mindkettő, azaz x és y is igaz x=6
y=3
(x < 10 and y > 1) returns true
x or y Or Igaz ha egyik vagy mindkettő igaz x=6
y=3
(x==6 or y==5) returns true
x xor y Xor Igaz, ha az egyik x vagy y igaz; de ha mindkettő igaz, az eredmény hamis x=6
y=3
(x==6 xor y==3) returns false
x && y And Igaz ha mindkettő, azza x és y is igaz x=6
y=3
(x < 10 && y > 1) returns true
x || y Or Igaz ha egyik vagy mindkét, x és y is igaz x=6
y=3
(x==5 || y==5) returns false
! x Not Igaz ha x nem igaz x=6
y=3
!(x==y) returns true

Tömboperátorok

Operátor Név Leírás
x + y Unió x és y uniója
x == y Equality True ha x és y azonos kulcs/érték párral rendelkezik
x === y Identity True ha x és y azonos kulcs/érték párral rendelkezik, egyező sorrendben és a típusuk is megegyezik
x != y Inequality True ha x nem egyenlő y-l
x <> y Inequality True ha x nem egyenlő y-l
x !== y Non-identity True ha x nem egyenlő y-l

Szintaxis

A programozás elméletből már tudjuk, hogy a szintaxis egy nyelvben a helyesírás. A helyesírást valamilyen formában rögzíteni is szokás. Eddig használtuk a print utasítást, nézzük meg a helyesírását, vagyis a szintaxisát.

A print utasítás szintaktikája:

int print ( string $arg )

Ebből azt látjuk, hogy a print utasításnak egy darab bemenő paramétere lehet, amelynek string típusúnak kell lennie. Ezt a zárójelekben lévő (string $arg) mutatja számunkra. A print előtt van egy „int”. Az int azt jelenti a print előtt, hogy a print egy egész számmal tér vissza, amelynek típusa int.

Amikor fentebb használtuk az print() függvényt, a visszatérési értékkel nem foglalkoztunk, de akár ezt is írhattam volna:

$szam = print("Teszt");

A $szam egy változó, amiben eltárolódik a print() függvény visszatérési értéke. A változó egy memóriaterület.

A fentiekből látjuk, hogy egy függvényt szintaxisában mindig leírjuk mik a bemenő paraméterek, és milyen értékkel tér vissza.

Formázott kivitel

printf függvény

Szintaxis:

int printf ( string $format [, mixed $args [, mixed $... ]] )

Formátumkarakterek

%% Százalékjelet ír
%b Bináris szám
%c Egy ASCII érték karakter megfelelője
%d Előjeles decimális szám
%e Tudományos alak (pl.: 1.2e+2)
%u Előjel nélküli decimális szám
%f Lebegőpontos szám (a helyi beállításokat figyelembe veszi)
%F Lebegőpontos szám (a helyi beállításokat nem veszi figyelembe)
%o Oktális szám
%s String
%x Hexadecimális szám (kisbetűs)
%X Hexadecimális szám (nagybetűs)

Egyéb módosítók

Ezek a módosítók a % jel és a betű között helyezhetők el:

Például:

%.2f
+ Számok előtt a plusz jel kiíratása
' Mit használjunk kitöltőnek A %'x20s például az „x” karakterrel tölt ki
- Balra igazítás
[0-9] A kiíratás szélessége
.[0-9] A tizedesjegyek száma

Példák

Példa1:

$str = "Helló";
$szam = 123;
printf("%s Világ. A nap száma: %u", $str, $szam);

Kimenet:

Helló Világ. A nap száma: 123 

Példa2:

$number = 123;
printf("%f",$number);

Kimenet:

123.000000 

Matematikai függvények

abs()

number abs ( mixed $number )

Egy szám abszolút értékét adja

ceil()

Felfele kerekített egész számot ad vissza.

cos()

float sin ( float $arg )

Egy szám koszinuszát adja vissza. Paraméterként radiánt kell megadni.

deg2rad

float deg2rad ( float $number )

exp()

float exp ( float $arg )

floor()

float floor ( float $value )

Egy szám lefele kerekített egész értékével tér vissza.

Példa:

$a = 5.83;
print floor($a);

Eredmény:

5

log10()

float log10 ( float $arg )

Tízes alapú logaritmus.

log()

float log ( float $arg [, float $base = M_E ] )

Ha a base paraméter meg van adva, akkor visszatér ezen alapú logaritmussal, egyébként természetes alapú logaritmussal tér vissza.

max()

A legnagyobb érték kiválasztása:

mixed max ( array $values )
mixed max ( mixed $value1 , mixed $value2 [, mixed $value3... ] )

min()

A legkisebb érték kiválasztása

mixed min ( array $values )
mixed min ( mixed $value1 , mixed $value2 [, mixed $value3... ] )

pi()

float pi ( void )

pow()

number pow ( number $base , number $exp )

rad2deg()

float rad2deg ( float $number )

round()

szintaxis:

float round ( float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]] )

Visszatér egy kerekített értékkel. Állítható a precizitás és a mód:

val A kerekítendő érték
precision Opcionálisan megadható precizitás
mode A következő közül egy: PHP_ROUND_HALF_UP, PHP_ROUND_HALF_DOWN, PHP_ROUND_HALF_EVEN vagy PHP_ROUND_HALF_OD

sin()

float sin ( float $arg )

Egy szám szinuszát adja. Paraméterként radiánt kell megadni.

sqrt()

float sqrt ( float $arg )

Gyökvonás

tan()

float tan ( float $arg )

Egy szám tangensét adja. Paraméterként radiánt kell megadni.

Dátum

Néha szükségünk van az aktuális dátumra, vagy éppen az időpontra. A date() függvény segíthet számunkra. Paraméterként egy karaktersorozatban meg kell adni milyen formában szeretnénk viszontlátni a dátumot vagy éppen az időt.

Példa:

$today = date("Y-m-d"); 
 
print $today;

Működés közben:

2020-04-01

További formázási lehetőségeket a következő táblázat alapján valósíthatunk meg:

Használható kódok
d A hónap napja (forma 01 to 31)
D A nap szöveges megjelenéssel (három betű)
j A hónap napja vezető nullák nélkül (1 to 31)
l (kisbetűs 'L') - A nap teljes szöveggel
N A nap ISO-8601 számformátumban (Hétfő 1 -től Vasárnap 7-ig)
S Angol elöljárók a hónap napjai számára (2 karakter st, nd, rd vagy th. Jól működik a j-vel)
w A hét napja számmal 0 és 6 között (0 vasárnaptól egészen 6-os szombatig)
z Az év adott napja (0-tól - 365-ig)
W Az év hete számmal, az ISO-8601 szerint (a hét hétfővel kezdődik)
F A hónap teljesen szövegesen (January - December)
m A hónap számokkal (01 – 12)
M A hónap rövid szöveges formája (három betű)
n A hónap számokkal, vezető nullák nélkül (1 – 12)
t A napok száma az adott hónapban
L Az adott év szökőév? (1 ha szökőév, 0 ha nem)
o A ISO-8601 szerinti év számmal
Y Az év négy számjeggyel ábrázolva
y Az év két számjeggyel ábrázolva
a Kisbetűs am vagy pm
A Nagybetűs AM vagy PM
B Swatch Internet time (000 – 999)
g Egy óra 12-órás formában (1 – 12)
G Egy óra 24-órás formában (0 to 23)
h Egy óra 12-órás formában (01 to 12)
H Egy óra 24-órás formában (00 to 23)
i Perc, vezető nullákkal (00 to 59)
s Másodperc, vezető nullákkal (00 to 59)
e Az időzóna azonosítója (Például: UTC, Atlantic/Azores)
I (nagybetűs i) - Vajon nyári időszámításban van a dátum? (1 nyári időszámítás esetén, 0 ha nem)
O Greenwich-től hány órára vagyunk (GMT) órában (Például: +0100)
T Időzóna beállítás a PHP-t futtató gépen. (Például: EST, MDT)
Z Időzóna lépték másodpercben. Az UTC nyugatra negatív, keletre pozitív (-43200 – 43200)
c Az ISO-8601 szerinti dátum (pl. 2004-02-12T15:19:21+00:00)
r The RFC 2822 formatted date (pl. Thu, 21 Dec 2000 16:01:07 +0200)
U Az eltelt idő másodpercekben Unix idő óta (January 1 1970 00:00:00 GMT)

Véletlen szám

Prototípusok

int rand ( void )
int rand ( int $min , int $max )
void srand ([ int $seed ] )
int getrandmax ( void )

Véletlen szám generálás példa

$kocka = rand(1, 6);
$lottoszam1 = rand(1, 90);
srand(mktime());
$a = rand(1, 6);
print $a;

Eredmény: 2

Konverzió

decbin()

string decbin ( int $number )

dechex()

string dechex ( int $number )

decoct()

string decoct ( int $number )

hexdec()

number hexdec ( string $hex_string )

octdec()

number octdec ( string $octal_string )

Érvényes változónevek

$4site      = 'ez nem jó'; // nem érvényes, mert számmal kezdődik
 
$_4site      = 'ez ok';    // érvényes, aláhúzással kezdődik
$täyte       = 'mansikka'; // érvényes, az 'ä' az ASCII 228-as karaktere
$tükörfúrógép = "árvíztűrő"; // érvényes, ellenőrizheted egy ASCII táblában

Változók cím szerinti átadása

<?php
$foo = 'Bob';         // 'Bob' hozzárendelése $foo-hoz
$bar = &$foo;         // Hivatkozás $foo-ra $bar-ban.
$bar = "Nevem $bar";  // $bar megváltoztatása...
echo $foo;            // $foo is megváltozik.
echo $bar;
?>

Kifejezések

Minden kifejezés amit leírsz.

Pontosabban: valami, aminek értéke van

Ha van egy változónk önmagában (mint az alábbi példában az egyenlőség jel jobb oldalán), akkor persze nem szoktuk kifejezésként említeni:

$eredmeny = $ertek;

De ha vannak körülötte operátorok is, akkor már igen:

$eredmeny = $ertek + 2;

A kifejezés a példában tehát:

$ertek + 2

Azt mondhatjuk az egyenlőség jobb oldalán egy kifejezés áll.

Karakterek

chr

Adott kódú karaktert add vissza

print chr(97);

Eredmény:

a

ord

print ord("a");

A futtatás eredménye:

97

Whitespace karakterek levágása

chop, rtrim

Whitespace vagy más karaktert levág

$ujsz = chop($sz);
$ujsz = chop($sz, „\n”);

Második paraméter nélkül levágja a következőket:

" " (ASCII 32 (0x20))   általános szóköz
"\t" (ASCII 9 (0x09))   tabulátor
"\n" (ASCII 10 (0x0A))  új sor
"\r" (ASCII 13 (0x0D))  kocsi vissza
"\0" (ASCII 0 (0x00))   NULL-byte
"\x0B" (ASCII 11 (0x0B) vertikális tabulátor

Bekérés

Jó kérdés, hogy böngészőben bekérés esetén hol adjuk meg az adatot. Beírhatjuk paraméterként, és akkor egy $_GET[] tömbben tudunk rá hivatkozni.

De bekérhetjük egy HTML oldalon is, amiből meghívhatjuk a feldolgozó PHP scriptet.

fel.php
$szam = $_GET['szam'];
print "Ezt irtad: $szam";

A végrehajtáshoz ezt írjuk a böngészőbe:

http://server/gyakorlas/fel.php?szam=40

Tulajdonképpen paraméterként adtam át a számot a böngésző címsorában.

Ugyanezt megtehetem egy másik weblappal is:

beker.php
<?php
 
 
print <<<EOT
 
<meta charset="utf-8">
<form action="fel.php" method="get">
szám: <input type="text" name="szam"><br>
<input type="submit"><br>
</form>
 
EOT;

Létrehozunk egy űrlapot, ahova a felhasználó beírhatja a kért számot. A böngésző meghívja a fel.php scriptet.

Természetesen ez lehet szimpla HTML oldal is:

beker.html
<meta charset="utf-8">
 
<form action="fel.php" method="get">
szám: <input type="text" name="szam"><br>
<input type="submit"><br>
</form>

A példában egy hiányos HTML oldal látunk.

Szelekció

Egyágú szelekció

if (feltétel)
     utasítás;
if (feltétel) {
     utasítás1;
     utasítás2;
}

Kétágú szelekció

if (feltétel)
     utasítás;
else
     utasítás;

Többágú szelekció (if)

if (feltétel) {
    utasítás ha feltétel igaz;
}
elseif (feltétel) {
    utasítás ha feltétel igaz;
}else {
    utasítás ha feltétel hamis;
}

Több ágú szelekció (switch)

switch ($valasztott) 
{
    case ”elso”:         print ”Első”; break;
    case ”masodik” :     print ”Második”; break;
    case ”harmadik” : print ”Harmadik”; break;
}
index.php
<?php
 
$gyumolcs = "almaa";
switch($gyumolcs)
{
    case "alma" : print "apple"; break;
    case "barack" : print "peach"; break;
    case "szilva" : print "plum"; break;
    default : print "Más";
}
print "\n";
?>

Iteráció

Amíg típusú ciklusok

while(feltétel) {
    utasítás1;
    utasítás2;
    utasítás3;
}
do {
    utasítás1;
    utasítás2;
    ...
    utasításn;
} while (feltétel);

Addig ismétel amíg igaz.

Növekményes ciklus

for (indulóérték; feltétel; növekedés) {
 
}

Példa:

for($i=0; $i<5; $i++) {
	print "alma<br>";
}

Iterátor

foreach ($tomb as $elem){
    echo $elem;
}

Tömbök

Numerikus tömbök

$jarmu[0]="Kia";
$jarmu[1]="Volvo";
$jarmu[2]="Opel";
$jarmu[3]="Toyota";

De így is lehet:

$tomb[] = "alma";
$tomb[] = "szilva";
$tomb[] = "körte";
$tomb[] = "barack";
 
print_r($tomb);

Asszociatív tömbök

A PHP asszociatív tömbjei rendezett leképezések.

Általánosan:

array(  kulcs =>  érték
     , ...
     )

A kulcs lehet egész szám vagy karaktersorozat, az érték bármilyen típusú lehet.

<?php
 
$tomb = array("nev" => "Joska", 2 => true);
 
echo $tomb["nev"];
echo $tomb[2];
?>
<?php
$tomb = array("alma", "körte", "szilva", "barack");
var_dump($tomb);
?>
array(4) {
  [0]=>
  string(4) "alma"
  [1]=>
  string(6) "körte"
  [2]=>
  string(6) "szilva"
  [3]=>
  string(6) "barack"
}

Többdimenziós tömbök

$csaladok = array(
      "Nagy"=>array
      (
          "Páter",
          "Laci",
          "Magdi"
      ),
      "Kiss"=>array
      (
          "Gábor"
      ),
      "Barna"=>array
      (
          "Tamás",
          "Lori",
          "István"
      )
);
 
echo $csaladok['Barna'][2];
$termekek = array(
		array("alma", 380, 45),
		array("körte", 435, 78),
		array("szilva", 218, 510),
		array("barack", 525, 40)
	);

Bejárás:

foreach($termekek as list($termek, $ar, $mennyiseg)) {
	echo "$termek $ar $mennyiseg<br>";
 
}

end()

A tömb utolsó elemét adja

$tomb = array(3, 9, 4, 5);
print end($tomb);

Eredmény:

5

sort()

Egy tömb elemeit sorba rendezi

$tomb = array( 3, 4, 5, 9, 2, 6);
print_r($tomb); print "<br>";
sort($tomb);
print_r($tomb); print "<br>";

Eredmény:

Array ( [0] => 3 [1] => 4 [2] => 5 [3] => 9 [4] => 2 [5] => 6 )
Array ( [0] => 2 [1] => 3 [2] => 4 [3] => 5 [4] => 6 [5] => 9 ) 

asort()

Egy tömb elemeit sorba rendezi, úgy hogy a kulcsokat is áthelyezi.

$tomb = array( 3, 4, 5, 9, 2, 6);
print_r($tomb); print "<br>";
asort($tomb);
print_r($tomb); print "<br>";

Eredmény:

Array ( [0] => 3 [1] => 4 [2] => 5 [3] => 9 [4] => 2 [5] => 6 )
Array ( [4] => 2 [0] => 3 [1] => 4 [2] => 5 [5] => 6 [3] => 9 )

count()

$tomb = array(5, 8, 2, 7, 3, 4);
$meret = count($tomb);

array_push()

array_push(array,value1,value2...)
$tomb = array();
array_push($tomb, $valtozo);
$tomb = array();
array_push($tomb, 45);
array_push($tomb, 28);
array_push($tomb, 87, 23, 21);
$tomb = array("alma", "körte");
array_push($tomb, "barack", "szilva");
  • array_pop() - A tömb végéről kiszed egy elemet
  • array_shift() - A tömb elejéről kiszed egy elemet
  • array_unshift() - Adott számú tömbelem visszaállítása
    • array_unshift($tomb, 1);

Karaktersorozatok a PHP-ban

  • aposztróffal
  • idézőjellel
  • heredoc szintaxissal
  • nowdoc

Aposztróffal:

$a = 'lorem ipsum dolorest amet';

Idézőjel:

a = "lorem ipsum dolorest amet";

Heredoc szintaxissal:

$s = <<<EOT
első sor
második sor ...
EOT;

Nowdoc szintaxissal:

$str = <<<'EOD'
első sor
második sor ...
EOD;

Ez utóbbi esetben a változók nem kerülnek behelyettesítésre.

Sztring műveletek

Összefűzés

$a = "Para ";
$b = $a . "Para";
$a = "Dárdarázó ";
$a .= "Villmos";

Karaktersorozat változók

$var = "Géza";
$Var = "János";
echo "$var, $Var";    // kiírja, hogy "Géza, János"

A nyelv nem kisbetű nagybetű érzékeny, de a változók azok.

Sztringkezelő függvények

int strlen ( string $string ) A $string hosszát adja
int strpos ( string $tarolo , mixed $keresett [, int $eltolas = 0 ] ) Egy karaktersorozat első előfordulását keresi egy másik karaktersorozatban

substr

A sztring egy részével tér vissza

$eredmeny = substr($sz, 2, 3);

Negatív start

$eredmeny = substr("abcdef", -1);
    // visszaadja: "f"
$eredmeny = substr("abcdef", -2);
    // visszaadaj "ef"
$eredmeny = substr("abcdef", -3, 1);
    // visszaadja "d"

Karaktersorozat darabolása

preg_split

Sztringet darabol fel reguláris kifejezésre illeszkedő részei mentén

$sz =”joska:titok”;
$szavak = preg_split('/:/', $sz);
print $szavak[0];
print $szavak[1];

Vissza-perjel hozzáadása

<?php
$str = "I'm a bird";
 
// Kimenet: "I\'m a bird"
echo addslashes($str);
?>

Vagy Who's Nagy Péter? Stb.

Karakterek keverés

$str = 'abcdef';
echo str_shuffle($str);

cdefab

Tömb karaktersorozattá

$str = array('Helló','Világ!','Szép','nap!');
echo implode(" ",$str);

Az implode() egy tömb elemeit egyetlen sztringbe fűzi össze.

Fájlkezelés

Megnyitás

Fájlok megnyitására az fopen függvényt használjuk. Első paramétere egy megnyitandó fájl neve karaktersorozatként megadva. Második paraméter a megnyitás módja. Megnyitási mód például a írás, olvasás, hozzáfűzés, illetve ezek keveréke. Az fopen mindig visszaad egy fájlmutatót. Ezt el kell tárolnunk, mert a PHP programban ez fogja azonosítani a megnyitott állományt.

Az fopen használata

  $fkezelo = fopen("filenev.txt", "r");

Megnyitás módjai

Mód Leírás
r csak olvasás, mutató fájl elején
r+ olvasás/írás, mutató fájl elején
w csak írás, mutató fájl elején, törli a fájl tartalmát, ha nem létezik, létrehozza
w+ olvasás/írás, mutató fájl elején, törli a fájl tartalmát, ha nem létezik, létrehozza
a csak írás, mutató a fájl végén, ha nem létezik, létrehozza
a+ olvasás/írás, mutató a fájl végén, ha nem létezik létrehozza
x csak írás, mutató a fájl elején, ha a fájl már létezik, az fopen sikertelen (FALSE)
x+ olvasás/írás, mutató a fájl elején, ha a fájl már létezik, az fopen sikertelen (FALSE)

Fájl bezárása

A megnyitott fájlokat illik bezárni használat után. Erre az fclose() függvény használható.

Az fclose() függvény használata:

fclose($fkezelo);

Fájl végének vizsgálata

Az feof() függvény használata:

while (!feof($fkezelo)) {
  // a ciklus törzse
}

Olvasás fájlból

Az fgets függvény használata

$sor = fgets($fkezelo);

Olvasás fájlból másként

$filename = "adat.txt";
$fp = fopen($filename, "r");
 
$content = fread($fp, filesize($filename));
$lines = explode("\n", $content);
print_r($lines);
 
fclose($fp);

Fájl megnyitása írásra

A „w” mód használata:

$fkezelo = fopen(”filenev.kit”, ”w”);

Hozzáfűzés fájlhoz

Fájl megnyitása hozzáfűzésre a „a” mód megadásával lehetséges.

$fkezelo = fopen(”filenev.kit”, ”a”);

Írás a fájlba

A fájlok írására az fwrite() függvény használható, de ennek alias neve fputs is használatos, mert a C nyelvben ez áll rendelkezésre.

fputs($fkezelo, ”alma”);

Függvény általánosan

A függvényekről általában

function fuggnev(vált1, vált2, ... váltn) {
  utasítás1;
  utasítás2;
  ...
  utasításn;
  return(visszatérési_érték);
}

A () zárójel kötelező ha nincs paraméter akkor is

Függvény meghívása

fuggnev(érték1, érték2, ..., értékn);

Függvény példa

<?php
  osszead(3, 2);
  function osszead($a, $b)
  {
    $osszeg = $a + $b;
    return($osszeg);
  }
?>

A return() függvényen belül használva azonnal befejezi a végrehajtás alatt lévő függvény futását, és a paramétereként megadott érték szolgáltatja a függvény visszatérési értékét.

Tömb visszaadása

<?php
 
function leker() {
    $tomb = array("alma", "körte", "szilva", "barack");
    return $tomb;
}
 
 
$a = leker();
 
var_dump($a);
 
?>

Rekurzió

<?php
 
ir(0);
 
function ir($a)
{
    if($a<10)
    {
	print "$a<br>\n";
	ir($a + 1);
    }
}
 
?>

Beágyazott függvény

<?php
 
function elso() {
	function masodik() {
		print "Belső függvény\n";
	}
}
 
elso();
 
masodik();
 
?>

A masodik() nevű függvény csak az elso() hívása után hívható meg.

Feltételesen definiált függvény

<?php
 
$mehet=true;
 
if($mehet) {
	function fg() {
		print "Függvény\n";
	}
}
 
fg();
 
?>

Változók hatásköre

Az alábbi függvényben, ha mondjuk meg, hogy a $a és $b változó nem a függvényen belül van definiálva, akkor hibát kapunk.

index.php
<?php
$a = 3;
$b = 4;
 
osszead();
echo $b . "\n";
 
function osszead() {
    global $a, $b;
 
    $b = $a + $b;
} 
?>

Így is lehet:

index.php
<?php
$a = 3;
$b = 4;
 
osszead();
echo $b . "\n";
 
function osszead() {
    $GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
}
 
?>

Hibaszintek

Rendszer szinten

A hibaszinteket a php.ini fájlban állíthatjuk a szerveren. A linuxos szervereken a php.ini fájlok helye általában a következő:

/etc/php5/apache2/php.ini

A hibaüzenetek alapértelmezésként be vannak kapcsolva. A php.ini fájlban egy „error_reporting” nevű változót kell keresni.

Például:

error_reporting = E_ALL & ~E_NOTICE

Vagy így:

error_reporting = E_ALL

PHP scriptben

Néha szükség lehet arra, hogy a webmester maga állítson hibaszintet. Ekkor a php kódunkban használhatjuk az error_reporting() függvényt. Az error_reporting() beállítja a hibajelentési szintet.

A következő példában az összes üzenetet szeretnénk viszontlátni:

<?php
error_reporting(E_ALL);
?>

Paraméterként valójában egy egész számot kell megadni, de minden hibaszinthez tartozik egy nevesített állandó.

// minden hibajelzés kikapcsolása
error_reporting(0);
// csak az egyszerű futási hibák kijelzése
error_reporting  (E_ERROR | E_WARNING | E_PARSE);

E_NOTICE:

// E_NOTICE szintű hibák kijelzése ugyancsak
// hasznos
// (inicializálatlan változók kijelzésére,
// vagy változónevek elgépelésének kiszűrésére)
 
error_reporting (E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

Kivétel:

// E_NOTICEn kívül minden hiba kijelzése
// Ez az alapbeállítás a php.ini-ben
error_reporting (E_ALL ^ E_NOTICE);

Minden hiba:

// Minden PHP hiba kijelzése 
//(bitenkénti 63 használható PHP 3-ban)
error_reporting (E_ALL);
 
// ugyanaz, mint fent: error_reporting (E_ALL);
ini_set ('error_reporting', E_ALL);

Hibaszint állandók:

érték konstans
1 E_ERROR
2 E_WARNING
4 E_PARSE
8 E_NOTICE
16 E_CORE_ERROR
32 E_CORE_WARNING
64 E_COMPILE_ERROR
128 E_COMPILE_WARNING
256 E_USER_ERROR
512 E_USER_WARNING
1024 E_USER_NOTICE
2048 E_STRICT (PHP5-től)

Az ini_set függvénnyel

PHP scriptben a init_set() függvény is használható:

ini_set('display_errors', 'Off');
ini_set('display_startup_errors', 'Off');

A "@" elöljáró

A „@” elöljáróval is elérhető, hogy egy függvénnyel kapcsolatos hiba ne jelenjen meg. Ez természetesen csak helyben az adott függvényre lesz érvényes.

Legyen például egy htmlhead() függvény amit szeretnénk meghívni.

Ha a függvény nem létezik, de nem is szeretnénk látni a hibaüzenetet, amelyet a függvény hiány okoz, akkor így kell meghívni:

@htmlhead("Cím")

A .htaccess fájlban

A hibaszintek beállíthatók a .htaccess fájlban is. Például:

php_flag display_errors off

A htaccess fájlban még idevonatkozó használható beállítások:

php_flag display_startup_errors on
php_flag display_errors on
php_flag html_errors on
php_flag  log_errors on
php_value error_log  /home/path/public_html/tartomány/PHP_errors.log

Hiba fájlbaírása

ini_set("log_errors", 1);
ini_set("error_log", "php-error.log");
error_log("Itt egy saját hibaüzenet");

Figyelem! Az állomány írható kell legyen!

Esetleg a /tmp könyvtárba:

ini_set("log_errors", 1);
ini_set("error_log", "/tmp/php-error.log");
error_log("Itt egy saját hibaüzenet");

Más állományok használata

Másik állomány beemelése

A következő utasítások állnak rendelkezésünkre:

  • include
  • require
  • include_once
  • require_once

Különbségek

  • include
    • Az include beemeli a fájl amire hivatkozunk, majd értelmezi és fut tovább.
    • Ha a fájl nem létezik, akkor E_WARNING hibaüzenetet generál, de fut tovább.
  • require
    • Az require beemeli a fájl amire hivatkozunk, majd értelmezi és fut tovább.
    • Ha a fájl nem létezik, akkor E_FATAL hibaüzenetet generál, de és nem fut tovább.
  • include_once és require_once
    • A fájl csak akkor lesz lefuttatva, ha még nem futott le.
    • Akkor érdemes használni, ha kéteszi lefutás hibát generál.

Használat

A már sok függvényünk van, akkor azokat más PHP állományokba szoktuk rakni. Ahol pedig használni akarjuk a függvényeinket azokat az „include” vagy „require” utasítással emeljük be:

include fájlnév;
require fájlnév;

Más állományok használata

   include_once fájlnév;
   require_once fájlnév;

a már egyszer beillesztésre került kódot a PHP nem próbálja meg ismét betölteni

Másik fájl konkrétan

<?php
    include ”fg.php”
    kiir();
?>

Ha egy könyvtárral feljebb kell hivatkozni:

<?php
    include dirname(dirname(__FILE__)) . '/fg.php';
 
    kiir();
?>

INC fájlok

Az include utasítással beemelt állományokat szokás elnevezni .inc kiterjesztéssel. Van aki ebbe teszi az adatbázis beállításait, vagy az egész webhely beállításait. Persze ezzel van egy kis gond. Ha egy támadó eltalálja egy ilyen fájl nevét, annak tartalmát mint egy szöveges állományt látni fogja, mivel a webszerver ezt nem próbálja meg értelmezni. A webmesternek persze ez volt az eredeti célja, hogy önmagának jelezze, hogy ezt nem kell értelmezni.

Természetesen meg lehet leni .inc kiterjesztés nélküli is. Aki mégis ragaszkodik hozzá, az manapság kettős kiterjesztést használ. valami.inc.php. A PHP értelmező így értelmezi, de egy támadó nem fog belőle látni semmit. A webmester mégis jelezte magának, vagy másnak a fájl nevében, hogy ez csak egy beemelt állomány.

Agy webhely konfigurációs állománya ezek után lehet:

  • config.inc - rossz választás!
  • config.inc.php
  • config.php

Az inc kiterjesztéshez hasonló lehet a tpl. Ezeket sablon (template) állományoknál szokás használni. Például:

valami.tpl.php
<head>
 <meta http-equiv="Content-Type" 
 content="text/html; charset=utf-8">
 <title>
 <?= $fejléc['cím'] .
 ( (isset($fejléc['mottó'])) ? ('|' . $fejléc['mottó']) : '' ) ?>
 </title>
 <link rel="stylesheet" href="style.css">
</head>

Globális változók használata

A függvényen kívül létrehozott változok globálisak. Ha szeretnénk használni egy függvényen belül, akkor a meg kell adnunk a „global” módosító után a globális változókat. Ha több is van, azt vesszővel szeparáljuk egymástól.

<?php
$a = 1; $b = 2;
function osszead()
{
  global $a, $b;
  $b = $a + $b;
}
ossszead();
echo $b;
?>

Grafika

A szerveren telepítve kell legyen a php5-gd csomag. Ez Ubuntu és Debian rendszeren egyszerű:

apt-get install php5-gd

Ha Windowson használsz apache webszervert és azt a wamp csomag részeként telepítetted, akkor automatikusan telepítve lesz a gd csomag a PHP-hez.

kep.php

<?php

  header("Content-type: image/gif");
  $kep = imagecreate( 300, 300 );
  $hatter = imagecolorallocate($kep, 220,220,220);
  $kek = imagecolorallocate($kep, 0,0,255 );
  imageline( $kep, 50, 50, 250, 50, $kek );
  imagegif($kep);

?>

Teszünk egy hivatkozást a képre.

index.php

<?php
  print "<img src=\"kep2.php\"";
?>

Megjeleníthetjük png-ként: kep.php

<?php

  header("Content-type: image/png");
  $kep = imagecreate( 300, 300 );
  $hatter = imagecolorallocate($kep, 220,220,220);
  $kek = imagecolorallocate($kep, 0,0,255 );
  imageline( $kep, 50, 50, 250, 50, $kek );
  imagepng($kep);

?>

Téglalap rajzolása és kitöltése:

<?php
  $vaszon = imagecreate( 300, 300 );
  $szurke = imagecolorallocate($vaszon, 220,220,220);
  $kek = imagecolorallocate($vaszon, 0,0,255 );

  imagerectangle($vaszon, 50,100, 250,150,$kek);
  imagefill($vaszon, 51,101, $kek);

  header("Content-type: image/png");
  imagepng($vaszon);
  imagedestroy($vaszon);
?>

Oszlopdiagram

<?php
  $adatszam=7;
  $adat = array(170, 250, 200, 120, 140, 20, 130);

  $magassag=400;
  $szelesseg=400;
  $kep=imagecreate($magassag, $szelesseg);
  $hatter=imagecolorallocate($kep, 220, 220, 220);

  $vonalszin=imagecolorallocate($kep, 0, 0, 0);
  $kek = imagecolorallocate($kep, 0, 0, 255);  

  imageline( $kep, 10, $magassag - 20, $szelesseg - 10, $magassag - 20, $kek );

  for ($i=0; $i < $adatszam; $i++)
  {
      imagerectangle($kep, $i * 40 + 15, $magassag - 20, 5 + $i * 40 + 25 , ($magassag - 20) - $adat[$i], $vonalszin);
      imagefill($kep, $i * 40 + 16, $magassag - 21, $kek); 
      imagestring($kep, 3, $i * 40 + 15, $magassag - 18, $adat[$i], $kek);   
  }

  header("Content-type: iamge/png");
  imagepng($kep);
  
?>
oktatas/programozas/php/php_nyelv.txt · Utolsó módosítás: 2020/03/24 20:37 szerkesztette: admin