PHP fordító telepítése és integrálása az Apache http szerverbe. A Web programozása 2. előadás PHP fordító telepítése és integrálása az Apache http szerverbe. PHP alapok Rózsa Szabolcs BME Általános- és Felsőgeodézia Tanszék
Tartalom PHP telepítése PHP alapok Naptáralkalmazás készítése (http://gpsmet.agt.bme.hu/~szrozsa/calendar)
PHP telepítése Minden gépre feltelepítjük a PHP fordítót, majd elvégezzük annak integrálását az Apache webszerverre. A telepítőkészlet elérhető a tárgy honlapjáról:
PHP telepítése A PHP-t a c:\PHP könyvtárba installáljuk:
PHP telepítése A telepítés során telepítsük az Apache 2.2.x Modult is:
PHP telepítése Windows környezet alatt a kiterjesztések közül kapcsoljuk ki az alábbiakat: CURL, OpenSSL és PostgreSQL
PHP konfigurálása A telepítést követően el kell végeznünk az Apache konfigurálását: PHP modul betöltése PHP indexfájlok kezelése (A DirectoryIndex direktívához adjuk hozzá az index.php nevet is.
Az első PHP fájl lefuttatása A tárgy honlapjáról töltsük le a mai órán használt példaprogramokat, majd másoljuk be az e:\webprog\htdocs könyvtárba. Ezt követően egy böngészőben nyissuk meg a http://localhost/pelda1.php URL-t. Állítuk át a portot 80-ra!
Az első PHP fájl lefuttatása A Jegyzettömb segítségével nézzük meg a pelda1.php fájl forráskódját: Látható, hogy gyakorlatilag egy html dokumentumba ágyaztuk bele a PHP szkriptet, ami beilleszti a html dokumentumba a „Hello World” feliratot.
A PHP kód nyitó és zárótagei 1. <?php echo 'ha XHTML vagy XML dokumentumokat akarsz szolgáltatni, tedd így'; ?> 2. <script language="php"> echo 'egyes szerkesztők (mint pl FrontPage) nem szeretik a feldolgozó utasításokat'; </script> 3. <? echo 'ez a legegyszerűbb, egy SGML processing utasítás'; ?> <?= kifejezes ?> Ez egy rövidítése ennek: "<? echo kifejezes ?>" 4. <% echo 'Használhatsz ASP-stílusú tag-eket'; %> <%= $valtozo; # Ez egy rövidítése ennek: "<% echo . . ." %>
Több kódrészlet elhelyezése a HTML dokumentumban <head> <title>PHP Test</title> </head> <body> <?php if (1 == 1) { ?> <strong>Ez igaz.</strong> } else { <strong>Ez hamis.</strong> } if (1 != 1) { </body> </html> http://localhost/pelda2.php
A PHP a változó típusát automatikusan eldönti! PHP változótípusok Egy kis ismétles: Nyissuk meg Jegyzettömbbel a pelda3.php-t, majd értelmezzük a parancsokat! http://localhost/pelda3.php 8 alapváltozó: boolean (logikai) integer (egész szám) float (lebegőpontos /double/) string (karakterlánc) Összetett típusok: array (tömb) object (objektum) Két speciális típus: resource (erőforrás) NULL A PHP a változó típusát automatikusan eldönti!
PHP változótípusok Egészre konvertálás
Naptáralkalmazás készítése Havonta változó háttérkép Év, hónap A hónap napjai
A fejlesztés lépései lépés: Egy minta html oldal elkészítése (pl. 2011. január hó) lépés: A dinamikusan változó tartalmak azonosítása lépés: A dinamikusan változó tartalmak előállításához szükséges php kódok tervezése lépés: A php kódok integrálása a html dokumentumba lépés: Az eredmény tesztelése
Egy minta html oldal készítése Töltsük le a naptáralkalmazáshoz felhasználandó háttérképeket a tantárgy honlapjáról! A HTML dokumentumot az alábbiak szerint hozzuk létre: egysoros táblázat, mely első oszlop 800x600 képpont méretű (ekkorák a háttérképek), a második oszlopa pedig 200x600 képpont méretű; az első cellába illesszük be a januári háttérképet (1.jpg); a második cellába alulra illesztve helyezzük el az év és a hónap feliratát középre rendezve, majd ezek alá a hét napjainak nevét (Hétfő-Vasárnap), illetve 2011 január napjait a megfelelő táblázatos formában; a táblázat mindig hétfővel kezdődjön és vasárnappal végződjön az üresen maradó napokat fel kell tölteni az előző, illetve a következő hónap napjaival; az aktuális hónap napjai feketével jelenjenek meg, az előző ill. követő hónap napjai pedig szürkével;
Egy minta html oldal készítése
Egy minta html oldal készítése
Mentsük el a fájlt utf-8 kódolással
Azonosítsuk be a dinamikus tartalmakat! A háttérkép neve: hónap_sorszáma.jpg Az aktuális év és hónap kitöltése A havi naptár kialakítása (erről egy kicsit később)
Tervezzük meg a kódot! A háttérkép neve: mivel a .jpg képek elnevezése követi a hónapok sorszámát, így a rendszeridőnek megfelelő hónap sorszámát felhasználhatjuk a beillesztendő kép neveként. Getdate($timestamp) függvény A megadott tömbbe betölti az aktuális időpontnak (vagy a megadott $timestamp változónak) megfelelő dátum különböző jellemzőit: "seconds" - a másodpercek száma 0-59 "minutes" - a percek száma 0-59 "hours" - az órák száma 0-23 "mday" - a hónapon belüli nap sorszáma 1-31 "wday" - a hét napjának sorszáma (vasárnap 0 – szombat 6) "mon" - a hónap sorszáma (1-12) "year" - az év (4 számjeggyel) "yday" - az éven belüli nap sorszáma 0-365 "weekday" - a hét napjának a neve (Monday, Tuesday, stb.) "month" - a hónap neve (January, February, stb.)
Tervezzük meg a kódot! <?php // Válasszuk ki a hónapnak megfelelő háttérképet $today=getdate(); echo "<td valign=\"top\" background=\"$today[mon].jpg\"> </td>"; ?> Illesszük ezt be a calendar.html fájl megfelelő helyére, majd mentsük el a fájlt calendar01.php néven.
Tervezzük meg a kódot! http://localhost/calendar/calendar.php
Az évszám és a hónap nevének kijelzése <?php $today=getdate(); // Írjuk ki az aktuális évszámot echo "<font face=\"Verdana\" size=\"6\">$today[year]</font></td>"; ?> Illesszük be a fenti kódot a calendar01.php-ba, majd mentsük el azt calendar02.php néven.
Az évszám és a hónap nevének kijelzése Vegyük észre, hogy a getdate itt már akár el is hagyható! (calendar03.php)
Az évszám és a hónap nevének kijelzése A hónap nevének megjelenítése: <?php // Írjuk ki az aktuális hónap nevét // Először hozzunk létre egy tömböt a hónapok nevével $honap = array('Január', 'Február', 'Március', 'Április', 'Május', 'Június', 'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'); // Majd írassuk ki az aktuális dátumban szereplő hónap nevét az előbbi tömbből. // Vegyük észre, hogy a $hónap tömb azon elemét kell kiírni, ahányadik hónapot írjuk minusz 1 // Ennek az az oka, hogy a tömbök indexelése 0-val kezdődik $honapszam = $today[mon]-1; echo "<font face=\"Verdana\" size=\"4\">$honap[$honapszam]</font></td></tr></table>"; ?>
Az évszám és a hónap nevének kijelzése
Ellenőrizzük le, hogy amit eddig csináltunk az jó-e! Állítsuk át a rendszeridőt egy tetszőleges dátumra, majd nézzük meg a http://localhost/calendar/calendar04.php oldalt egy böngészőben! Megjegyzés: az oldal mindig a szerver dátumbeállításainak megfelelően áll elő. Esetünkben ez megegyezik a kliens időbeállításával is, mivel ugyanazon gépen fut a böngésző is. Érdemes kipróbálni egy szomszéd gépről lekérve ugyanezt az oldalt: http://<XXX.YYY.ZZZ.WWW>/calendar/calendar04.php, ahol XXX.YYY.ZZZ.WWW a másik gép IP címe.
for ciklus ! if elágazások ! Most jön a neheze! - a havi naptár előállítása Mit kell tennünk: Meg kell határoznunk, hogy a hónap első napja milyen napra esik. Ki kell számítani, hogy ezen a héten hétfőre milyen nap esett. Meg kell határoznunk, hogy a hónap utolsó napja milyen napra esik. Ki kell számítani, hogy azon a héten a vasárnap milyen napra esik. A két időpont között ki kell számítanunk az eltelt heteket. Ezt követően a kezdő hétfőtől kezdve az eltelt heteken végigfutva ki kell íratnunk a napok sorszámát oly módon, hogy minden hétfőn új sort kezdünk a táblázatban. Ezt fejeljük meg még azzal, hogy a mai nap piros, dőlt, vastag számokkal, az eltérő hónaphoz tartozó napok pedig szürke színnel jelenjenek meg for ciklus ! if elágazások !
Most jön a neheze! - a havi naptár előállítása <?php // A naptárban szereplő legelső nap dátumának meghatározása // Az aktuális hónap első napjához képest meg kell találnunk a megelőző hétfő dátumát // A hónap első napjának időbélyege $firstdaymonth = strtotime('first day of this month'); // Az ezt megelőző hétfő dátuma $firstday = getdate($firstdaymonth); if ($firstday[wday] != 0) $firstmonday = strtotime('Monday this week', $firstdaymonth); else $firstmonday = strtotime('Monday this week', ($firstdaymonth - 86400)); strtotime ($string, $timestamp) Megadja a $timestamp időponthoz képest a $string-ben leírt feltételnek megfelelő időpontot (PHP 5.3-tól, használható a fenti szintaxis). Megjegyzés: a PHP a hetet vasárnappal kezdi (unix örökség), így abban az esetben, ha a hónap első napja vasárnapra esik, akkor az azt megelőző hétfő dátumát kell megkeresni.
Most jön a neheze! - a havi naptár előállítása //Számítsuk ki a kiírandó hetek számát // A hónap utolsó napjának dátuma $lastdaymonth= strtotime('last day of this month'); // Az ezt követő Vasárnap dátuma $lastsunday = strtotime('Sunday this week', $lastdaymonth); // A hetek számának meghatározása $weeknum = ($lastsunday - $firstmonday) / 86400 / 7; // A hónap utolsó napjának neve $lastday = getdate($lastdaymonth); if ($lastday[wday] != 0) $weeknum = $weeknum + 1; Megjegyzés: a hetek száma tört értékű. Így ha ennek az egészrészét vesszük, akkor pontosan egy héttel rövidebb időszakra készül el a naptár (kivéve azt az esetet, ha a hónap utolsó napja vasárnapra esik).
Jöhet a for ciklus! // For ciklus az összes érintett hétre $caldate = $firstmonday; // Kezdőértékadás a dátumváltozóhoz for ($i=0; $i<(floor($weeknum)); $i++) { echo "<tr align=\"center\">"; // Megnyitjuk a táblázat következő sorát for ($j=0; $j<7; $j++) // For ciklus a hét napjaira $caldatearray = getdate($caldate); // Az időbélyeget felbontjuk átalakítjuk dátumtömb formátumra if ($today[mon] != $caldatearray[mon]) // Ha a nap nem az aktuális hónaphoz tartozik, akkor szürkével jelenjen meg echo "<td><font color=\"#AAAAA\">$caldatearray[mday]</font></td>"; else if ($today[mday] == $caldatearray[mday]) echo "<td border=\"1\"><font color=\"#FF0000\"><b><i><u>$caldatearray[mday]</u></i></b></font></td>"; // Ha a mai nap, akkor pirossal echo "<td>$caldatearray[mday]</td>"; // Ha az aktuális hónaphoz tartozik, akkor pedig feketével } $caldate = strtotime('next day',$caldate); echo "</tr>"; ?>
Nézzük meg az eredményt!
Ne álljunk meg félúton! A hónaphoz tartozó vasárnapokat jelöljük szintén pirossal! Ez egy újabb if elágazás beágyazását jelenti. Ha a hónaphoz tartozik egy nap, és az nem a mai nap, akkor piros álló betűvel jelenjen meg a nap sorszáma a naptárban! if ($today[mon] != $caldatearray[mon]) // Ha a nap nem az aktuális hónaphoz tartozik, akkor szürkével jelenjen meg echo "<td><font color=\"#AAAAA\">$caldatearray[mday]</font></td>"; else { if ($today[mday] == $caldatearray[mday]) echo "<td><font color=\"#FF0000\"><b><i><u>$caldatearray[mday]</u></i></b></font></td>"; //Ha a mai nap, akkor piros, dőlt, aláhúzott if ($caldatearray[wday] == 0) echo "<td><font color=\"#FF0000\"><b>$caldatearray[mday]</b></font></td>"; //Ha vasárnap, akkor piros vastag betűvel echo "<td>$caldatearray[mday]</td>"; // Ha egyéb napról van szó, akkor feketével }
Kész a naptárunk! http://localhost/calendar/calendar06.php
Véglegesítsük az alkalmazást, majd teszteljük! A calendar06.php állományt mentsük el index.php néven is az e:\webprog\htdocs\calendar könyvtárba! Ezt követően a naptáralkalmazást elérhetjük a http://localhost/calendar URL-n is, hiszen a httpd.conf fájlban megadtuk az index.php-t, mint lehetséges indexfájlt! Állítsuk át a rendszeridőt különböző értékekre, majd nézzük meg a dátumnak megfelelő naptárlapokat a böngészővel.