PHP programozás alapjai A PHP manapság az egyik leggyakrabban használt web programozási nyelv. Nyílt forrású, fejlesztő környezete is könnyen telepíthető, a legtöbb LINUX verzió is tartalmazza. Egyike a dinamikus alkalmazásfejlesztőknek, alkalmas nagyméretű portálok és SQL adatbázisok kezelésére, valamint kiválóan együttműködik a HTML kóddal. Készíthetők tisztán PHP kódok is, de szerintem igazán szép kivitelben a HTML alapú CSS - ben formázott (tehát ezek adják a keretet) PHP programok működnek. Nagy adatmennyiség esetén célszerű az adatokat SQL, MySQL adatbázisban tartani és azokat a PHP segítségével lekérni, feldolgozni. Az ingyenes tárhely szolgáltatók egy része biztosít PHP futási környezetet, némelyik pedig SQL adatbázist is biztosít. A továbbiakban először a PHP alap utasításaival foglalkozom, majd néhány példát mutatok meg. Kezdeti tudnivalók: Minden PHP program, vagy script a a kóddal kezdődik és a kóddal fejeződik be. Magyarázó szövegek a programban bárhol elhelyezhetők, ezek nem hajtódnak végre, csak a programkódban jelennek meg és a // jelzi őket. Minden utasítást pontosvessző zár le! Kiiratás módjai: print "ezt ird"; print $valtozo; (print helyett használható az echo is). HTML utasítás kiíratása, végrehajtása a PHP kódon belül, pl: print "<html><head>"; HTML utasítás idézőjele elé \ jel írandó, pl: print "<img src=\"ezt.jpg\" align=\"kép megjelenítés\">";. Műveleti operátorok: + - / * % (maradék). (összefűzés) Változó megadása és értékadás: $a=0; $string="valamilyen karakteres szöveg"; define("állandónév", érték); $a=$a+1; $a++ Mindkét utasítás az $a értékét eggyel növeli (más műveletekre hasonlóképp). $b=$b+5; $b+=5 Mindkét utasítás $b értékét növeli öttel. $veletlen=rand(); Véletlen szám generálása. abs($caltozo); A változó abszolút értékét adja vissza. Monitorra iratás: print $valtozo; Dinamikus adatkiirás, print "ird ki ezt"; Nem tárolt szöveg kiírása, print $a+$b; Művelet eredményét írja ki), print $a.$b; Két változó tartalmát fűzi össze (nem összead!) print $a."ft"; Változó tartalmához hozzáfűz egy szöveget. Változó típusa: integer (egész), double (tört), string (karakteres), boolean (logikai), object (objektum), array (tömb) Típus lekérdezése gettype($valtozo); 1. oldal
Típus módosítása settype($valtozo, "típus"); példáúl ismeretlen típust átalakítani, hogy fel lehessen dolgozni. Összehasonlító jelek: == egyenlő,!= nem egyenlő, === azonos (érték és típus is),!== nem azonos, >= nagyobb egyenlő, <= kisebb egyenlő, < kisebb, > nagyobb, vagy (or is jó), && és (and is jó),! tagadás, xor kizáró vagy. Dátum és idő kezelés: $ezt=time(); Pontos időt adja UNIX időbélyegként (másodpercben eltelt idő 1970.01.01. óta) date("y.m.d. H:i", $ezt); Dátum és idő kiírás módja mktime(óra, perc, mperc, hónap, nap, év); Átalakít egy beírt dátumot időbélyeggé. checkdate(honap, nap, év); Helyes-e a beírt dátum. Elágazások a programban: if (feltétel) {Ha a feltétel igaz, akkor az itt szereplő utasításokat hajtja végre;} else {Ha a feltétel nem igaz, akkor az itt szereplő utasítások futnak le. Ez az ág nem kötelező!;} Az if és else ágak közt lehet még közbülső feltétel is, ezt elseif (feltétel2) {utasítások;} formában illesszük a két ág közé. Többszörös elágazás is létrehozható, ahol a szelektor egy kifejezés, vagy változó. Az egyes ágakat a break utasítás zárja le! switch (szelektor) { case ertek1: Utasítások hajtódjanak végre, ha a kifejezés értéke megeggyezik érték1-gyel; break; case ertek2: Ha kifejezés értéke egyezik ertek2-vel akkor ez fusson; break; default: Ha egyik ág sem teljesül, akkor ez történjen; break; } Ciklusok a programban: A ciklusok ismétlődő utasítássorokat tartalmaznak. Mindig kell egy ciklus változó, vagy esemény, amely megszabja mikor érjen véget a ciklus, különben végtelen ciklust kapunk. Ciklus elhagyására szolgálhat a break; utasítás is (ekkor egy continue; utasítással ismétlést kezdhetünk, például a zéró osztás kiküszöbölése esetén). Amennyiben ciklusváltozónk van annak értéknövekedéséről is gondoskodni kell. Elöl tesztelő, ahol a zárójelezett utasítássor, csak a feltétel igaz volta esetén hajtódik végre: while (feltétel) {utasítások;} Hátul tesztelő, ahol az utasítássor egyszer mindenképp lefut, mivel a végén vizsgáljuk a feltétel igazságát: do {utasítások;} while (feltétel) Számlálós ciklus for (ciklusváltozó; feltétel; ciklusváltozó növelése) {utasítások;} például, ha azt szeretnénk, hogy egy utasítássor ötször fusson le: for ($i=0; $i!=5; $i++) {utasítások;} 2. oldal
Függvények létrehozása: Amikor egy utasítássort programunk során többször is használunk, célszerű azokat függvénybe szervezni. A függvényeket általában programunk elején helyezzük el, így a program futásakor bárhonnan hivatkozhatunk rájuk. Gyakori eset, hogy függvényeket külső állományban helyezünk el, így más programmodulokból is elérhetők (Ez akkor célszerű, ha több programmodulból áll össze a teljes működő rendszer, például egy főprogram és több alprogram esetén. A függvényeknek paraméterek adhatók át, tőlük paraméterek kaphatók vissza, ezáltal válik igazán rugalmassá a programozás. A kapott paramétereket a függvény törzsben feldolgozzuk, és vagy adunk vissza értéket, vagy nem (utóbbi esetben nincs return, csak végrehajtódik a függvény). Függvényen belül definiált változók kívülről nem láthatók, csak ha a global kulcsszóval külsővé tesszük. function fuggvénynév (kapott_papaméter1, kapott_paraméter2,...) { utasítás sorok; return ezt_adja_vissza;} Tömbök létrehozása, kezelése: Nagyobb rendezett adatmennyiség kezelésére, használatára alkalmazhatók a tömbök. Ezek több elemet tartalmazó adathalmazok, ahol egy -egy elemre tömbben elfoglalt sorszámával hivatkozhatunk. $tombneve=array(); Üres tömb létrehozása $tombneve=array("elem1", "elem2", "elem3",...); Tömb létrehozása elemfeltöltéssel. $tombneve[ ]="elem"; Elem hozzáadása tömbhöz. $tomb[count($tomb)-1]; Tömb utolsó elemének sorszám lekérdezése (egyet el kell venni, ugyanis az első elem sorszáma 0). $dbszam=count($tomb)-1; Tömb méretének lekérdezése. foreach ($tomb as $atmeneti) {print "$atmeneti";} Tömb végigjárása és elemeinek kiírása $ossz= array_merge($elso_tomb, $masodik_tomb); Két tömb összeadása (összevonás). $tomb=array_push($elso, 2, "ezt"); Több elem egyidejű hozzáadása tömbhöu. $elem=array_shift($tomb); Tömb első elemének eltávolítása. $ide=array_slice($tomb, 2, 3); Elem kinyerése tömbből, a 2 indexűtől 3 hosszan új tömbbe. sort($tomb); Tömb rendezése rsort($tomb); ABC növekvő sorba rendez asort($tomb); ABC csökkenő sorba rendez. unset($tomb[1]); A tömb 1 indexű elemének eltávolítása. Associatív tömbök: Ezek karakterlánccal indexelt tömbök, ahol az egyes elemekre a karakterlánccal hivatkozhatunk $assz_tomb=array ("mezo1"=>"ertek1", "mezo2"=>"ertek2", "mezo3"=>"ertek3"); Asszociatív tömb létrehozás és feltöltés. print $ass_tomb["mezo2"]; A mezo2 indexű elem értékének kiíratása. $ass_tomb["mezo1"]="ezt írja be"; Értékadás a mezo1 indexű elemnek. foreach($assz_tomb as $kulcs=>$ertek) {print "$kulcs=$ertek"; print "<br>"} Asszoc. tömb bejárása és kiiratása kulcs alapján, minden sor után soremelés. ksort($assz_tomb); Assz. tömb rendezése. Több dimenziós összetett tömbök $dim_tomb=array ( array ("mezo1"=>"ertek11", "mezo2"=>"ertek12", "mezo3"=>"ertek13"), array ("mezo1"=>"ertek21", "mezo2"=>"ertek22", "mezo3"=>"ertek23"), array ("mezo1"=>"ertek31", "mezo2"=>"ertek32", "mezo3"=>"ertek33") ); 3. oldal
Fájlok kezelése: include("../itt/ezt.php"); A megadott fájlt beágyazza a programba. file_exist("../itt/ez.txt"); Adott fájl létezésének ellenőrzése. is_dir("../itt/ez.txt"); A megadott karakterlánc lehet-e fájl? is_writeable("file.txt"); A fájl írható-e? is_readable("file.txt"); A fájl olvasható-e? is_executable("file"); A fájl futtatható-e? fileatime("file"); A fájl utolsó megnyitásának ideje (UNIX időbélyeg formában!). filemtime("fájl"); A fájl utolsó módosításának ideje (UNIX időbélyeg formában!). filesize("fájl"); A fájl mérete. touch("fájl.nev"); Fájl létrehozása unlink("fájl"); Fájl törlése (Ha a jogosultságok engedik!). $fajl=fopen("ut/fajl", mod); Fájl megnyitása függvénnyel, ahol a mod a megnyitás módját jelenti, tehát r olvasásra, w írásra (ha nem létezik létrejön, ha létezik felülíródik), a hozzáfűzésre. $sor=fgets("fájl", bájt_hosszan); Sor kiolvasása fájlból adott bájt hosszan a sorvégig, vagy a fájl vége jelig. $szov=fread($fajl, bajt); Tetszőleges bájt hosszú adat kiolvasása fájlból. $adat=fgetc($fajl); Egy karakter kiolvasása. fseek( $file, bájttol); A kiolvasást adott bájttól kezdi (pozicionál). flock($file, mod); Fájl zárolása, ha mod=1, akkor olvasható, de nem írhazó, ha 2, akkor mást kizár, ha 3, akkor zároltat felszabadít. fputs($file, $adat); $adat változó tartalmát hozzáírja a fájl végéhez (plusz egy \n sorvég jelet). feof($fajl); Megadja mikor érünk a fájl végére. fclose($fajl); Fájl zárása. Mappák kezelése: is_dir($map); Jelölhet-e mappát? mkdir("mappanév", jogok); Mappa létrehozása jogosultsággal (0 és egy 0-7 közé eső szám). rmdir("mappa"); Mappa törlése. $mappa=opendir("mappa"); Mappa megnyitása. $readdir($mappa); Mappa tartalmának olvasása a mappa végéig. Karakterláncok alakítása: printf("%20s\n", "adat"); 20 karakter szélesen írja ki, majd soremelés jön (állandó széles adatmező hozható létre). Ha a szám után s található akkor az adat karakteres, más esetekben d decimális szám, b egész szám binárisként, c egész szám ASCII megfelelője, f lebegőpontos szám (tört), o egész szám, x egész szám hexadecimális megfelelője. A mezőhossz előtt a kitöltő karakterre utasítunk, számoknál + jobbra, - balra igazít. printf("%**4d", "4"); eredménye ***4, printf("%.2f", 2.3333); eredménye 2.33, mert lebegőpontos számnál kerekíthetünk is, itt kéttizedesre. sprintf(); Eze csak átalakít és nem ír ki. print $proba[2]; Egy karakterlánc 2 indexű tagját adja, mintha az tömb lenne (tehát a harmadik karaktert). strlen($szoveg); Szöveg hossza strstr($szoveg, "ezt"); Szövegrész keresése. strpos($szoveg, "ezt"); Szövegrész helyének keresése. substr($szoveg, 3, 4); Szövegrész kinyerése, a 3 indextől (tehát negyedik karakter) 4 hosszan. 4. oldal
strtok($szoveg, "határoló"); Szövegrész kinyerése a határolóig (ciklusban futtatva a szöveg végéig keres). trim($szoveg); Szöveg elején és végén levágja az üres helyeket (tisztít). ltrim($szoveg); Csak a szöveg elejéről tisztít. strtoupper($szoveg); Nagybetűssé alakít. strtolower($szoveg); Kisbetűssé alakít. $tomb=explode(".", $kezdet); A. határolóig $kezdet szöveget tömbbé alakítja. Munkamenet változók: Amikor olyan változókat szeretnénk használni, melyeket több alprogramunk is azonosan használ (például felhasználó azonosítás, azonos szűrő adat lekérdezéseknél), akkor alkalmazhatók session_start(); A php program elején be kell írni ezt a függvényt, az első sorba a küldő és a fogadó oldalon (oldalak mindegyikén) is. Session_register("dirname"); Egy munkamenet változó bejegyzése (PHP 5-nél elhagyható). $_session['felirat']="scriptek:"; Egy munkamenet változónak értékadás. session_is_registered(változónév); A munkamenet be van-e jegyezve? session_destroy(); Munkamenet szüneteltetése. Környezeti változók: $HTTP_USER_AGENT Böngésző neve és verziója $HTTP_ADDC Kliens IP címe $HTTP_REFRER Annak az oldalnak a címe, ami ide linkelte a látogatót $PHP_SELF Épp futó progi elérési útja $HTTP_GET_VARS Asszociatív tömb, az összes GET kéréssel $HTTP_POST_VARS Asszociatív tömb, az összes POST kéréssel header("location: URL"); Egy adott URL-re küldi a böngészőt Kapcsolat MySQL adatbázissal: mysql_connect("host azonosító", "felhasználó név", "felhasználó jelszó"); Csatlakozás kiszolgálóhoz mysql_select_db("adatbázis név", kiszolgáló azonosító); Adatbázis kiválasztása, kiszolgáló alapértelmezése az épp megnyitott, így elhagyható! mysql_errno(); Hiba esetén a hibaüzenet kódját adja. mysql_error(); Hiba esetén a hibaüzenet szövegét adja angolul. mysql_query(sql_parancs, Kiszolgáló azonosító); SQL parancs futtatása, kiszolgáló alapértelmezése az épp megnyitott, így elhagyható! mysql_insert_id(); Az utolsó insert parancs során beállított automatikus növő mező értéke. msql_num_rows(eredményazonosító); Az azonosítóhoz tartozó táblában található sorok száma. msql_fetch_rows(eredményazonosító); Az azonosítóhoz tartozó táblában a következő sor kiolvasása Visszatérési értéke egy tömb, ami a sor összes mezőjét tartalmazza. msql_fetch_array(eredményazonosító); Itt asszociatív tömbként kapjuk vissza a sort, melynek indexei a mezőnevek! Igen hasznos függvény nagyobb adatbázisok esetén. msql_affected_rows(kiszolgáló); A legutóbb módosított sorok száma (kiszolgáló elhagyható). mysql_list_dbs(kiszolgáló); A kiszolgálón keresztül elérhető adatbázisok listája. mysql_tablename(azonosito, adatbázis_ sorszám); Adatbázisok nevei mysql_list_tables(dbnev, kiszolgáló); Egy adatbázis tábláinak nevei. mysql_num_fields(azonos); Lekérdezés után kapott eredménytábla mezőinek száma 5. oldal
mysql_close(azonosító); adatkapcsolat bontása Példa egy kapcsolat megnyitására: $adatbazis = "Adatbázis név"; $kapcsolat = mysql_connect("127.0.0.1", "root", "jelszavam"); if (!$kapcsolat) {die('nem lehet csatlakozni '. mysql_error());} mysql_select_db ( $adatbazis ) or die ( "Nem lehet megnyitni az $adatbazis állományt ".mysql_error() ); Példa adatbázis lekérdezésre: $lista = mysql_query("select * FROM szamtech ORDER BY eszktip, helysz, leltsz"); $rekordok=array(); while ( $fel=mysql_fetch_array($lista)) {$rekordok[]=$fel;} mysql_close($kapcsolat); Először kapcsolódunk az adatbázishoz, majd kiválasztjuk a kívánt rekordokat, végül a $rekordok asszociatív tömbbe feltöltjük azokat. Zárjuk a kapcsolatot és a tömbbe került rekordokkal már bármely PHP művelet elvégezhető. Példa adatbáziban adatfelvitelre: mysql_select_db ( $adatbazis ) or die ( "Nem lehet megnyitni az $adatbazis állományt".mysql_error() ); $felvisz= "INSERT INTO szamtech (gepnev, helysz, leltsz) VALUES ('$gepnev', '$helysz', '$leltsz') "; mysql_query($felvisz) or die ("Sajnos nem tudtam adatot felvinni a táblába! ".mysql_error() ); Példa adatbázisban egy rekord módosítására: mysql_select_db ( $adatbazis ) or die ( "Nem lehet megnyitni az $adatbazis állományt".mysql_error() ); $modosit="update szamtech SET gepnev='$gepnev', helysz='$helysz', leltsz='$leltsz', WHERE azon='$azon' "; mysql_query($modosit) or die ("Sajnos nem tudtam adatot módosítani a táblában! ".mysql_error() ); mysql_close($kapcsolat); PHP scriptek PHP utasítások beágyazása HTML oldalba: @session_start(); //Munkamenet indítás, ha szükséges Session_register("munkamenet"); //Munkamenet regisztráció, ha szükséges $cim="valtozo1"; $kit="valtozo2"; //Értékadás változóknak //Feltételes utasítás, ha van adatküldés ($_GET), akkor adatfogadás GET típusú űrlapról if ($_GET) {$cim=$_get["cim"];$kit=$_get["kit"];} <html> <head> <meta http-equiv="content-type" content="text/html; charset=iso-8859-2"> <meta http-equiv="content-language" content="hu"> 6. oldal
<meta HTTP-EQUIV="pragma" content="no-cache"> <meta name="robots" content="all"> <meta name="description" content="oldalcím" /> <meta name="keywords" content="kereső kifejezések" /> <title>fejrészben kiirandók</title> <script language="javascript" src="jscriptek.js"></script> <link rel="stylesheet" href="forma.css" type="text/css" media="screen" /> <link rel="stylesheet" href="print.css" type="text/css" media="print" /> </head> <body> <img width="780px" src="logo.jpg" border="0" alt="logo"> include "masoldal.txt"; // Másik állomány tartalmának beszúrása <h2>html utasítások</h2> <div class="doboz"> //Munkamenet változónak értékadás, majd alprogram hívás $_session['munkamenet']="adat"; include("alprogram.php"); </div> print "<br>"; //HTML utasítás megadható scripten belül is $File = "Fiokok/fiok.htm"; //Értékadás echo date("y.m.d. H:i", filemtime($file)); //Egy fájl utolsó módosítási idejének kiiratása echo-val </body></html> Egy a hívó által megnevezett fájl első 4 sorának kiiratása: A hívás történhet például <a href="index.php?cim=linkek&kit=htm" >Linkek</a> formában is. $cim="tukor"; // Ha nincs hívás, mi legyen a cím értéke $kit="htm"; // Ha nincs hívás, mi legyen a kiterjesztés értéke if ($_GET) {$cim=$_get["cim"]; $kit=$_get["kit"];} //Ha volt hívás értékadás $mit=$cim.".".$kit; //A cím és a kiterjesztés összevonása $file = fopen($mit, "r"); //fájl megnyitása olvasásra print fgets($file, 1024); //Egy 1024 bájt hosszú sor kiírása, például a cím for ($i=1; $i!= "4"; $i++) //Négyszer fusson le { print fgets($file, 1024); //Egy 1024 bájt hosszú sor kiírása } fclose($file); //Fájl bezárása Adat fogadás munkamenetből: 7. oldal
@session_start(); $dir=$_session["dirname"]; $felirat=$_session["felirat"];... 8. oldal