Farkas Tamás (blaq) blaquolf@sch.bme.hu PHP alapok Farkas Tamás (blaq) blaquolf@sch.bme.hu
Tartalom Bevezető A nyelv alapjai Form-kezelés Session-kezelés Átlátható kód Template-ek
Bevezető Mitől dinamikus egy weboldal? Fájlrendszer HTTP Webszerver Böngésző HTTP 1 Webszerver Apache statikus 2 A böngésző elküldi a kérést A webszerver ellenőrzi a jogosultságokat, beolvassa a fájlt, majd visszaküldi a böngészőnek A böngésző fogadja a fájlt, és megjeleníti a weboldalt
Bevezető Mitől dinamikus egy weboldal? mod_php CGI Fájlrendszer Böngésző HTTP 1 Webszerver Apache 2 Szkript-értelmező PHP 4 3 A böngésző elküldi a kérést A webszerver ellenőrzi a jogosultságokat, beolvassa a fájlt és továbbítja az értelmezőnek VAGY megmondja az értelmezőnek, hogy mit kell beolvasnia A értelmező feldolgozza a fájlt, és visszaadja a webszervernek A webszerver kiküldi a generált fájlt A böngésző fogadja a fájlt, és megjeleníti a weboldalt
Bevezető Mi az a PHP és hogyan történik az értelmezés? „PHP: Hypertext Preprocessor” Általános célú szkriptnyelv Weboldalak generálása, HTML-be ágyazva (szerveroldali szkript) Bármi más generálása… Hello world! <html> <head> <title>Példa</title> </head> <body> <?php echo "Hello world!"; ?> </body> </html> <?php … ?> -n belüli részeket programként értelmezi, többit változatlanul hagyja
Bevezető Fejlesztői környezet kialakítása Legegyszerűbb: unicorn.sch.bme.hu > ~/public_html Ingyenes tárhelyszolgáltatók Otthoni környezet: http://weblabor.hu/cikkek/apachephptelepites Miből érdemes tanulni? PHP manual :) http://www.php.net/docs.php (online doksi kommentekkel) http://www.php.net/download-docs.php (offline kézikönyv) https://kszk.sch.bme.hu/twiki/bin/view/Webproj/WebprojDoksik PHPMiniHowTo by Jocó (biztonság) …
A nyelv alapjai Tartalom Szintaxis Típusok Állandók Operátorok Vezérlési szerkezetek Függvények Osztályok, objektumok Referenciák
Szintaxis PHP-módba kerülés: <?php ?>, <? ?>, … Változó jelölése: $valtozo betűk, számjegyek, aláhúzás; nem kezdődhet számmal Tömb: $tomb[index] Utasítások elválasztása pontosvesszővel: echo ”Üzenet”; Programblokk kapcsoszárójelben: { … } Megjegyzések: <?php echo "Ez egy teszt"; // Ez egy egysoros c++ szerű megjegyzés /* Ez egy többsoros megjegyzés Még egy sor megjegyzés */ echo "Ez egy másik teszt"; echo "Ez az utolsó teszt"; # Ez egy shell-szerű megjegyzés ?> Típusok lehetséges értékei a következő slide-okon
Típusok Változók illetve értékek típusát általában nem adjuk meg explicit módon Értelmező hozzárendel egy típust a környezetének megfelelően Szükség esetén automatikus típuskonverzió Típus lekérdezése, ellenőrzése: gettype($valtozo); is_type($valtozo); Cast-olás: $ize = (int) $bigyo; settype($valami, "string");
Típusok Logikai típus (boolean) NULL (NULL) true (igaz), false (hamis) Egy értéket vehet fel: NULL Egy változó értéke NULL ha: - NULL-ra állítjuk - még nem kapott értéket - unset()-tel töröltük Egész szám (integer) decimális szám: $a = 1234; negatív szám: $a = -123; oktális szám: $a = 0123; hexadecimális szám: $a = 0x1A; Erőforrások Speciális típus Referencia külső erőforrásra pl.: SQL lekérdezés eredménye Külön függvényekkel tudunk hasznos adatot kinyerni belőle Lebegőpontos szám (float) $a = 1.234; $a = 1.2e3; $a = 7E-10;
Típusok Karaktersorozat (string) Változók behelyettesítése Aposztróffal: ’szoveg’ \’: aposztróf Idézőjellel: ”egy sor\n” \r: kocsivissza \n: újsor \t: tab \\: visszaper \$: dollár \”: idézőjel (heredocnál nem kell) \[0-7]{1,3}: oktális kar. kód \\x[0-9A-Fa-f]{1,2}: hexa Heredoc: $s = <<<STR Egy heredoc sztring több sorban STR; Idézőjeles és heredoc sztringekben echo(”Alkoholtartalom: $VpV”); echo(”Tömbelem: ${a[0]}”); Szringek összefűzése $ora.” óra ”.$perc.” perc”; $kimenet.= ”Következő sor\n”; Mikor melyik? Regexp: ’/^\..*\$$/’ ”/^\\..*\\\$\$/” Lekérdezések…
Típusok Tömb (array) Tömbelemek kezelése Üres tömb létrehozása: $tomb = array(); (inicializálás!) Tömb kulcsa lehet nemnegatív egész és sztring (asszociatív tömb) Kezdőérték: $szorakozohelyek = array( ’Drönk’, ’Banális Közhely’, ’Under The Bridge’, ); Kezdőérték kulccsal: $szamok = array( ’egy’ => 1, ’kettő’ => 2 ); Hogy érjük el? echo($szorakozohelyek[0]); $i=’egy’; echo($szamok[$i]); Új elem felvétele: $szamok[’három’]=3; $szorakozohelyek[]=’Ráday’; Módosítás: $szamok[’három’]=4; Törlés: unset($szamok[’három’]);
Típusok Többdimenziós tömbök $gyumolcsok = array ( ’szórakozóhelyek’ => array ( ’Drönk’, ’Banális Közhely’, ’Ráday’ ), ’gyümölcsök’ => array ( 1 => ’alma’, 2 => ’körte’, ’narancs’ array ( $a, $b => $c ) );
Típusok Néhány példa automatikus típuskonverzióra 0, 0.0, ””, ”0”, array(), NULL: false boolean Számból sztring: 3.14 → ”3.14”, 100000000*100000000 → ”1E+16” Sztringből szám: ha a sztring elején értelmes szám szerepel akkor ez lesz az értéke, egyébként 0 ”1 kutya” → 1, ”php 5.0” → 0 boolean → string: ”true”, ”false” boolean → int: false → 0, true → 1
Állandók Állandókat a define() függvénnyel hozhatunk létre Nem módosíthatók/törölhetők Csak skalár értéket kaphatnak (boolean, integer, float, string) Elnevezés megállapodás szerint csupa nagybetű szokott lenni $ nélkül kell rá hivatkozni, ha egy változó tartalmazza a konstans nevét akkor a constant() függvény használható <?php define("MAXSIZE", 100); echo MAXSIZE; echo constant("MAXSIZE"); //ugyanaz ?> A get_defined_constants() függvénnyel lekérdezhetjük hogy milyen állandók vannak beállítva. Tömbbel tér vissza: ’állandó’=>érték
Operátorok Részletes lista és precedencia: Ld. Manual C operátorai: %, ++, *=, ... Összehasonlítás típusvizsgálattal: ===, !== Csak akkor igaz/hamis, ha az operandusok típusa is megegyezik/eltér 1===”1” //hamis, nem azonos array()!==false //igaz Hibakezelő operátor: $ertek = @$tomb[$kulcs]; Nem dob „notice”-t, ha például $kulcs nincs beállítva
Vezérlési szerkezetek Feltételes utasítás Elágazás több irányba if (feltetel1) { utasitas1; } elseif (feltetel2) { utasitas2; } ... elseif (felteteln) { utasitasn; } else { utasitas; if (feltetel) utasitas; if (feltetel) { utasitas1; utasitas2; ... utasitasn; } Elágazás if (feltetel) { utasitas1; } else { utasitas2; }
Vezérlési szerkezetek Elágazás több irányba egy változó értékei alapján switch ($valtozo) { case ertek1: utasitas1; break; case ertek2: utasitas2; ... case ertekn: utasitasn; default: utasitas; } switch ($valtozo) { case ertek1: case ertek2: case ertek3: utasitas; break; case ertek5; case ertek4: default: }
Vezérlési szerkezetek Elöltesztelő ciklus Hátultesztelő ciklus while (feltetel) utasitas; while (feltetel) { utasitas1; utasitas2; ... utasitasn; } do utasitas while (feltetel) do { utasitas1; utasitas2; ... utasitasn; } while (feltetel); continue: következő iterációra lép break: kilép a ciklusból
Vezérlési szerkezetek Ciklus Ekvivalens* elöltesztelő ciklus for (kif1; kif2; kif3) utasitas; for (kif1; kif2; kif3) { utasitas1; utasitas2; ... utasitasn; } kif1; while (kif2) { utasitas1; utasitas2; ... utasitasn; kif3; } *majdnem: continue ide ugrana! kif1: inicializálás, egyszer hajtódik végre kif2: minden iteráció előtt megvizsgálja, true érték esetén megy tovább kif3: minden iteráció végén végrehajtódik continue, break itt is használható
Vezérlési szerkezetek Még egy, nagyon hasznos ciklus foreach ($tomb as $ertek) utasitas; foreach ($tomb as $kulcs => $ertek) utasitas; foreach ($tomb as $kulcs => $ertek) { utasitas1; utasitas2; ... utasitasn; } Végigmegy a tömb elemein ($ertek) Hasznos, ha nem ismerjük a kulcsokat vagy lényegtelen az értékük, de a másik változattal ehhez is hozzáférünk ($kulcs) a foreach a megadott tömb egy másolatával dolgozik! az $ertek módosítása tehát hat az eredeti tömbre, megoldás: $tomb[$kulcs] = ujertek;
Vezérlési szerkezetek foreach példa Kimenet: <?php $sorok=array('Amstel','Heineken','Kozel'); foreach($sorok as $sor) { echo $sor.'<br />'; } echo '<br />'; $sor='Tesco Gazdaságos Sör'; foreach($sorok as $index => $sor) { $sorok[$index]=strrev($sor); ?> Amstel Heineken Kozel Amstel Heineken Kozel letsmA nekenieH lezoK
Függvények Definíció szintaxisa function valami($arg1, $arg2, ..., $argn) { ... return $result; } Bármilyen érvényes PHP kódot tartalmazhat, még függvény és osztály definíciókat is PHP4 óta a definíciónak nem kell megelőznie a kódban az első használat helyét Polimorfizmus, függvény újradefiniálása nem megengedett Tömb is lehet argumentum
Függvények Visszatérési érték function egy() { ... } function ketto() { ... return; } function harom() { ... return array(1,2); } Ha nincs return, végigfut, majd visszatér Nem muszáj értékkel visszatérni Tetszőleges értékkel vissza lehet térni, ezért nem is kell definiálni a visszatérési érték típusát Több érték visszaadása tömbbel (is) megoldható, sőt objektumokat is visszadhatunk
Függvények Globális változók elérése function globalis() { global $g; ... return; } Módosítás természetesen megmarad, ha nem létezett ilyen nevű globális változó akkor létrejön Referencia szerinti paraméterátadás function ref(&$arg) { $arg++; return; } valami($x); $x értéke eggyel nő Ilyen paraméter helyére csak változót írhatunk!
Függvények Argumentumok kezdőértéke function vesz($aru,$mennyiseg=5) { ... } Függvényhíváskor elhagyhatóak az ilyen paraméterek Más argumentumoktól jobbra helyezkedjenek el Változó argumentumszám function valami() { ... } PHP4 óta func_num_args(): változók száma func_get_arg($i): $i-edik argumentum értéke func_get_args(): egy tömbben az összes argumentum (index 0-tól)
Előre definiált változók Apache változók $_SERVER[]: a szerverrel és aktuális HTTP kapcsolattal kapcsolatos adatok <?php echo('Üdv a '. $_SERVER['SERVER_NAME']. ' szerveren!<br />'); echo($_SERVER['HTTP_USER_AGENT']. ' böngészőt használsz.<br />'); echo('Az IP-címed: ‘. $_SERVER['REMOTE_ADDR']. '<br />'); ?>
Előre definiált változók PHP változók $PHP_SELF: szkriptfájl neve, docroothoz képest relatív alakban www.pelda.com/konyvtar/proba.php → ”konyvtar/proba.php” $_GET, $_POST : külső változók, formkezelés $_FILES : feltöltött fájlok $_SESSION : session-változók $_COOKIE : sütíí
Formok Űrlapok, kérdőívek, adatlapok, login/logout A formból érkező adatokat a $_GET/$_POST és a $_FILES tömbökön keresztül érjük el Egy egyszerű form: <form action="foo.php" method="post"> Name: <input type="text" name="usernev" /><br /> <input type="submit" value="Send"/> </form> action mező: feldogozó oldal/szkript method mező: átvitel módja. ”post” a háttérben ”get” az URL-ben: foo.php?usernev=…
Beviteli mezők Rejtett mező <input type="hidden" name="rejtett" value="titkos" /><br /> Elérése: $_POST[’rejtett’] Kezdőérték: value mező Szövegmező <input type="text" name="szoveg" value="hello" maxlength="5"/><br /> Elérése: $_POST[’szoveg’] maxlength: böngesző ennyi karaktert enged beírni (ellenőrizni!) Checkbox <input type="checkbox" name="pipa" checked /><br /> Elérése: isset($_POST[’pipa’]) Kezdőérték: ha checked mező, ha ki van pipálva
Beviteli mezők Radio <input type="radio" name="ertek" value="1" /><br /> <input type="radio" name="ertek" value="2" checked /><br /> <input type="radio" name="ertek" value="3" /><br /> Elérése: $_POST[’ertek’] Kezdőérték: ha checked, akkor ki van választva Ugyanazon formon belüli, azonos nevű radio inputok tartoznak össze Több szöveg <textarea name="area" rows="10" cols="100">kezdoertek</textarea> Elérése: $_POST[’area’] Kezdőérték: tag-ek közé írt szöveg rows: sorok, cols: szélesség
Beviteli mezők Legördülő lista <select name="kor" > <option value="ac" >AC</option> <option value="bss" selected >BSS</option> <option value="kszk" >KSZK</option> </select> Elérése: $_POST[’kor’] Kezdőérték: ha selected, akkor ki van választva Tömbök átadása <input type="text" name="datum[ev]" size="4" maxlength="4" />. <input type="text" name="datum[honap]" size="2" maxlength="2" />. <input type="text" name="datum[nap]" size="2" maxlength="2" />. Elérése: $_POST[’datum’][’ev’] PHP4 óta teszőlegesen sok dimenzió
Beviteli mezők Töbszörös választás <select multiple name="ismeros[]" > <option value="a" selected >Ida</option> <option value="b" >Matild</option> <option value="c" selected d>Klotild</option> </select> Elérése: $_POST[’ismeros’] Tömb, ami a megjelölt opciókhoz tartozó értékéket (value) tartalmazza Kezdőérték: több selected is lehet