Content extract
Kiskapu Kft. Minden jog fenntartva Szaktekintély A PostgreSQL és a PHP V arázsoljuk PostgreSQL-lel tárolt adatbázisainkat a Webre, és egyúttal ismerkedjünk meg napjaink egyik leggyorsabban fejlõdõ programozási nyelvével, a PHP-vel. A cikksorozat elsõ részében telepítjük a PHP-t (3-as vagy 4-es változat) Debian alá, képessé tesszük PostgreSQL adatbázisok elérésére, és megismerkedünk néhány egyszerû PHP utasítással is. Miért Debian? A változatválasztásom oka egyszerûen az, hogy én ezt használom. A programok és a telepítés is Debianon lett kipróbálva, ennek ellenére mûködnie kell a többi változat alatt is. Elképzelhetõ, hogy a beállítófájlok helye más (például RedHat esetén), de a PHP programoknak és a beállító fájlokban levõ beállításoknak ugyanígy kell mûködniük. Debian esetében a csomagok kiterjesztése deb és a csomagkezelõ program a dpkg, míg például RedHat esetében .rpm a kiterjesztés és rpm a
csomagkezelõ neve. RPM csomagokat az RPM -i csomagnév utasítással lehet telepíteni. RedHat esetén a php3ini-t a /etc/httpd könyvtárban, az Apache webkiszolgáló-beállító állományait pedig a /etc/httpd/conf könyvtárban találjuk. A PHP mûködésének ellenõrzése Írásomban feltételezem, hogy az olvasó mûködõ Apache webkiszolgálóval rendelkezik. Ennek telepítését ugyanis nem írom le Legyen egy felhasználónk, akinek a weboldalait meg tudjuk nézni, és akinek a nevében bejelentkezve weboldalakat tudunk készíteni. A szükséges beállítások elvégzéséhez természetesen ismernünk kell a rendszergazda jelszavát is. Helyezzük el a phpinfo.phtml 1. lista A phpinfophtml fájl fájlt (1 lista) a felhasználónk webes könyvtárában (ez általában <?php a felhasználó saját könyvtárának public html nevû alkönyvtára), phpinfo(); adjunk olvasási jogot mindenkinek (chmod o+r phpinfo.phtml), ?> és próbáljuk elérni egy böngészõ
segítségével! Ha látunk egy színes oldalt (1. kép), 1. akkor minden rendben, mûködik a PHP, átugorhatjuk a következõ részt. Ha bármi más történik, akkor vagy nincs telepítve PHP, vagy beállítási gondok vannak. Ellenõrizzük, telepítve van-e a php3 csomag! Debianon ezt a dpkg -l php3 paranccsal nézhetjük meg. Ha a képernyõn a legelsõ oszlopban nem ii (2 lista) van, akkor telepítsük fel. Használhatunk php4-et is, a cikk összes példája mûködik mindkét változattal, a két változat beállítása is szinte ugyanaz. A php3 telepítése A php3 csomagot Debian alatt többféleképpen telepíthetjük. Használhatjuk a dselect programot: a fõképernyõnél „/”-t nyomunk, majd beírjuk: „php”. A kívánt csomagoknál pluszt nyomunk, majd a csomagválasztó menübõl kilépve az „Install” pontot választjuk Ha ismerjük a .deb fájl nevét és helyét, használhatjuk a dpkg parancsot is (3 lista): 50 Linuxvilág 2. lista A sor elején levõ
második betû (n=Not installed) mutatja, hogy nincs telepítve a php3. Ha ez i (i=Installed), akkor minden rendben $ dpkg -l php3 Desired=Unknown/Install/Remove/Purge | Status=Not/Installed/Configfiles/Unpacked/Failed-config/Half-installed | / Err?=(none)/Hold/Reinst-required/X=bothproblems (Status,Err: uppercase=bad) | |/ Name Version Description +++=============================================== pn php3 <none> (no description available) 3. lista A php3 telepítése A LoadModule-lal kezdõdõ sort kell megjegyeznünk monkey:~# cd /cdrom/dists/slink/main/ binary-i386/web/ monkey:/cdrom/dists/slink/main/binary-i386/web# dpkg -i php3 3.05-3deb Selecting previously deselected package php3. (Reading database . 28718 files and directories currently installed.) Unpacking php3 (from php3 3.05-3deb) Setting up php3 (3.05-3) I see you have apache webserver installed and so far you havent used the apache module version of php3 in your apache. If you want to use it, you should
reconfigure the apache webserver and select to load the php module. I can call the apacheconfig script now for you to do it, or you can insert the following line into /etc/apache/httpd.conf manually: LoadModule php3 module /usr/lib/apache/1.3/libphp3so Do you want me to run the apacheconfig script now [y/N] ? Ok, not running apacheconfig. Please read the docs in /usr/doc/php3 Press RETURTN to continue dpkg -i php3 3.05-3deb A kérdésre, hogy indítsa-e el a telepítõ a webkiszolgáló beállítóprogramját, csak nyomjunk ENTER-t, és inkább állítsuk be mi kézzel! Ezután ki is írja, mit kell majd beszúrnunk. A PHP-hoz tartozó leírások külön csomagban találhatók: dpkg -i php3-doc 3.05-3deb Ha a négyes változatot kívánjuk használni, természetesen a php4 nevû csomagokat kell telepíteni. 2. 6. 3. 7. 4. Ha sikerült a telepítés, felkerült a gépünkre a php3.ini fájl, ami a php3 beállításait tartalmazza. Ezt Debianon a /etc/php3/apache könyvtárban
találhatjuk meg (vagy a php.ini fájlt a /etc/php4/apache könyvtárban). Egyelõre hagyjuk változatlanul, és módosítsuk az Apache beállítóállományait! 5. Beállítás A /etc/apache/srm.conf fájlban keressünk rá a php3 szóra! Alapértelmezésként megjegyzésben vannak a php3-ra vonatkozó részek, szedjük ki a # jeleket. Mivel a következõ php programpéldák kiterjesztése php3, ezért módosítsuk is az AddType application/x-httpd-php3 sort, hozzáfûzve a php3 szót (4. lista www.linuxvilaghu/magazin/cikkekhezhtml) Az AddType application/x-httpd-php3-source .phps sorból látható, hogy a phps kiterjesztésû fájlokat php3 forrásként kezeli, azaz meg tudja jeleníteni a tartalmukat (2. kép) A /etc/apache/httpd.conf fájlban keressük meg a LoadModullal kezdõdõ sorokat tartalmazó részt és írjuk a végére a libphp3.so modult betöltõ sort (5. lista wwwlinuxvilaghu/magazin/cikkekhezhtml): LoadModule php3 module /usr/lib/apache/1.3/libphp3so
php4-hez az AddType application/x-httpd-php sorhoz fûzzük a phtml php3 php4 php szavakat, ugyanígy az AddType application/x-httpd-php-source .phps sor is kell A httpd.conf-ba pedig a következõ sort kell beírnunk: LoadModule php4 module /usr/lib/apache/1.3/libphp4so Indítsuk újra a kiszolgálót a /etc/init.d/apache restart paranccsal és próbáljuk megnézni a phpinfo.phtml fájlt a böngéwwwlinuxvilaghu 9. 8. szõnkkel! Most már az 1. képhez hasonlót kell látnunk Ha mégsem, ellenõrizzük a php3 meglétét, az srm.conf-ot és a httpdconf-ot! Ismerkedés a php3-mal Helyezzük el public html könyvtárunkban a phpinfo.php3 és a phpinfo.phps fájlokat! A phpinfophp3 betöltésekor ugyanazt kell kapnunk, mint a phpinfo.phtml megnézésekor (1 kép) Ha mégsem, akkor nem állítottuk be az srm.conf-ot Ellenõrizzük az állományt a 4. lista alapján! A phpinfophps betöltésekor a böngészõben a forrásprogramot kell látnunk (2 kép) A következõ program a
file.php3 (6 lista) Tegyük ezt is a public html könyvtárba és nézzük meg (3. kép) A programot megjeleníti a /etc/passwd fájl tartalmát a böngészõben (3. kép) Ez rengeteg adatot adhat egy betörõ kezébe Gondolom, nem csak az én gyomrom rándul össze a passwd fájl tartalmát látva. A PHP igen erõs eszköz a felhasználók kezében, jól gondoljuk meg, telepítjük-e éles rendszeren. Vizsgáljuk meg a fájl tartalmát. Átlagos HTML-dokumentumot látunk, a <? readfile(/etc/passwd); ?> sor kivételével, ami a readfile() php3 utasítást hajtatja végre a kiszolgálóval. A PHP kódot a HTML-oldalban helyezzük el. Ezáltal a weboldalunk forrása áttekinthetõbb lesz, mint ha például Perl vagy C-alapú weboldal-elõállító programot használnánk. Az utóbbiaknál ugyanis a programunk szerkezetét kell követnie a programba illesztett HTML-kódnak, míg a PHP-nál a PHP programkódot tesszük a HTML-oldal megfelelõ helyére. Így nagyon könnyû
módosítani a weboldal kinézetét. A PHP és a HTML-kód szétválasztására szolgál a <? . ?> tag Tehát a PHP programunk részeit helyezzük el a <? és a ?> tagok között. A PHP kódot a webkiszolgáló hajtja végre, ezért a forráskódunk nem jut el a böngészõhöz, csak a PHP program eredménye. A php3-mal a további ismerkedéshez, csinosítsuk az elõzõ programot! A fileb.php3 (7 lista wwwlinuxvilaghu/magazin/cikkekhezhtml) szintén a passwdfájl tartalmát írja ki, de most soronként olvassuk a fájlt, így lehetõség nyílik az egyes sorok színezésére és táblázatba helyezésére (4. kép) Nézzük át a fontosabb részeket! (A programpélda sorai számozottak, de ez csak a magyarázat kedvéért szükséges Az eredeti fájlból természetesen hiányoznak a sorszámok.) A program szerkezete Az 1–8 sorok normál HTML-fájl kezdõsorai. A 9 sorban belépünk a php3-blokkba. Két változót hozunk létre értékadással Minden változó neve $
jellel kezdõdik. Mindkét változó egy tömb A file() utasítás a megadott fájlt olvassa be, a tartalmát pedig tömbként adja vissza, ahol a tömb minden eleme a fájl egy-egy sorát tartalmazza. A 10. sorban létrehozzuk a $colors tömböt, aminek két karakterlánc típusú eleme van. A 11 sorban kilépünk a php3-ból A következõ php3 blokkot a 16–22-ik sorok mutatják. C-szerû számlálásos ciklus a 16. sorban, a count() függvény egy tömb elemeinek számát adja meg. Mivel a tömbök elsõ elemének sorszáma 0, így $i<count($lines) következtében a tömb összes elemén végigmegyünk. A 17 sorban a $color változónak hol a 2001. május 51 Kiskapu Kft. Minden jog fenntartva Szaktekintély Kiskapu Kft. Minden jog fenntartva Szaktekintély 9. lista A php3ini fájlba kerüljön bele az extension=pgsql.so sor ;;;;;;;;;;;;;;;;;;;;;;;;; Dynamic Extensions ; ;;;;;;;;;;;;;;;;;;;;;;;; ; if you wish to have an extension loaded ; automaticly, use the ;
following syntax: extension=modulename.extension ; foe example, on windows, ; extension=msql.dll ; or under UNIX, ; extension=msql.so ; Note that it should be the name of the ; module only, ; no directory information ; needs to go here. Specify the location of ; the extension with the extension dir ; directive above. ; extension=pgsql.so <TD BGCOLOR=red>, hol pedig <TD BGCOLOR=green> értéket adunk, attól függõen, hogy $i páros-e vagy sem. (Az a % b mûvelet az a és b között végzett osztás maradékát adja.) A tömbök elemeit $tömbnév[index] hivatkozással kapjuk meg, a . (pont) mûvelet pedig karakterláncokat fûz össze). A 18–20 sor egyetlen kiíró utasítást tartalmaz, a kinézet kedvéért három részre osztva. A php3 macskakörmök közé tett karakterláncokban elhelyezett változóneveket az értékükkel helyettesíti. A 19 sor szorul bõvebb magyarázatra, ugyanis itt vágjuk szét a jelszófájl egy sorát és ragasztjuk össze úgy, hogy a
mezõk között a </TD><TD BGCOLOR=.> szöveg legyen Az eplode(határolójel, szöveg) függvény szétdarabolja a szöveget – jelen esetben a „:” a határolójel –, míg az implode(határolójel, szövegtömb) egyesíti egy karakterlánccá a szövegtömb elemeit úgy, hogy minden elem közé a határolójelet teszi. A 20 sorban levõ hatására a print utasítás új sor karaktert ír ki. Most tekintsük át röviden, hogyan vehetjük fel a kapcsolatot egy PostgreSQL adatbázissal! A PHP3 PostgreSQL moduljának ellenõrzése Próbáljuk ki a test.php3 programot, (8 lista megtalálható: www.linuxvilaghu/magazin/cikkekhezhtml) Ez megpróbál kapcsolódni a php db adatbázishoz a php user nevû felhasználó nevében a heureka jelszóval. Ha a böngészõnk a Fatal error: Call to unsupported or undefined function pg connect() in ./ public html/test.php3 on line 2 hibaüzenetet adja, fel kell telepítenünk a postgresql modult a php3-hoz Ez a php3-pgsql
3016-2deb fájl (php4-hez a php4-pgsql 4.0b3-4deb fájl) A telepítéskor a /usr/lib/php3/apache könyvtárba bekerül a pgsql.so fájl. Ez az a modul, amit be kell állítanunk a /etc/php3/apache könyvtárban található php3.ini fájl segítségével Szerkesszük ezt át! A php3.ini fájlban az extension dir-rel kezdõdõ sor mutatja, hol kell lenniük a moduloknak. Ennek a /usr/lib/php3/apache értéket kell tartalmaznia. A Dynamic Extensions részbe írjuk be (9 lista): extension=pgsql.so (a „;”-vel kezdõdõ sorok megjegyzések) Ezután indítsuk újra az Apache-ot a /etc/init.d/apache restart utasítással! Értelemszerûen php4-hez a /usr/lib/php4/apache könyvtárban levõ pgsql.so fájlt és a /etc/php4/apache könyvtárban levõ phpini fájlt 52 Linuxvilág használjuk. Próbáljuk újra a testphp3-at Ha a hibaüzenet nem változott, ellenõrizzük a php3ini tartalmát és indítsuk újra az Apache-ot Ha viszont az alábbi üzenetet kapjuk: Warning: Unable to connect
to PostgresSQL server: FATAL 1: Database php db does not exist in pg database in /home/./public html/testphp3 on line 2 akkor minden rendben, a kapcsolat felépült. Ismerkedjünk kicsit a PostgreSQL adatbázis-kiszolgálóval. Kapunk hozzá egy konzolos segédprogramot, a psql-t. Ezzel hozzáférünk az adatbázisokhoz, táblákhoz és SQL-lekérdezéseket indíthatunk el. A programot a psql utasítással indíthatjuk el A ? paranccsal segítséget kérhetünk. Minden SQL parancs végét pontosvesszõ zárja. A parancsok lehetnek többsorosak is, ekkor az utolsó sor végét zárjuk pontosvesszõvel. A psql belsõ parancsai fordított perjellel kezdõdnek és nem kell pontosvesszõ a lezárásukhoz. A l kiírja az adatbázisokat, connect adatbázisnév paranccsal kapcsolódhatunk a megadott adatbázishoz, d kiírja az adatbázis tábláit. Ha még nem hoztuk létre saját nevünkhöz PostgreSQL-felhasználót, akkor tegyük a következõt rendszergazdaként: su - postgres createuser
Ezután be kell gépelnünk a bejelentkezési nevünket. A user ID-re csak nyomjunk ENTER-t. Saját magunknak érdemes engedélyezni az adatbázisok létrehozását, és hogy esetleg mi legyünk a PostgreSQL rendszerfelügyelõi (akik felhasználókat is létrehozhatnak) úgyhogy a következõ két kérdésre válaszoljunk y-nal. Következõ lépésként hozzuk létre a php db adatbázist. Ezt psql-ben a create database php db; paranccsal tehetjük meg. Újra megpróbálva a test.php3-at, a FATAL 1: SetUserId: user php user is not in pg shadow üzenetet kell kapnunk, úgyhogy hozzunk létre a felhasználót is psql-ben: create user php user with password heureka nocreatedb nocreateuser; utasítással. A nocreatedb hatására php user nem tud adatbázisokat létrehozni, nocreateuser miatt pedig felhasználókat se. Ha a böngészõnk Document contain no data vagy hasonló üzenetet küld, helyben vagyunk. A php3 képes elérni a PostgreSQL adatbázisokat (5 kép) Hogyan tovább? A
cikk folytatásában megismerkedünk a php PostgreSQL adatbázisokat kezelõ függvényeivel, a PostgreSQL biztonsági beállításaival. Közlünk egy webes alkalmazást és rövid útmutatót kapunk, hogyan mentsük át adatbázisainkat újabb változatú PostgreSQL alá. Borkuti Péter (borkuti@freemail.hu) matematika-informatika szakos tanár, rendszergazda, informatikus, rendszerépítõ és programozó. Kapcsolódó címek PHP levelezõlista http://weblabor.hu/wl-phplista/ PHP tükör http://hu.phpnet címrõl a Documentation részbõl letölthetjük a leírás magyar fordítását. (2. rész) Varázsoljuk PostgreSQL-lel tárolt adatbázisainkat a Webre, és egyúttal kóstoljunk bele napjaink egyik leggyorsabban fejlõdõ programozási nyelvébe, a PHP-ba. S orozatunk elõzõ részében telepítettük a PHP-t és beállítottuk a PostgreSQL-t, hogy PHP-ból elérhessük az adatbázisokat. Most megismerkedünk a PostgreSQL biztonsági beállításaival, a PHP
postgreses adatbázisokat támogató függvényeivel, írunk egy rövid webes alkalmazást, és a cikk végén megnézzük, hogy miként kell eljárni, ha a PostgreSQL egy újabb változatára szeretnénk átállni. Az elõzõ cikk végén lévõ példában (test.php3) kapcsolódni próbáltunk a php db adatbázishoz a php user felhasználó nevében, a heureka jelszóval: <?php $connection = pg Connect ( "dbname=php db port=5432 user=php user password=heureka"); ?> A PostgreSQL biztonsági beállításai Mielõtt tovább ismerkednénk a PHP-val, egy kis kitérõt kell tennünk a PostgreSQL felhasználóinak jelszavai kapcsán. Próbáljunk rossz jelszót megadni a test.php3 fájlban vagy változtassuk meg a php user jelszavát psql-ben az ALTER USER php user WITH PASSWORD kukucs; paranccsal. Elképzelhetõ, hogy a PostgreSQL így is engedi a hozzáférést az adatbázishoz. Ha ezt nem akarjuk, módosítsuk a /etc/postgresql/pg hba.conf fájlt Itt eltérõ biztonsági
szinteket (felhasználó-ellenõrzési módszereket) állíthatunk be a különbözõ helyekrõl érkezõ kérésekhez. Ha egy helyben megbízunk (trust értéket állítunk be) – ez az alapértelmezett biztonsági szint helyi hálózatunkra, – nem történik semmilyen jelszóellenõrzés. Ha password a beállított érték, a PostgreSQL ellenõrzi a jelszót, de a jelszavak sima szövegként haladnak a hálózaton. Ha crypt-et adunk meg, a jelszavak titkosítva utaznak a hálózaton, de vigyázzunk, a /var/lib/postgres/data/pg pwd fájlban (10. lista) a jelszavak kódolatlanul tárolódnak. Ilyenkor a pg pwd-ben levõ jelszót kódolja a rendszer, majd ezt a kódolt jelszót hasonlítja össze a belépni kívánó felhasználó által megadott jelszó kódolt változatával. A rendszer további hiányosságairól bõvebben a postgresqldoc/READMEpasswords fájlban olvashatunk Ehhez kapcsolódik még néhány fontos dolog: ha nem trust-ot állítottunk be a helyi hálózatunkra, a
psql-t psql -u paranccsal kell indítanunk, különben nem kér jelszót, így azután nem férhetünk hozzá az adatbázisokhoz. Ekkor azok a felhasználók, akiknek nem állítottunk be jelszót, többé nem tudnak bejelentkezni. Ilyen a Postgres is, tehát mindig állítsunk be jelszót a felhasználónak. Van egy domaintenance karbantartó parancsfájl, amit a cron démon futtat a Postgres-felhasználó nevében (Debianon a /etc/cron.d/postgres fájl segítségével), www.linuxvilaghu ezt kell kibõvíteni a -u postgres -p jelszó szöveggel. A másik említésre méltó dolog, hogy azok a felhasználóink, akik maguk is létrehozhatnak felhasználókat, teljes jogú urai a PostgreSQL-nek, azaz minden felhasználó jelszavát (így a Postgresét is) megváltoztathatják, sõt, megnézhetik a pg pwd fájlban (10. lista) Adatelérés PHP3-mal Most már minden készen áll ahhoz, hogy elérjük a PostgreSQL adattáblákat, és megjelenítsük a tárolt adatokat a weboldalunkon.
Ahhoz, hogy ezt kipróbáljuk, hozzunk létre táblákat és engedélyezzük egy felhasználónak az elérést! Hozzuk létre az allatok táblát – amelyben az állatok és tulajdonosaik neve található – a create table allatok (allatnev char(8), tulaj char(8)); utasítással, majd tegyünk bele egy sort az insert into allatok values (Méhecske,Szilvia); paranccsal. Ezután adjunk jogot a php user felhasználónak a táblához: grant select on allatok to php user; (A lemezmellékletben szereplõ php proba.sql fájlban megtalálhatók ezek az utasítások, elég a psql-ben kiadni a i php probasql utasítást.) A grant utasítás általános alakja GRANT engedélyek ON táblák TO felhasználó; ahol az engedélyek ALL, SELECT, INSERT, UPDATE, DELETE, illetve RULE. Ezek a szavak megfelelnek az azonos nevû SQL utasítás végrehajtásához való joggal, kivéve az ALL-t – ami minden jogot megad, és a RULE-t – amely a szabályok létrehozását engedi, és nem szabványos SQL
utasítások. A felhasználó lehet PUBLIC, ez az összes felhasználót takarja, vagy egy csoportnév, amely a felhasználók egy csoportjára utal. Errõl bõvebb tájékoztatást a PostgreSQL leírásban találhatunk. Egy adatbázis tábláira adott jogosultságokat a z psql parancs kiadásával nézhetünk meg (11. lista) A jobb oldali oszlop egy sorában levõ értéksorozat jelzi, kinek milyen jogokat adtunk felhasználó/ csoport=jogok formában. A jogokat karaktersorozat jelképezi, ahol r:SELECT, w:UPDATE/DELETE, a:INSERT, r:RULE lehet. Ha az egyenlõségjel bal oldalán nincs semmi, akkor a sor mindenkire érvényes jogokat mutat. Miután elkészült a tábla, tovább próbálgathatjuk a PHP3-at. A test2.php3 (12 lista) program kapcsolódik az adatbázishoz A pg Connect() függvény eredménye egy szám, amely azonosítja a kapcsolatot. Több adatbázishoz is kapcsolódhatunk, ekkor mindegyik kapcsolatnak más-más száma lesz A további PHP-PostgreSQL függvényekben ezt a
kapcsolatazonosítót kell használnunk. A pg Exec (kapcsolat azonosító, SQL-szöveg); függvény az SQL-szövegben levõ SQL utasítást hajtatja végre. A visszaadott szám azonosítja a lekérdezést Hiba esetén 0, eredményt nem szolgáltató SQL utasítások (INSERT, DELETE, UPDATE stb.) esetén 2001. június–július 77 Kiskapu Kft. Minden jog fenntartva A PostgreSQL és a PHP Szaktekintély Kiskapu Kft. Minden jog fenntartva Szaktekintély 10. lista A /var/lib/postgres/data/pg pwd fájlban normál szövegként tárolódnak a jelszavak billgates proba phpuser jeno php user 1002 1003 1004 1006 1005 t t f f f t t f f f t t f f f t t f f f N N N N heureka N N N heureka N"); 11. lista A z psql utasítással a táblákhoz rendelt jogosultságokat nézhetjük meg php db=> z Database = php db + + + | Relation | Grant/Revoke Permissions | + + + | allatok | !"=","php user=r"} | | szemely | {"="} | + + + 12. lista A test2php3
program Kiírja egy SQL tábla elsõ sorának elsõ mezõjét 13. lista A test3php3 program Egy teljes eredménytábla kiírása 1 A tábla sorai:<P> 2 <TABLE BORDER=1 BGCOLOR=YELLOW> 3 <?php 4 $connection = pg Connect 5 ("dbname=php db port=5432 user=php user password=heureka"); 6 $result = pg Exec($connection, "SELECT * FROM allatok;"); 7 8 print <TR>; 9 for($i=0; $i<pg numfields($result);$i++) { 10 print <TD BGCOLOR=RED><B>. 11 pg fieldname($result,$i)."</B></TD>"; 12 }; 13 print </TR>; 14 15 for($i=0; $i<pg numrows($result); $i++) { 16 $row = pg fetch row ($result, $i); 17 print <TR><TD> .implode(</TD><TD>,$row)"</TD></TR> "; 18 }; 19 20 pg Close($connection); 21 ?> 22 </TABLE> <?php $connection = pg Connect ( "dbname=php db port=5432 user=php user password=heureka"); $result = pg Exec($connection, "SELECT * FROM
allatok;"); $row = pg fetch row ($result, 0); print "A tábla elso sorának elso eleme: <B>" . $row[0] "</B> "; pg Close($connection); ?> 1, lekérdezéseknél egynél nagyobb ez az érték. A késõbbiekben, ha egy lekérdezés eredményét el akarjuk érni, ezt az azonosítót kell használnunk. A pg fetch row (lekérdezés azonosító, sorszám); függvény az eredmény sorszám-adik sorát adja vissza tömbként. A tömb elemei a sor mezõi. Az elsõ eredménysor a 0-ik sorszámú A print paranccsal vastagon szedve kiírjuk a $row tömb nulladik elemét. Végül bezárjuk a kapcsolatot a pg Close (kapcsolat azonosító); függvénnyel. A test3.php3 program (13 lista, a sorszámok csak a magyarázat kedvéért szerepelnek) végigolvassa a táblát és HTML táblázatként kiírja. A PHP-program a 3 sornál kezdõdik A kapcsolat létesítése és az SQL utasítás kiadása után (4–6. sorok) kiírjuk a táblázat fejlécét, piros
hátterû cellákban. A pg NumFields (lekérdezés azonosító) függvény megadja, hány oszlopa van az eredménytáblázatnak. A 9 sorban indított számlálásos ciklussal végigmegyünk az oszlopokon és a pg fieldname (lekérdezés azonosító, oszlop sorszám) függvénnyel – ez az oszlopok nevét adja vissza – a 10–11. sorokban kiírjuk a fejlécet. A pg numrows (lekérdezés azonosító); függvény 78 Linuxvilág 14. lista A test4php3 program Az include() parancs bemutatása <HTML> <HEAD> <TITLE>test4</TITLE> </HEAD> <BODY bgcolor=black text=white> <?php include("test4.inc"); print "<H1><CENTER>Helló</CENTER></H1> "; include("test4.inc"); ?> </BODY> </HTML> 15. lista A test4inc fájl Példa include-fájlra <TABLE bgcolor=red width=100%> <TR><TD><CENTER>Szia</CENTER></TD></TR> </TABLE> visszaadja az
eredménytáblázat sorainak a számát. Ennek segítségével (15 sor) egy számlálásos ciklussal olvassuk be a sorokat a $row tömbbe (16. sor), ezt az implode() függvénnyel alakítjuk át karakterlánccá és írjuk ki (17. sor) Szaktekintély 17. lista A fuggvinc fájl Példa függvényekre <?php include("fuggv.inc"); ?> <HTML><HEAD></HEAD> <BODY BGCOLOR=ORANGE> <TABLE BORDER=0 WIDTH=100%> <TR> <TD WIDTH=50%> <TABLE BORDER=1> <?php MyTable(); ?> </TABLE> </TD> <?php srand((double)microtime()*1000000); function random color() { $colors=array(white,red,green, yellow,blue); return $colors[rand(0,count($colors)-1)]; }; function MyTable() { for($i=0; $i<10; $i++) { print <TR>; for($j=0; $j<5; $j++) { print <TD BGCOLOR= .random color()">$i,$j</TD>"; }; print "</TR> "; }; }; <TD> <CENTER> <?php PHP3 Caption(1,7); ?>
</CENTER> </TD> <TR> </TABLE> </BODY> </HTML> 6. 7. Hasznos PHP-trükkök Include-fájlok, függvények, ûrlapok Mielõtt megírnánk egy „komolyabb” alkalmazást, meg kell ismerkednünk a nyelv néhány fontos tulajdonságával, ezért átmenetileg szakadjunk el az adatbázisoktól. Elsõként megemlíteném, hogy PHP-programunkat lehetõségünk van több fájlban tárolni. Így a különálló részeket egyszerûen használwwwlinuxvilaghu Kiskapu Kft. Minden jog fenntartva 16. lista A fuggvphp3 program function PHP3 Caption($minsize,$maxsize) { for($i=$minsize; $i<=$maxsize; $i++) { print "<BR><FONT SIZE=$i COLOR=" .random color() ">PHP3</FONT> "; }; }; ?> hatjuk késõbbi programjainkban, és kisebb mérete következtében a forrás is olvashatóbb lesz. A részeket beilleszteni az include (fájlnév); utasítással lehet. Erre példa a test4php3 (14 lista) program és a test4.inc (15
lista) fájl A test4inc fájl piros hátterû táblázatot rajzol egyetlen cellával, melynek közepén a Szia szó szerepel. Ezt a fájlt fûzzük be kétszer test4php programunk szövegébe, a Helló szó kiírása elõtt és után (6. kép) Az include-fájlok nevének nem kötelezõ .INC-re végzõdni, az bármi lehet, akár .PHP is A php-végzõdés elõnye, hogy az Internetrõl láthatatlan a tartalma, ugyanis amikor valaki megpróbálja letölteni, a webkiszolgáló értelmezi a fájlt, és csak az abban lévõ kimenet tartalma fog megjelenni a böngészõben. Azért használok mégis INC végzõdést, hogy könnyen megkülönböztethetõk legyenek az includefájlok a programfájloktól. Függvények írása sem nehéz PHP-ban. A fuggvphp3 program (16. lista) meghívja a MyTable () és a PHP3 Caption () függvényeket (a program eredménye a 7. képen látható) Mindkét függvény megvalósítása a fuggv.inc fájlban (17 lista) található Az srand () paranccsal beállítjuk a
véletlenszám-elõállító kezdõértékét. A function random color () részben egy véletlen színt választó függvény van, ami a return utasítással ad vissza értéket a hívó programnak. A function MyTable () kezdetû blokkban két számlálásos ciklussal írjuk ki a 7. kép bal oldalán látható táblázatot Itt látunk példát a random color () függvény használatára is. A PHP3 Caption ($minsize,$maxsize) függvény készíti el a 7. kép jobb oldalát A két átadott érték a PHP3 szöveg méretének alsó és felsõ korlátja A PHP-nyelv megengedi a változók cím és érték szerinti használatát, alapértelmezett (default) értékének megadását és változó számú átadott érték kezelését is. 2001. június–július 79 Kiskapu Kft. Minden jog fenntartva Szaktekintély 18. lista A formhtml fájl egy egyszerû ûrlapot valósít meg <HTML> <HEAD> <TITLE></TITLE> </HEAD> <BODY> <FORM
action="mutat.php3" method="post"> <P>Írj be valamit: <INPUT type="text" name="szoveg1"> <INPUT type="text" name="szoveg2"> <P><INPUT type="submit" value="Elküldés"> <INPUT type="reset" value="Törlés"> </FORM> </BODY> </HTML> 19. lista A mutatphp3 program Ûrlapmezõk neveinek és értékeinek kiírása <HTML> <HEAD> <TITLE></TITLE> </HEAD> <BODY> <?php reset ($HTTP POST VARS); while (list($key, $val)= each($HTTP POST VARS)) { print "$key = $val<BR> "; }; ?> </BODY> </HTML> Errõl bõvebben a PHP-leírás functions.argumentshtml oldalán olvashatunk. Szükségünk lesz ûrlapok kezelésére is. Legyen az ûrlapunk a form.html fájl (18 lista) Ebben két beviteli mezõ van, szoveg1 és szoveg2 néven, valamint elküldõ- és törlõgomb. Elküldéskor a
mutat.php3 program kapja meg a beviteli mezõk neveit és értékeit PHP3-ban a POST eljárással kapott név–érték párokat a $HTTPPOST-VARS tömbön keresztül érhetjük el; ha GET-et használtunk, akkor a $HTTP-GET-VARS tömb áll a rendelkezésünkre. Ezek úgynevezett társított vagy nevesített (asszociatív) tömbök, ezek lényege, hogy a tömb elsõ oszlopa változók neveit, a második pedig az adott változóhoz tartozó értékeket tartalmazza. A tömb egy értékét a hozzá tartozó névvel is indexelhetjük. A tömb adatait emellett elérhetjük a 0, 1, indexek használatával is, ilyenkor a páros indexekre a neveket kapjuk, a páratlanokra az értéket. Ha például a szoveg1 beviteli mezõbe a Hello szót írtuk, elküldés után a mutat.php3 programban a $HTTP POST VARS ["szoveg1"] kifejezéssel kaphatjuk meg a Hello értéket. A tömböknek van belsõ mutatójuk is, ennek segítségével az elemeket indexelés nélkül, sorban egymás után is
elérhetjük. 80 Linuxvilág 20. lista A valasztphp3 program Választólistás ûrlap 1 <?php 2 $connection = pg Connect( 3 "dbname=php db port=5432 user=php user password=heureka"); 4 $result = pg Exec($connection, "SELECT * FROM allatok;"); 5 pg Close($connection); 6 7 print <FORM action="egy.php3" method="post">." "; 8 9 print <SELECT size="6" name="allatok">." "; 10 for($row=0; $row < pg NumRows($result); $row++){ 11 print <OPTION VALUE=.pg Result ($result, $row, 1).>; 12 print pg Result ($result, $row, 0) . gazdája . 13 pg Result ($result, $row, 1) . </OPTION> . " "; 14 } 15 print </SELECT>." "; 16 17 print <P><INPUT type="submit" value="Ezt választom">. 18 <INPUT type="reset" value="Választás törlése"></FORM>; 19 20 ?> 8. A PHP beállításától függõen az
ûrlap beviteli mezõi elérhetõk lehetnek egyszerû változóként is, azaz a szoveg1 beviteli mezõ értéke lekérdezhetõ a $szoveg1 globális változón keresztül. Sokan nem szeretik ezt a szolgáltatást, ugyanis könnyû összekeverni a program által egyébként is használt globális változókat az ûrlapokon keresztül kapottakkal. Errõl bõvebben a leírás configurationhtml oldalán olvashatunk a track vars és a register globals részeknél. Nézzük meg a mutat.php3 programot (19 lista) A reset ($HTTP POST VARS); sorral a tömb belsõ mutatóját a tömb elejére állítjuk. A while (list($key, $val) = each ($HTTP POST VARS)) kezdetû blokk egy elöl tesztelõs ciklus, amelynek magjában kiírjuk a $key és a $val változók értékeit. A $key tartalmazza az ûrlapmezõ nevét, a $val pedig az értékét. 21. lista Az egyphp3 program egyetlen értéket dolgoz fel <?php $val = $HTTP POST VARS["allatok"]; $connection = pg Connect("dbname=php db
port=5432 user=php user password=heureka"); $result = pg Exec($connection, "SELECT * FROM szemely WHERE nev=$val;"); pg Close($connection); print pg Result ($result, 0, 0)., pg Result ($result, 0, 1)., ((pg Result ($result, 0, 2)==f) ? nõ : férfi) ." "; ?> 9. ramnak küldi el. A lényeges rész a 9–15 sorokban van Itt állítja elõ a program a választólistát. A 10 sorban végigmegyünk az eredménytábla összes során és mindegyik sorból készítünk egy HTML sort: <OPTION VALUE=gazda neve>állat gazdája gazda neve</OPTION> Így az egy.php3 programnak valamelyik állattartó nevét fogjuk elküldeni A 17 és 18 sorok egy submit és egy reset gombot állítanak elõ Az egy.php3 program (21 lista) a $val változóba teszi az allatok névhez tartozó értéket a $HTTP POST VARS tömbbõl. Ezután kiválasztja azokat a sorokat a szemely táblából, ahol a nev értéke megegyezik a $val változó értékével Azért kell $val-t
aposztrófok közé tenni, mert a tömb nev oszlopa szöveges típusú adatokat tartalmaz. A program utolsó része kiírja az eredménytábla nulladik sorát A (pg Result ($result, 0, 2) == f) ? nõ : férfi) eredménye nõ vagy férfi – attól függõen, hogy a harmadik mezõ értéke f lesz-e. A program kimenete egyetlen sor a böngészõben, például: Szilvia ,1978-03-14, nõ. Áttérés új PostgreSQL-változatra Nagyobb váltásoknál módosul az adatbázisok tárolási formátuma. Mivel az újabb változatok nem mindig mûködnek a régi adatbázisokkal, ki kell menteni az adatbázisokat, letörölni az adatbáziskönyvtárat (általában a /var/postgres/data könyvtár), és meg kell szabadulni a régi Postgrestõl, telepíteni kell az újat, majd beüzemelni és visszaállítani az adatbázisokat. Ezalatt természetesen meg kell akadályoznunk, hogy az adatbázisok változzanak. Legegyszerûbb, ha leállítjuk a PostgreSQL-t (A folyamatról olvashatunk a
/usr/doc/postgresql-doc/README.Debianmigrationgz fájlban) Frissítsünk mi is a 6.32-rõl (ami a Debian Slink-ben található) a 6.53-ra (ez a Potato-változat része) Az adatbázisok mentése és visszatöltése Az az izgalmas rész, ahol a $key és $val megkapja értékét, ez pedig a ciklusfeltételben történik meg. A list (változólista) kulcsszó hatására egyben kezelhetünk változókat, úgy, mintha egy tömb lennének. Az each (tömb) kiválasztja a tömbbõl a belsõ mutatója által mutatott név–érték párt és hátrébb állítja a mutatót. Így a list ($key, $val) = each ($HTTP POST VARS) értékadásra a $key és $val változók megkapják az általunk kívánt értékeket. Az elöl tesztelõs ciklus miatt az ûrlap mezõjét kiírjuk, nem kell tudnunk, hogy pontosan mi volt a mezõk neve és hány volt az ûrlapon. Futtatásának eredményét láthatjuk a 8 képen Egy alkalmazás Most már visszatérhetünk az adatbázis-kezeléshez. Legyen a feladatunk
az, hogy a példaadatbázis allatok táblájában levõ állatok gazdáiról tudjunk meg adatokat A programunk felkínálja az összes bejegyzést a táblából. A felhasználó válasszon innen egy sort, és az ott levõ gazdához tartozó adatok jelenjenek meg egy újabb weboldalon. Elsõként nézzük meg a valaszt.php3 program eredményét (9 kép) A böngészõben egy lista jelenik meg az állatokról és gazdáikról. A képernyõ alján két gomb található az elküldésre és a választás törlésére A program (20. lista) sorait megszámoztam Tekintsük át a parancsokat! A lista elsõ része (1–5 sorok) csatlakozik az adatbázishoz és lekéri az összes sorát. A 7 sor eredménye lesz a weboldal elsõ sora, megnyit egy ûrlapot, amely az adatokat az egy.php3 progwwwlinuxvilaghu Állítsuk le a Postgrest a /etc/init.d/postgres stop parancscsal Rendszergazdaként át tudunk váltani a postgres felhasználóra a su - postgres utasítással. Ezután adjuk ki a
postgresql-dump -t db.out parancsot A dbout fájl a /var/postgres könyvtárban jön létre. Belenézhetünk: átlagos szöveges fájl, amely a psql számára készült. Másoljuk biztonságos helyre, például a saját könyvtárunkba Éles rendszereken természetesen mentsünk le mindent a következõ lépések végrehajtása elõtt! Töröljük a /var/postgres/data könyvtárat. Töröljük a postgresql csomagot: dpkg --remove postgresql Telepítsük az új PostgreSQL-t. Telepítés alatt beállíthatjuk a használt dátumformátumot és karakterkódolást. Ha nem történt hiba, létrejön a /var/postgres/data könyvtár, benne a rendszeradatbázisok és a template1 adatbázis. Hozzuk létre régi adatbázisainkat. Lépjünk be postgres néven: su - postgres, és adjuk ki a psql -e elérési út/db.out parancsot. Ha valami hibát veszünk észre, elképzelhetõ, hogy javítani kell a db.out fájlon Ekkor kezdjük újra a folyamatot: állítsuk le a Postgrest, töröljük a data
könyvtárat, lépjünk be postgresként, majd adjuk ki az initdb parancsot, ez létrehozza a data könyvtárat a szükséges adatbázisokkal. A listák megtalálhatók a 14. CD-melléklet Magazin/Cikkekhez könyvtárában. Borkuti Péter (borkuti@freemail.hu), matematika-informatika szakos tanár, rendszergazda, informatikus, rendszerépítõ és programozó. 2001. június–július 81 Kiskapu Kft. Minden jog fenntartva Szaktekintély