Scigi Gabor

Webes adatbazis .... kezeles MySQLes PHP hasznalataval

BBS-INFO, 2005.

A konyv megirasakor a szerz6 es a kiad6 a lehet6 legnagyobb gondossaggal jart el. Ennek ellen ere a konyvben el6fordulhatnak hibak. Az ezen hibakbol ered6 esetIeges karokert sem a szerz6 sem a kiad6 semrnifele felelosseggel nem tartozik, de a kiad6 szivesen fogadja, ha ezen hibakra Ielhivjak Iigyelmet.

Minden jog fenntartva! A konyv vagy annak oldalainak rnasolasa, sokszorositasa csak a kiado irasbeli hozzajarulasaval tortenhet.

ISBN 963 9425 04 4

Kiadja a BBS-INFO Kft. 1630 Budapest, pf. 21.

Fele16s kiad6: a BBS-INFO Kft. ugyvezetoje Keszult a Debreceni Kinizsi Nyorndaban. Fele16s vezet6: Bordes Janos

Tartalomjeqyzek

3

'I'artalomjegyzek

1. Telepttes 7

1.1. A MySQL telepitese 7

1.1.1. A MySQL telepites Windows alapu operacios rendszer ala 8

1.1.2. MySQL telepitese Linux ala 14

1.2. A PHP telepitese 15

1.2.1. A PHP telepitese IIS ala 15

1.2.2. A PHP telepitese Apache ala Windows kornyezetben 17

1.2.3. PHP telepitese Linux kornyezetben 19

2. Az adatbazfs-kezeles alapjai.. 21

2.1. Az adatbazis 21

2.1.1. Egy kis tortenelem 21

2.1.2. Relacios adatmodell 22

2.1.3. Az adatbazis logikai tervezese 23

2.1.4. Az adatbazis fizikai tervezese 27

2.2. A MySQL alapjai 29

2.2.1. Az Adatbazisokkal kapcsolatos muveletek 30

2.2.2. A tablakkal kapcsolatos adminisztracios muveletek 31

2.2.3. A tablak adataival kapcsolatos muveletek 36

2.2.4. Lekerdezesek 40

2.2.5. Tranzakciok jelentosege es hasznalata 57

2.2.6. Tablak zarolasa 58

2.2.7. .Jogosultsagok kezelese 59

2.2.8. Kulso adatallomanyok kezelese 60

3. A PHP nyelv alapjai 62

3.1. A PHP es a HTML kapcsolata 63

3.2. Muveletek adatokkal 66

3.2.1. A valtozok jelentosege 66

3.2.2. Konstansok szerepe 75

3.2.3. Operatorok es kifejezesek hasznalata 75

3.3. Vezerlesi szerkezetek 80

3.3.1. Felteteles utasitasok 80

3.3.2. Ciklusok 84

3.3.3. A fuggvenyek 91

3.4. A tombok hasznalata 104

3.4.1. Indexelt tornbok 104

3.4.2. Asszociativ tornbok 105

4

Webes adatbazls-kezeles MySQL es PHP hasznalataval

3.4.3. Muveletek tombokkel. 106

3.4.4. Tobbdimenztos tornbok III

3.5. Az urlapok kezelese 115

4. A PHP es a MySQL kapcsolata 123

4.1. Csatlakozas az adatbazishoz 123

4.2. Lekerdezes adatbazisbol 125

4.3. Adatbevitel az adatbazisba 128

4.3.1. Adatbevitel urlapok segitsegevel.. 130

5. Egy egyszerii szamlazo minta program elkeszrtese 134

5.1.1. A belepes 135

5.1.2. A regtstration.php mukodese 142

5.1.3. Felhasznaloi jelszo modositasa, vevok, termekek

lekerdezese 145

5.1.4. Szarnla keszitese 145

5.1.5. A szamlak megtekintese 150

5.1.6. Vev6, terrnek felvetele 152

5.1.7. Szarnla torlese 152

5.1.8. Felhasznalok karbantartasa 153

6. MELLEKLETEK 155

6.1. A legfontosabb HTML tag-ek 155

7. Feladatok megoldasaf: 158

Eloszo

5

Eloszo

Az elkovetkezo oldalakon betekintest nyerhetunk az informatikai vilag talan leggyorsabban es minden bizonnyal a leglatvanyosabban terjedo reszenek, a weblapok keszitesenek vilagaba. Ez az a terulet, arnelyrol mar mindenki hallott es eredrnenyeivel nap, mint nap nagyon sokan talalkoznak.

Egy idoben nem valtozo (statikus) weblap elkeszitese es megjelenitese rna mar mindenki szamara k6nnyen megoldhat6 feladat, his zen rendelkezesre allnak a modern es egyszeruen hasznalhato fejleszto eszkozok, valamint szarnos lehetoseg ad6dik a sajat lapunk megjelenitesere a vilaghalon. Szarnos szolgaltato biztosit ingyenes tarhelyet rierni reklamert cserebe.

A k6nyv celja, hogy bemutassa, mikent lehet olyan oldalakat is kesziterii, amelyek tartalma az idok soran, akar minden masodpercben valtozhat. Ehhez nyujt alapveto segitseget a MySQL adatbazts-kezelo, valamint a PHP programozasi nyelv es e ket komponens egyuttmukodesenek megismerese. A k6nyv cel]a, hogy megismerkedjuk a dinamikus programozas alapjaival, hogy kepesek legyunk onallo oldal programozasara.

Az else fejezetben megvizsgaljuk, milyen m6don tudjuk telepiteni a MySQL adatbazis-kezelo rendszert, valamint a szkriptjeink futtatasahoz szukseges PHP4-et mind Windows alapu, mind Linux alapu rendszerekben. Nemi jartassagot szerezhetunk a konflguracios fajlok beallitasaival kapcsolatban is.

A masodik fejezetben reszletesen foglalkozunk a relacios ad atbazisok elmeletevel, hatekony adatbazisok tervezesevel, kialakitasaval, az SQL programnyelv legfontosabb parancsaival, valamint a MySQL sajatossagaival. Ezen fejezet hasznos alap lehet mas relacios adatbazlskezelo-rendszer, mint az Oracle, vagy az egyeb kereskedelemben kaphat6 vagy akar ingyenes letoltheto adatbazis-kezelo megismeresenek is.

A harmadik fejezetben betekintest nyerhetunk a PHP programozas vilagaba, mely soran megtsmerkedunk azon alapveto fogalmakkal, eljarasokkal es programoz6i eszkozokkel, melyek

6

Webes adatbazis-kezeles MySQL es PHP hasznalataval

hasznalata es alapos isrnerete nelkul nern lehet hatekony prograrnot irni.

A negyedik fejezetben rnegtanuljuk, hogy tudjuk a MySQL-t es a PHP-t egyutt dolgoztatni, rni rn6don tudunk pillanatok alatt adatokat felvinni egy adatbazisba, hogy tudjuk a Iekerdezeseinket rnegjeleniteni es rnilyen eszkozeink vannak dinarnikus weblapok keszitesehez,

Az otodik fejezetben egy rninta alkalmazas elkesziteset kovethetjuk nyornon, sok hasznos otletet szerezve egy j61 mukodo es biztonsagos adatbazis-kezelo alkalrnazas megrrasahoz.

Valarnennyi fejezetben sok peldat, Illusztraciot talalhatunk a tananyag konnyebb elsajatitasanak erdekeben, Javasoljuk, hogy a rnintak alapjan minel tobb feladatot talaljunk ki rnagunknak, hogy rogzodjon a frissen rnegszerzett tudas, ehhez nyujt hathat6s segitsege a fejezetek vegen megtalalhato feladatsor. Ne legyunk restek ezeket a feladatokat rnegoldani es addig probalkozni, mig helyes eredrnenyt nern kapunk.

A konyvben talalhato szkriptek megtalalhatoak a CD mellekleten is.

A konyvben az attekinthetoseg erdekeben a parancsok kotelez6en rnegadand6, allando reszeit Currier New betutipussal 01- vashatjuk, a parancsok parameterit d61ten. [ 1 zarojelek kozott azokat a parametereket talalhatjuk, amelyeknek megadasa nem kotelezo,

A 'rnysql>' a MySQL kezelo-programjanak alapertelmezett prornptja, a parancsokat ez utan kell begepelni,

1. Telepites

7

1. Telepftes

Ahhoz, hogy ezt a k6nyvet vegigolvasva megtanuljuk, milyen lehetoseget biztosit egy adatbazis-kezelo es egy programozasi nyelv, azokat mindenkeppen telepitenunk kell. A ket program telepitese minimalis szamitastechnikai tudast es nerni angol ismeretet igenyel, felteve ha tudni is akarjuk, mit is csinalunk pontosan.

Mindket program nyilt forraskodu, ingyenesen letoltheto es hasznalhato a szamitogepunkon. Az ingyenessegnek koszonhetoen rnindket program nagyon elterjedt, amely kovetkezteben szamos helyen talalunk az interneten e ket program kezelcset megkonnyito segitseget, bar ezek javareszt angel nyelvuek. A fo problernat inkabb a megfelel6 oldal kivalasztasa okozza.

Mind a MySQL-nek, mind a PHP-nak letezik Windows alapu szarnitogepekre, valamint Unix/Linux alapu gepekre is telepito verzi6ja.

1.1. A MySQL telepitese

Az els6 -es tal an az egyik legfontosabb- lepes a legfrissebb MySQL verzi6 beszerzese. A szoftvercsomag letoltheto a MySQL AB altal uzerneltett hivatalos oldalrol (ht tp : / / dey . mysql. com/downloads/mysql/). A konyv megjelenesekor a 4.1-es verzi6 volt az ajanlott, de mar letolthetjuk az 5.0 beta verzi6 is tesztelesre, valamint az oldalon rnegtalalhatjuk korabbi verzi6k is.

A MySQL szamos operacios rendszeren futtathat6, beleertve a Windows valamennyi verziojat (95 verzi6 folott). a Linuxot, a Solarist, Unixot, Novellt es meg szamos otthoni felhasznalok kozott kevesbe elterjedt operacios rendszert.

8

Webes adatbazis-kezeles MySQL es PHP hasznalataval

1.1.1. A MySQL relepttes Windows alapu operacios rendszer ala

A letoltes soran harorn fajta telepit6-csomag kozul valaszthatunk, rnelybol a mysql-essential-4 .1. 9-win32 .msi verzio letoltese a legcelszerubb. Ez a verzio Windows MSI formatumu, azaz konnyen telepithet6, rugalmas es megfelel a Windows ajanlasainak.

Fontos, hogy a telepites vegrehajtasahoz rendszergazdai jogokkal kell rendelkeznunk az ad ott szamitogepen!

A telepit6 csomag inditasakor megjelenik a szokasos udvozlo kepernyo, melyrol a Next gomb lenyornasa utan lephetunk tovabb.

A kovetkezo lepesben beallithatjuk a telepites modjat, Complet valasztasa cseten valamennyi komponens telepulni fog, meg olyanok is, amire varhatoan soha sem lesz szuksegunk,

1. abra MySQL telepttest modjanak kfvalasztasa

A Custom valasztasa eseten mi magunk tudjuk beallitani, hogy a program hova telepuljon (alapesetben a c: \Program Files\MySQL) es melyek azok a komponensek, amelyekre szuksegunk van. Ez a rnegoldas csak gyakorlott felhasznalok szamara ajanlott. Esetunkben a legjobb megoldasa a Typical kivalasztasa es a Next gombra valo kattintas. fgy csak az altalanosa hasznalt komponensek telepitese tortenik meg.

A Next hatasara megjelen6 ablakban beallithatjuk, mely komponenseket szeretnenk telepiteni a szarnitogepunkre.

1. Telepites

9

2. abra A teleptteudo komponensek ktvalaez'tasa

A feher hatteru ikonokhoz tartoz6 programreszek fognak telepulni, a piros X es ikonokhoz tartoz6 programreszek nem.

A kovetkezo ablakban elindithatjuk a tenyleges telepitest az Ins tall gombra kattintva. A kivalasztott komponensek telepitese utan a telepit6 felkinalja a MySQL. com szerveren sajat account(fi6k) kialakitasat, melyet most nem kivarrunk igenybe venni, ezert valasszuk a Skip Sign-Up radiogombot es kattintsunk a Next gombra. Ezzel be is fejeztuk a telepites els6 reszet, ezek utan az adatbazis-kezelonk konflguralasa kovetkezik, melyet a Configure the MySQL Server now jelolo negyzet kipipalasaval es a F ini sh nyomogornbra torteno kattintassal tehetunk meg.

Wizard Completed

Setup has finished installing MySQl Server 4.1 . Click Finish to exit the wi2ar~.

f7 Configure the My5Ql Server now

Use this option to generate an optimized MySQL config file, setup a Windows service running on a dedicated port and to set the password for the root account.

3. abra A MySgL szerver konflguractos varazstojanak Inditasa

A Konflguractos varazslo szokasos udvozlo kepernyojen val6 tuljutaskor elerkezunk a konflguracio beallitasanak rnodjahoz, ahol a Detailed Configuration-t valasszuk, mivel ennek segitsegevel reszletesebb beallitasokat tudunk vegezni,

Webes adatbazis-kezeles MySQL es PHP hasznalataval

10

MySQl

Instance Configuration

4. abra A beallttas modjanak ktvalasztasa

A kovetkezo ablakban klvalaszthatjuk, hogy a szamitogepunk, rnilyen szerepet fog betolteni a MySQL eleteben. Ha nem onallo dedikalt szerverkent hasznaljuk gepunket, akkor a Developer Machnie-t (Fejleszt6i gep) valasszuk, A valasztas hatasara a konfiguractovarazslo optimalizalja a lemez felhasznalast, valarnint a processzorhasznalatot.

My5Ql Server Instance Configuration

5. abra A szamit6gepiink fo funkclojanak ktvalasztasa

Tovabblepeskor ki kell valasztanunk az adatbazisunk tipusat.

Itt is harom fajta kozul valaszthatunk. A Multifunctional Da tabase kivalasztasa eseten egy altalanos felhasznalasu gyors adatbazis konfiguractot kapunk. Transactional Database Only valasztasa eseten egy alkalmazas kiszolgalasra cs web alkalmazasok futtatasara optimalizalt tranzakci6 koveto adatbaziskeze16t kapunk, mig Non-Transactional Database Only va-

1. Telepltes

11

lasztasakor egy egyszeru web kiszolgalasra alkalmas adatbaziskezelohoz jutunk, tranzakci6 kovetes nelkul. A Next gombra kattin tva eljuthatunk az InnoDb adatbazisok telepitesi helyet kivalaszt6 ablakig, ahol kivalaszthatjuk az adatbazisok tarolasara hasznalni kivant meghajtot.

MySQl Server Instance Configuration

6. abra Az adatbazfsalnk fajtajanak meghatarozasa

Tovabbhaladva, kivalaszthatjuk, hogy a rendszerunk, mennyi egyideju hozzaferesre legyen optimalizalva. A Decision Support valasztasa akkor javasolt, ha a felhasznalok szama kevesebb, mint 20. On-line Transaction Processing valasztasa eseten az egyideju felhasznalok szama tobb, mint 500 lehet, illetve a harmadik Iehetoseg valasztasa eseten magunk allithatjuk be az egyideju kapcsolatok szamat.

MySQl Server Instance Configuration

7. abra A szerver terhelesenek beallitasa

A kovetkezo ablakban beallithatjuk, hogy a MySQL melyik TCP /IP porton kommunikaljon. Szabvanyos esetben a port szarna 3306, amit csak a proxy-nk beallitasa, valamint a rendszergazda utasitasa befolyasolhat.

12

Webes adatbazis-kezeles MySQL es PHP hasznalataval

MySQl Server Instance: Configuration

8. abra A MySgL szerveriin TCP lIP portjanak beallrtasa

Ezutan kovetkezik az alapertelmezett karakterkeszlet beallitasat szabalyozo oldal. A karakterkeszlet kivalasztasanal el kell gondolkodnunk milyen nemzetisegu celkozonsegnek szanjuk adatbazisunk adatait. A Standard Character Set valasztasa eseten a La tinl kodkeszlet kerul beallitasra, amely megfelel az angel abece betukeszletenek, valamint szamos nyugat-eur6pai betukeszletnek, A Best Support For Multilingualism eseten az UTF8 kerul beallitasra, amely tartalmazza, valamennyi angel, valamint egyeb nyelvi betuket, tobbek kozt a magyar abece betuit, meg a hosszu maganhangzokat is. A harmadik lehetoseg valasztasa eseten mi magunk allithatjuk be karakterkeszletet. A magyar karakterkeszlet a Latin2 es a cp12S0. Mi a masodik lehetoseget valasszuk, tekintettel arra, hogy ez az egyik legtamogatottabb nyelvkeszlet Windows alapu rendszerekben, valamint j61 egyuttmukodik a PHP-vel es a bongeszokkel is. Ha az oldalunk Iatogatoi kulonbozo orszagokbol szarmaznak, akkor celszeru az UTF-8-at valasztani.

MySQl Server Instance Configuration

9. abra Az adatbazfsalnk alapertelmezett nyelvenek beallftasa

1. Telepites

13

Az ezt koveto ablakban beallithatjuk, hogy a MySQL elereset biztosit6 szolgaltatas nevet, Amennyiben mar korabban is volt MySQL telepitve a szamitogepre es az eltavolitasa nem volt teljesen sikeres, akkor celszeru a Service Name-t mas ertekre beallitani (peldaul: MySQL 4.1-re).

Az utols6 elotti erderni ablak eleresekor van elehetosegunk a root felhasznalo jelszavanak rnegvaltoztatasara, valamint nevtelen (annonymous) felhasznalo felvetelere, A jelsz6 rnegvaltoztatasat, minderikeppen vegezzuk el, es a nevtelen felhasznalo felvetelenek otletet vegkep vessuk el, mivel nagyon komoly biztonsagi kockazatai vannak. Az adatbazis felugyelete szempontjabol el kell gondolkodnunk, hogy a root felhasznalo szamara engedelyezzuk-e a tavoli belepest az adatbazis-kezelo rendszerbe. Ha kivalasztjuk a jelolonegyzetet, akkor a root felhasznalo csak localhost-kent, azaz helyi felhasznalokent tud bejelentkezni, masik [tavoli] szamttogeprol nem.

My5Ql Server Instance Configuration

10. abra A rot felhasznalo beallitasa

Elerkezve az utols6 ablakig es lenyomva az Execute gombot, sikeres telepites eseten a befejez6 ablak fogad bennunket, Amennyiben nem sikerult a telepites rnegfeleloen, olvassuk el a MySQL hivatalos oldalan talalhato dokumentaciot (a konyv irasakor aktualis verzi6 a CD mellekleten is megtalalhato).

Webes adatbazis-kezeles MySQL es PHP hasznalataval

14

MySQl Server Instance Configuration

11. abra A konflguractos varazslo mukodesenek befejezese

A MySQL szerverrel egyutt erdemes telepitenunk a MySQL Adminisztrator programot, amely az adatbazis-kezelonk reszletes beallitasat teszi lehetove, a telepules soran a MySQL Sys tern Tray Monitor automatikusan fog telepulni, amely segitsegevel konflguralhatjuk, indithatjuk es allithatjuk le az adatbazisunkat, illetve a programjainkat.

Lehetoseg van a MySQL manualis telepitesere is, abban az esetben, ha a Windows telepit6je nem tudta sikeresen telepiteni az adatbazis-kezelot. A telepites menetet a MySQL dokumentacio reszletesen tartalmazza. A manualis telepiteshez szukseges .zip kiterjesztesu allomanyt szinten letoltheto a hivatalos MySQL 01- dalarol,

1.1.2. MySQL telepftese Linux ala

A MySQL telepites Linux operacios rendszer hasznalata eseten sem okozhat kulonosebb problernat, akar bmaris allomanyokat, akar RPM-csomagokat hasznalunk.

A MySQL mukodesehez szukseges prograrnok a konyv irasakor:

• MySQL-server-4.1.12-1.i386.rprn

• MySQL-client-4.1.12-1.i386.rprn

A ket csomagon kivul meg szamos egyeb csomag is talalhato a letoltesi oldalon, amelyek egyeb funkci6k telepitesere szolgalnak, de ezekre egyen16re nem lesz szuksegunk,

A telepites els6 lepese a kiszolgalot futtat6 felhasznalo felveteIe, ami a mi esetunkben rnysql lesz. A felhasznalo felvetelere a root felhasznalo jogosult.

A felhasznalo felvetelenek menete:

1. Telepites

15

shell> su -root shell> groupadd mysql shell -g mysql mysql

A programok telepitese a:

shell> rpm -i MySQL-server-4.1.12-1.i386.rpm

shell> rpm -I MySQL-server-4.1.12-1.i386.rpm

parancsokkal tortenik. Valamennyi egyeb kiegeszitot ily m6don tudunk telepiteni. Az RPM elvegzi a megfelelo beallitasokat, hogy a kiszolgalo automatikusan induljon es alljon le a rendszerbe torteno belepeskor es az onnan val6 kilepeskor.

A forraskiadasok (btnans) telepiteserol reszletesen a MySQL dokumentacioban talalhatunk informaciotl

1.2.A PHP telepitese

A MySQL telepitesetol fUggetlenlil tudjuk telepiteni a PHP-t.

A PHP telepitesehez ellenben szuksegunk van webes kiszolgalo szoftver hatterben torteno futasara, ilyenek lehetnek a Microsoft lIS (Internet Information Services) vagy az Apache valamely verzioja.

1.2.1. A PHP telepitese lIS ala

A legt6bb Windows futtat6 szamitogepen web kiszolgalo prograrnkent az lIS van telepitve, amennyiben ezt nem tettuk meg a Vez e r Lopu L t Programok telepi t.e s e es t.o r Le s e parancsikonra kattintva es a Windows osszetev6k telepi t.e s e es el t avo l.I t.a s a kivalasztasa utan rnegtehetjuk.

Ha a PHP-t egy NT/2000/XP szerveren futo az lIS-nek 4-es vagy ujabb verziojahoz akarjuk telepiteni, azt ketfele m6don tehetjuk meg, CGI b i na r i akerit; (PHP 4 eseten php. exe, PHP 5 eseten pedig php-cgi . exe) vagy ISAPI modulkent.

Mindket esetben el kell inditanunk a Microsoft Management Console programot (lehet Internet Services Manager, a Windows NT 4.0 Option Pack agban vagy a Control Panel, majd Administrative Tools-ban Windows 2000/XP alatt). Majd az eger jobb gombjaval kattintva a Web szerver csom6pontra (ami valoszinuleg Defaul t Web Server-kent jelenik meg)' majd valasszuk ki a Properties meriupontot.

Ha a CGI b.i na r i s -f szeretnenk hasznalni, akkor:

16 Webes adatbazis-kezeles MySQL es PHP hasznalataval

• a Home Directory, virtual Directory, vagy Directory alatt valasszuk a Configuration gombot, majd lepjunk az App Mappings fulre.

• Klikkeljilnk az Add-ra, rnajd az Executable dobozba irjuk be: c: \php\php. exe (PHP 4 esetenl c: \php\php-cgi. exe (PHP 5 eseten), felteve, hogy a PHP-t a C: \php \ -be csomagoltuk ki.

• Az Extension dobozba irjuk be azt a fajlnev-kiterjesztest, amelyet a PHP szkriptekhez kivanunk rendelni. A Method exclusions-t hagyjuk uresen, a Script engine pedig kapcsoljuk be. Szinten bekapcsolhatjuk a check tha t file exists-et kisebb lassulas aran, Ebben az esetben az lIS (vagy PWS) megvizsgalja, hogy a szkript fajl letezike, ezzel ervenyesttest vegezne meg miel6tt a PHP-t elinditana. Ez azt jelenti, hogy ertelmes 404 stilusu hibat fog adni ahelyett, hogy CGI hibaval terjen vissza amiatt, hogy a PHP nem adott semmilyen kimenetet.

Az ut6bbi lepest ujra vegre kell hajtanunk minden tovabbi kiterjesztesre, amelyet szeretnenk a PHP szkriptekhez rendelni. A .php es a .phtml eleg altalanosak, viszont a .php3 is szukseges lehet a regebbi alkalmazasok futtatasahoz.

Allitsuk be megfelel6 vedelmet. Ez az Internet Service Manager-ben megvan, es ha az NT szerverunk NTFS fajlrendszert hasznal, adjunk futtatasi jogot I_USR_ szamara ara a konyvtarra ahol a php.exe / php-cgi.exe talalhato,

Ha IS API modulkent akarjuk hasznalni, akkor:

• Ha nem szeretnenk PHP segitsegevel HTTP Authentike c i o t; vegezni, hagyjuk ki ezt a lepest. Az ISAPI Filters alatt, hozzunk letre egy uj ISAPI filtert. A filter neve legyen PHP, majd adjuk meg a php4isapi. dll / phpSisapi. dll fajl utvonalat,

• A Home Directory alatt valasszuk a Configuration gombot. Hozzunk letre egy u] bejegyzest az Application Mappings-be. Hasznaljuk a php4 i sapi . dll / phpSisapi. dll fajl utvonalat az Executable-nel, irjuk . php-t a extension-hez, a 'Method exclusions'-t hagyjuk uresen, vegul a 'Script engine' -t kapcsoljuk be.

• Allitsuk le teljesen az IIS-t (NET STOP iisadmin)

• Inditsuk el ujra az IIS-t (NET START w3 svc)

1. Telepftes 17

Ha egy ido utan 100%-os CPU kihasznaltsagot eszlelunk, kapcsoljuk ki a Cache ISAPI Application lIS beallitast

1.2.2. A PHP telepitese Apache ala Windows kornyezetben

A masik nagyon elterjedt webkiszolgalo az Apache, amely szamos operacios rendszeren elerheto. Az Apache telepitese a www.apache.org oldalrol Ietoltheto telepitoprogram segitsegevel tortenhet. A PHP telepitese tortenhet az 1.3-as, valamint a 2.0-as verzi6ra is.

A telepites es beallitas folyamata nagyban megegyezik az Apache 1.3 valamint a PHP 5 telepitesenek Iepeseivel, Az Apache 1.3 verzi6t az Apache csoport tovabbra is fejleszti, de els6dleges platformkent az Apache 2 aktualis valtozatanak hasznalatat ajanljak.

A PHP telepitesehez szukseges a jelenleg legujabb verzioju tomoritett csomag letoltese (php-4. 3 .11-Win32. zip). A PHP eseteben nem az .msi kiterjesztesu telepito csomagot hasznaljuk, mert az CGI m6dban telepiti a PHP-t, valamint nem tartalmaz kulso kiegeszitoket. A tomoritett csomag ezzel szemben lehetove teszi a PHP szerver-rnodulkent torteno futtatasat is, amely jobb teljesitmenyt, valamint b6vitett funkcionalitast is nyujt, es raadasul szamos kulso kiegeszitot is tartalmaz.

A PHP telepiteset manualisan, az egyes muveleteket kezzel beallitva fogjuk vegeznt, hogya PHP es az Apache megfeleloen rnuk6dj6n egyutt:

• a tomoritett allomanyt a problemak elkerulese erdekeben csomagoljuk ki a c: \PHP4 konyvtarba

• valamennyi a dlls es a sapi konyvtarba levo allomanyt mozgassuk a PHP gyokerkonyvtaraba

• a php4ts. dll, illetve a php. ini allomanyokat tegyuk elerhetove az Apache szamara. Ez a Iegegyszerubben a PATH k6rnyezeti valtozok beallitasaval teheto meg, amely a Ve z e r Lopu I t Rendszer ablakaban a Specialis f u I kivalasztasaval erheto el. Nines mas dolgunk, mint a PATH k6rnyezeti valtozoba begepelnt az utvonalat es jovahagyni a modositast.

18

Webes adatbazis-kezeles MySQL es PHP hasznalataval

12. abra Az elerest tit beallrtasa

• Ezutan a php. ini-recommended nevu konflguracios fajlrol keszitsunk egy masolatot a sajat konyvtaraba, majd nevezzuk at php. ini-re es nyissunk meg egy szerkeszt6 programmal. Keressuk meg az extension_dir = " . /" sort, es az idezojelek koze masoljuk be a kiegeszit6k eleresi utvonalat, ami gyakorlatilag az az utvonal ahova a PHP-t kicsomagoltuk, plusz egy /extensions (estunkben peldaul: "C:/PHP4/extensions/". Ha az eleresi utvonal szokozoket is tartalmaz, nagyon fontos az idezojelek hasznalatal Mentsuk el az allomanyt:

• Ismet erdernes a komyezeti valtozo beallitasanak lehetoseget valasztani a php. ini elerhetosegenek megadasara, ahelyett, hogy mash ova helyeznenk az ini allornanyt. NTFS fajlrendszer eseten ellenorizzuk, hogy a webkiszolgalonak legyen olvasasi joga a php.ini allomanyral

• Ezutan mar csak egyetlen lepesunk marad, az Apache httpd.conf konflguracios fajljariak ujboli szerkesztese. Az allornany legvegere masoljuk be az alabbi ket sort:

LoadModule php4_ffiodule C:/PHP4/php4apache2.dll" AddType application/x-httpd-php .php .php4 .php3

• Ertelemszeruen az els6 sorban a megfelel6re helyettesitve az eleresi utvonalatl Apache 1.3.x eseten a php4-

1. Telepites

19

apache. dll fajlt kell betolteni a php4apache2 . dll helyett.

• Meg egy dolgot erdernes szerkesztem1nk: a DirectoryIndex felsorolas elemei koze (praktikusan elso elemkent) vegyuk fel az index. php-t. Ez a beallitas azt szabalyozza, hogy egy konyvtar lekeresekor mely fajlt adja vissza alapertelmezettkent az Apache. Ezzel a beallitassal nem kell majd beirni a bongeszobe hogy http://localhost/index.php, hiszen a http://localhost is az index.php-tjeleniti majd meg.

• Ezzel kesz is a telepites! Nines mas dolgunk, mint ujra inditani az Apache-t.

1.2.3. PHP t.elepftese Linux kornyezetben

A Linux k6myezetbe a megszokott m6don karakteres uzernm6dban tudjuk telepiteni, mind az Apache, mind a PHP verziokat. Az Apache 2-ben a PHP4 verziojaval szemben fellepo inkompatibilitas miatt mindenkepen toltsuk le az Apache es a PHP legfrissebb verzi6it, amelyek mar egyutt tudnak mukodni. A telepites menete soran eloszor telepiteni fogjuk a legfrissebb Apache verzi6t, majd a PHP4 verzi6t:

• gzip -d httpd-2_O_S4.tar.gz

• tar xvf httpd-2_O_S4.tar

• gunzip php-4.3.11.tar.gz

• tar -xvf php-4.3.11.tar

• cd httpd-2_O_S4

• ./configure --enable-so

• make

• make install

Ezen utasitas sor segitsegevel az Apache 2.0.54 rendelkezesedre all a /usr !local / apache2 konyvtarban, modul betoltes tarnogatassal, es a standard MPM allornanyokkal. A telepites tesztelesehez hasznalhatjuk a normalis az Apache szerver elinditasara, azaz:

/usr/local/apache2/bin/apachectl start

A kovetkezo lepes a PHP4 telepitese:

allitsuk le az Apache futasat, hogy folytathassuk a PHP konfiguralasaval: /usr/local/apache2/bin/apachectl stop.

• cd .. /php-4 .3.11 itt konfiguralnunk kell a PHP-t. Itt kell testre szabnunk a PHP-t kulonfele opci6kkal, mint pl. rnilyen kiterjesztesek legyenek bekapcsolva. Hajtsunk vegre egy . /configure --help parancsot, hogy megkapjuk a

20 Webes adatbazis-kezeles MySQL es PHP hasznalataval

hasznalhato opci6k listajat. Az apxs utvonala kulonbozhet, valojaban elofordulhat, hogy a binaris neve apxs2.

• ./configure --withapxs2=/usr/local/apache2/bin/apxs --with-mysql

• make

• make install

Ha a conf igure opci6kat telepites utan szeretnenk megvaltoztatni, csak az utols6 harorn parancsot kell ujra kiadnunk. Az uj modul betoltesehez, csak ujra kell inditanunk az Apache-t. Az Apache ujraforditasa nem szukseges.

Figyeljunk arra, hogy alapesetben a 'make install' a PEAR-t, kulonbozo PHP eszkozoket, mint pl. phpize, a PHP CLI-t es egyebeket is telepit.

A php.ini allomany beallitasa:

• cp php. ini-dist /usr !local / lib/php. ini PHP opci6k beallitasahoz szerkesszuk az .ini fajlt.

Ha a php. ini-recommended fajlt valasztjuk, ne felejtsuk el elolvasni a valtoztatasok listajat, mivel az befolyasolhatja a PHP rnukodeset.

M6dositsuk a httpd. conf allomanyt ugy, hogy a PHP modult toltse be. A LoadModule jobb oldalan szerepl6 utvonal a rendszereden levo PHP modul utvonala kelllegyen. A fenti make ins tall parancs mar el kellett vegezze ezt helyettunk, de jobb ha megbizonyosodunk r6la.

PHP 4 eseten:

• LoadModule php4_module libexec/libphp4.so PHP 5 eseten:

LoadModule phpS_module libexec/libphpS.so

Meg kell mondani az Apache-nak, hogy bizonyos kiterjesztessel rendelkez6 fajlokat a PHP szerint ertelmezzen. Peldaul mondjuk meg az Apache-nak, hogy a . php fajlokat PHP-vel interpretalja. Tobb kiterjesztest ugy adhatunk meg, hogy egyszeruen szokozzel valasztjuk el 6ket. Peldakeppen itt meg a .phtml-t adjuk meg.

AddType application/x-httpd-php .php .phtml

Eleg nepszeru, hogy a . phps kiterjesztest ugy allitjak be, hogy a szinezett PHP-t mutassa, ez igy erheto el:

AddType application/x-httpd-php-source .phps

Hasznaljuk a normalis eljarast az Apache szerver elinditasara, azaz:

/usr/local/apache2/bin/apachectl start

Ezzel minden keszen all arra, hogy megvizsgaljuk, hogy muk6dik a MySQL es a PHP.

2. Az adatbazis-kezeles alapjai

21

2.Az adatbazls-kezeles alapjai

2.1. Az adatbazis

2.1.1. Egy kis torterielem

Az elet szarnos teruleten talalhatunk olyan gyujtemenyeket, amelyek bizonyos szempontok szerint lettek osszevalogatva. Ezeket a gyujtemenyeket a sz6 klasszikus ertelmeben mar adatbazisnak tekinthetjuk, hiszen a valo vilag egy j6I meghatarozott reszet gyujtottuk ossze (absztrakci6) es a gyu.jtemeny valarnilyen rendszer szerint rendezve van. Ilyen gyu.jtemeny egy konyvtar, ahol nagymennyisegu konyvet talalhatunk a rnuvek fajtaja, valamint a szerz6k neve szerint rendezve. De ilyen adatbazis egy iroasztal, ahol valarnilyen sajatsagos rendszer szerint hevernek az iratok. Ezek a papir alapu adatbazisok kezeles es feldolgozasa nagy mennyisegu ad at eseten mar eleg nehezkes es sok id6t igenybevevo feladat volt, nem veletlenul a szamitogepek szeleskoru elterjedesekor ezen ket funkei6 valt a legelterjedtebb muvelette.

A szamitcgepek es az azokhoz kapcsolodo magneses tarolok megjeleneset kovetoen hamarosan egy szuk kor szamara elerhet6ek lettek az egyetemek es a kutatointezetek altal kifejlesztett kulonbozo adatfeldolgoz6 rendszerek. Ezek a rendszerek a '60-as evek masodik feleig jobbara esak egyedi allomanyokat voltak kepesek kezelni, amely azt eredmenyezte, hogy:

• egy adott programmal esak adott adatallomanyt lehetet kezelni,

• egy adatallornanyt esak egy adott kezel6programmal lehet

elerni, erniatt meg kell tanulni az adott kezel6 nyelvet,

• gyakorlatilag nines adatvedelern,

• az adatokhoz egyidoben torteno hozzaferes nem megoldott. Ezen a problemak megoldasara tett javaslatot 1971-ben a

Codasyl-on (Conference of Data Systems Languages, vagyis az adatke-

22

Webes adatbazis-kezeles MySQL es PHP hasznalataval

ze16 rendszerek nyelveinek konferenciaja) beluli DTBG (Data Base Task Group) csoport altal keszitett jelentes, amelytol tenylegesen szarnitjuk az adatbazis-kezeles fogalmat, A jelentes javaslata szerint a jovo adatbaziskezelo-rendszeretnek a kovetkezo tulajdonsagokkal kell rendelkeznie:

• egy adatbazis-kezelo szoftvernek tobb osszetett Iogtkai adatrendszereket kell tudni kezelnie egyszerre.

• a redundancia feldolgozas gyorsitasa erdekeben rnegenge dett akkor, ha kezben lehet tartani.

• konkurens hozzaferest kell biztositania az adatbazts-kezelo rendszernek.

• tobbfele eleresi m6dot kell tamogatnia egy id6ben.

• tamogasson tobbfele programozasi nyelvet. (Lehessen programozni)

• tamogassa az emberi Iogikat szemben a gepivel.

• a jogosultsag szernpontjabol lenyeges, hogy egy adatmodell szemleletet valositson meg - nezeteket lehessen kezelni. (Egy felhasznalo csoport csak bizonyos adatokhoz ferjen hozza.)

• visszaallithato legyen - ha serul az adat (inkonzisztens allapotba kerul a rendszer), akkor azt lehessen felisrnerni, es helyreallitani.

Adat-program fuggetlenseg logikai es fizikai szinten.

• logtkai szinten: Ha az adatok szerkezete megvaltozik, ne kelljen a program szerkezetet megvaltoztatni.

• fizikai szinten: Egy adott program tudja feldolgozni az adathalmazt fuggetlenul attol, hogy hol van fizikailag.

2.1.2. Relacios adatmodell

A kulonfele adatbazis-kezelo rendszerek kozul a XX. szazad vegere a relacios adatbazis-rendszerek szinte egyeduralkodova valtak a vilagban, szinte teljesen kiszoritva a piacr61 a kulonbozo halos- es hierarchikus adatmodelleken alapu16 adatbazisrendszereket. A legelterjedtebb relacios adatbazis-kezelo rendszerek az Oracle, a MySQL, a SYSBAS, INGRES, MS SQL, INFORMIX.

A relacios adatbazis-kezeles alapjait meg 1971-ben a Codd altaI megalkotott relacios adatmodell elrneletet alapozta meg, amelynek hatasara letrejottek a relacios adatbaziskezelorendszerek. A modell pontos leirasa bonyolult matematikai modszereket tortent meg, melynek reszletei megtalalhatoak az adatbazis-kezelessel rnelyebben foglalkoz6 muvekben.

Az adatbazis-kezelesben a '70-es evek vegetol elesen szetvalt a logikai es a fizikai modell, melynek kovetkezteben szamitogep rendszer fUggetlen m6don lehet adatbazis sernakat kesziteni. A

2. Az adatbazis-kezeles alapjai 23 szetvalas kovetkezteben termeszetesen a relacios adatbaziskezelesben is elkuloriult ez a ket modellezesi szint.

Logikai szinten a relaciok tablakban jelennek meg. Egyadatbazison belul a tablaknak egyedi nevuk van. A tablak oszlopait attrfbutumoknak (oszlopoknak) nevezzuk. Az attributumok sorrendje kotott. Az attributumok ertekeit egy ugynevezett attributum-halmazbol veheti fel es ertekeinek eleminek kell lenni. A tabla soraiban helyezkednek el a rekordok. A modell nem engedi meg, hogy ket rekord megegyezzen! Egy rekord adott attributumanak erteket a rnezo ertekenek nevezzuk. A tabla sorait tetszolegesen rnegcserelhetjuk, a sorok szarna elmeletileg nem kotott, de a szamitogepes hattertarolo nagysaga, valamint az adatbaziskezel6-rendszer fajtaja azert hatart szabhat. Az adatbazis tablakb61, valamint a tablak kozotti kapcsolatbol epul fel. A kapcsolat ez egyik tabla elodleges kulcsa es a masik tabla kulso ku1csa kozott jon lere, megpedig azzal a megszoritassal, hogy a kiilso kulcs valamennyi ertekenek szerepelnie kell az elsodleges kulcsok kozott, vagy NULL erteku kell lennie. A kulso ku1cs tenyleges hasznalata MySQL 5-6s verziojaban lesz elerheto valamennyi tablatipus eseteben, jelenleg azonban csak az InnoDB tablatipus kezeli, bar a tobbi tablatipusnal is megadhat6 csak az adatbaziskezelo-rendszer nem foglalkozik vele.

A rekordok (sorok) egyediseget az elsodleges kulcs biztositja, mely akar allhat egy attributumbol (pl.: sorszam) is, vagy allhat tobb attributumbol (pI.: nev, anyja neve, szuletesi id6) is, a lenyeg az, hogy legyen. Az els6dleges ku1cs nem vehet fel NULL erteket sem.

Fizikai szinten az adatbazis valamilyen allornanyszerkezetben van tarolva, melynek kezelese az operacios rendszer feladata.

2.1.3. Az adatbcizis logikai tervezese

A szamitogepen tarolni kivant adatbazisunk elkeszitesenek ez az elsa es talan a legfontosabb resze. Fontossagat az adja, hogy az elk6vetkezend6kben megtervezett adatbazisunkhoz kell majd megimi a kulonbozo programokat, ebb61 az adatbazisbol kell majd kinyernunk ertekes informaciokat es nem utols6 sorban ezt az adatbazist kell karbantartanunk.

A cimben levo .Iogtkat tervezes" azt jelenti, hogy ezen muvelet vegrehajtasahoz nem kell szamitogep es az elkeszult adatbazisterv barmilyen relacios adatbazis-kezelo program segitsegevel megvalosithato, fuggetlenul attol, hogy milyen operacios rendszert hasznalunk. Ennel fogva a tervezes soran nem kell odafi-

24

Webes adatbazis-kezeles MySQL es PHP hasznalataval

gyelnunk a kulonbozo szamitogep-rendszerek altal megk6vetelt szabalyok betartasara.

A logikai tervezes fo feladata a redundancia. azaz egy adat tobb helyen torteno tarolasanak minirnalis szintre csokkentese. A redundancia megszuntetese elsosorban a karbantartasi muveletek soran nyujt segitseget es feltetele annak. hogy az adatbazisunk ne keruljon inkonzisztens allapotba, melynek eredmenyekent egy lekerdezes soran hamis eredrnenyeket kaphatunk. A redundancia megszuntetesenek m6dja a normalizalas. A normalizalas soran celszeru azt a harmadik normalforma elereseig folytatni.

A normalizalas folyamatat egy peldan keresztul fogjuk megvizsgalni. A feladat egy szamlazasi rendszer kialakitasa lesz.

A szamla elkesziteshez szukseges adatok a k6vetkez6k:

• rerideles szama

• datum

• vevonev
• vev6k6d
• vev6cim
• szamlaszarn
• cikkszam
• megnevezes
• mennytsegi egyseg
• egysegar
• mennyiseg
• hatarido A szukseges adatokat ugy celszeru osszeallitani, hogy szerepeljen benne az osszes olyan ad at, amely a kimenetnel fontos lehet, viszont ne szerepeljenek benne olyan adatok, amelyek valamely attributumbol szarmaztathatok {pI.: az egysegarbol es a mennyisegbol kiszamolhato a szamlan szerepl6 termek ara, ezert nem kell az adatbazisban tarolnunk azt. Fontos. hogya sema kialakitasanal a szemunk el6tt a minel egyszerubb es hatekonyabb lekerdezes lebegjen.

Latszolag ez egy nagyon egyszeru feladatnak tunik, hiszen egy tabla letrehozasaval megoldhat6 lenne a problema. csakhogy a relacios adatbazis elrneletevel ellentetes, hogy egy attributum ertek ne elemi legyen, marpedig ha egy szamlan tobb cikk is szerepelhet. vagy egy cikk tobb rendelesnek a resze lehet, akkor ez a feltetel mar nem teljesul.

2. Az adatbazis-kezeles alapjai

25

rendeles szarna datum

vev6nev

vev6k6d

vev6cim szamlaszarn hatartdo

cikkszarn megnevezes mennytsegi egyseg egysegar mennyiseg

Megjegyzes: Az alahuzas a tabla els6dleges kulcsat jeloli, a szurke hatterben a nagybetus sz6veg a tabla nevet jelzi.

Ha egy tablaban az attributumok ertekei valamennyi esetben elerniek, akkor azt mondjuk. hogy az adatbazis serna INF (els6 normalformaju) .

Ebben az esetben a cikkszarn, a megnevezes, a rnerinyisegi egyseg, az egysegar, a mennyiseg attributurnok helyen tobb ertek is szerepelhet. abban az esetben. ha tobb tetel kerulne megvasarlasra.

E problema megoldasa nagyon egyszeru, egy ujabb tablazattal kell bovitenunk az adatbazis sernankat, hogy valamennyi ertek egyedi legyen. Ennek legegyszerubb modja, hogy az Ismetlodo attributumokat egy kulon tablaba tesszuk.

rendeles szama Datum Vev6nev Vev6k6d Vev6cim Szamlaszam Hatarido

Lathato, hogy a megvalositas soran az eredeti tablankbol ket tabla keletkezett. megpedig ugy, hogy az ismetlodo attributurn ertekekbol kulon tablat keszitettunk. Az ujorman keszitett tablankban a rendeles szam, valamint a cikkszam attributumok (amelyek a TItTEL tabla osszetett els6dleges ku1csai) egyutt biztositjak, hogy az eredeti tablaban levo nem elemi attributumok visszaallithatoak legyenek adatvesztes nelkul,

rendeles szarn

cikkszam

rnegnevezes mennytsegi egyseg egysegar mennyiseg

26 Webes adatbazis-kezeles MySQL es PHP hasznalataval

Abban az esetben, ha az els6dleges kulcs egyszeru, akkor az adatbazis sema 2 NF -ben van, ha nem nekunk kell megszuntetni a reszleges fiiggosegeket. Reszleges fugg6seg akkor all fenn, ha az osszetett kulcs egyik tagjatol fUgg valamelyik leiro attnbutum.

Peldankban, a TItTEL tablaban a cikkszarn attributumtol fUgg a rnegnevezes, a rnennyisegt egyseg es az egysegar attributumok is.

A reszleges fUgg6seget, ugy tudjuk megszuntetni, hogy megszuritetjuk a tablak egymasba agyazasat es ezzel u] tablakat hozunk letre. Termeszetesen az adatbazis sernanknak ebben az esetben is 1 NF-ben is kelliennie.

rendeles szama datum

vev6nev vev6kod vevocim szamlaszam

hatarido

A muvelet soran Ietrehoztunk egy u] tablat, megpedig azert, hogy a TETEL tablaban a cikkszam elsodleges kulcs resz altal okozott reszleges fuggest feloldjuk, es ennek a legegyszerubb modja, hogy a fUgg6 attributumokat kulon tablaba helyeztuk es a tabla elsodleges kulcsanak a TETEL tabla cikkszam attributumat adtuk meg.

A kovetkezo lepes, hogy a 2 NF-ben levo sernankat 3 NF-ra bontjuk, azaz megszuntetjuk benne a tranzitiv fUgg6seget.

A tranzitiv fiiggoseg akkor all fenn, ha az egyik leiro attributumtol fUgg egy masik leiro attributum. Ha egy serna 2 NF-ben van es nines benne tranzitiv fUgg6seg, akkor 3 NF -ben is van.

A RENDELES tablaban a vevokod meghatarozza a vev6neve, a vevo eime, valamint a szamlaszam attributumot.

E szmten uj tablak letrehozasaval oldhato meg, megpedlg, ugy hogy az egymastol fUgg6 attributumokat kierneljuk a tablabol es tetszoleges, de egyedi attributumat kijeloljuk elsodleges kulcsnak.

rendeles szam cikkszam mennyiseg

cikkszam

megnevezes rnermyisegi egyseg egysegar

rendeles szarna datum

vev6kod hatarido

rendeles szam cikkszam mennytseg

cikkszarn rnegnevezes mennyisegi egyseg egysegar

2. Az adatbazis-kezeles alapjai

27

vev6k6d vev6nev vev6cim szamlaszam

Mivel a RENDELES tablaban a vev6k6d meghatarozta a tobbi vev6 adataival kapesolatos attributumot, ezert azokat kierneltuk egy kulon tablaba es a vev6k6d attributumot valasztottuk elsodleges ku1csnak. Termeszetesen barrnelyik mas attributurnot is valaszthattuk volna elsodleges ku1csnak, amely egyertelmuen azonositja az adott rekordot (pI.: szamlaszam, ha nines ket ugyanolyan szamlaszarnu vevo vagy a vevonev, ha nines ket ugyanolyan nevu cegl, de mi a legegyszerubb megoldast valasztottuk egy rovid numerikus erteket (erre a fogalornra meg kesobb visszaterunk). A muvelettel a RENDELES-2 tablaban levo vev6- k6d kulso ku1cs lett.

Nagyon fontos dolog, hogy a relacios adatmodell nem kezeli az ugynevezett N:M kapesolatot, amelyet az adatbazis serna 3 NF-ba hozasaval a norrnalizalas automatikusan megszuntet. Az N:M kapesolat a gyakorlatban azt jelenti, hogy egy rendelesnel tobb cikket is rendelhetunk es egy eikk tobb reridelesben is szerepelhet a szamlainkon. Az N:M tipusu kapesolat a normalizalas soran atalakul 2 darab l:N tipusu kapcsolatta.

A relacios adatbazis-kezelok megkovetelik INF sernat, nem normalizalt tablazatokat nem tudnak kezelni.

A normalizalas tovabb folytathat6, hiszen leteznek 4 NF, 5 NF ... normalformak is, de a gyakorlatban rnagasabb szintu normalformakkal mar nem talalkozhatunk,

2.1.4. Az adatbcizis fizikai tervezese

Ez az a pont, ahol e16 vehetjuk a szamitogepet. es megtekinthetjuk az adatbazis-kezelo rendszerunk dokumentaciojat, ugyanis a fizikai tervezes nem jelent mast, mint meghatarozni, hogy az egyes tablakban szereplo attributumok (oszlopok vagy mez6k) milyen tulajdonsaggal rendelkezzenek. Az e16z6 peldan vegighaladva nezzuk meg milyen lehetosegetnk vannak:

28

Webes adatbazis-kezeles MySQL es PHP hasznalataval

Attributurn

::::i iWJ\@:lil
" 1
",
vev6k6d numerikus 5 szarnjegy elsodleges kulcs
vevonev szove,!!; 30 karakter kulso kulcs
vev6cim szoveg 50 karakter
szamlaszam numerikus 24 szamjezy ,imq::mnl@
rendeles szam numerikus 6 szarnjegy osszetett els6dleges
cikkszam numerikus 8 szamjegy kulcs
mennytseg numerikus 4 szamjegy »'N" IIi' iiilllIm:!:!::!il
ill ' , :Wimi
cikkszarn numerikus 8 szamjegy elsodleges kulcs
megnevezes szove,!!; 15 karakter
mennyisegt szoveg 5 karakter
egyseg
eavseaar numerikus 6 szarnjezv Az attnbutum tipusanak meghatarozasa soran elsosorban a tapasztalatunkra hagyatkozhatunk. Azonban van nehany iratlan szabaly, amit erdernes betartanunk:

• az elsodleges ku1csokat celszeru numerikus tipusura tervezni, mivel a legtobb adatbazis-kezelo rendszer ismeri az automatikus ertekadast:

• ha egy ertekkel szarnitasi rnuveleteket akarunk vegezni, akkor annak tipusa mindig legyen numerikus;

• a kulso ku1csoknak, olyan tipusunak es meretunek kell Ienniuk. mint a hozzajuk tartoz6 elsodleges ku1csoknak;

• rnindig akkora erteket valasszunk az attributum nagysaganak, hogy kesobb mar ne kelljen megnovelni, az sem baj, ha egy kicsit tulmeretezzuk az ertekeiriket (ha van eleg tarolokapacitasunk):

• ha datum erteket akarunk tarolni, a kesobbi muvelet vegrehajtasok miatt celszeru datum tipust megadni;

• olyan attributumoknal, ahol az ertek viszonylag allando (pl.:egy terrnek eseteben az AFAkulcs) celszeru azt alapertelmezettkerit megadni;

2. Az adatbazis-kezeles alapjai

29

2.2. A MySQL alapjai

Ebben az alfejezetben betekintest nyerhetunk az egyik legnepszerubb adatbazis-kezelo szoftver mukodesebe. Az adatbaziskezel6 hasznalatahoz szukseges, hogy a MySQL fusson a szamitogepunkon.

Az alfejezetben terrneszetesen csak az alapvet6 -de a hasznalat saran nelkulozhetetlen- SQL utasitasokkal ismerkedunk meg, reszletesebb Informaciot, valamint a MySQL program teIjes koru leirasat a www.mysql.com/doc oldalon talalhatjuk meg.

Az SQL nyelv az angel nyelvtan alapjan kerult kialakitasra, mert a korabbi tervek szerint ezt a nyelvet nem szamitastechnikai szakemberek reszere fejlesztettek ki. Ennek kovetkezteben hasznalata egyszeru, barki szamara konnyen elsajatithato.

Az SQL nyelv nem erzekeny a kis es a nagybetu kulonbsegere, ami azt eredrnenyezi, hogy ugyanazt jelentik a create, a CREATE, a Create, a CrEaTe parancsok. A jobb attekinthetoseg (es a szokasok) miatt azonban a kesobbiekben a parancsokat csupa nagybetuvel a tobbi kiegeszito szoveget kisbetuvel lathatjuk.

Az adatbazisunkon vegzett muveletek vegrehajtasanak tobb m6dja is letezik, mi latszolag a nehezebben hasznalhato konzoIon keresztuli uzemmodot fogjuk megismerni. Ennek az uzemm6dnak azonban van egy ortasi el6nye, nem adatbaziskezelorendszer-fUgg6. A megismert utasitasok ugyanugy mukodnek mas relacios adatbazis-kezelo prograrnoknal, mint a MySQL-ben. A masodik Iatszolag egyszeru megoldas, hogy az Internetrol megfelelo kezel6programot (pl.: a MySQL Query Browser) tolthetunk le es telepithetunk, ilyen programok talalhatoak a MySQL hivatalos oldalan is.

Az adatbazis-kezelo konzoljaba torteno belepesre helyi adatbazis eseten kovetkezokeppen tortenik:

mysql -u root -p

ahol a -u parameterrel allithatjuk be, ha nem az aktualis felhasznaloi nevvel szeretnenk belepni az adatbazisba

a root a belepeshez hasznalt felhasznalonev (nem azonos a Unix/Linux operacios rendszer altal hasznalt root felhasznaloval)

a -p, jelenti, hogy jelszot is meg kivanunk adni, ebben az esetben a k6vetkez6 sorban megjelenik a jelszo bekero sor. Ha a -p utan folyamatosan beirjuk a felhaszna- 16hoz tartoz6 jelsz6t, akkor is belepheturik az adatbazisba (pl.: -ppass, ahol a pass a jelszo)

mysql> SHOW databases;

+--------------+

I Database

+--------------+

I mysql I test

+--------------+

2 rows in set (0.00 sec)

30 Webes adatbazis-kezeles MySQL es PHP hasznalataval

• amennyiben az adatbazis valamilyen kiszolgalon erheto el (nem a sajat szamitogepunkon, ami a localhost), akkor a felhasznaloi nev utan meg kell adnunk a -h pararnetert es meg kell adnunk a host elereset is (pl.: mysql -u root -h mysql.sajat.hu -p)

Ha a fenti paranccsal, vagy annak valamelyik ktegeszitesevel sikerul belepni az adatbazisba, akkor az udvozlo szoveg utan megjelenik a konzolon mysql> prompt. Az elkovetkezendo parancsokat ezen prompt utan fogjuk begepelni.

Az elkovetkezendo nehany oldalon megtanuljuk, mit es hogyan tudunk megoldani a MySQL segitsegevel.

2.2.1. Az Adatbaztsokkal kapcsolatos miiveletek

A MySQL adatbaziskezelo-rendszer egy id6ben tobb adatbazist tud kezelni, ezen adatbazisok lekerdezesehez a

SHOW databases;

parancsot hasznalhatjuk:

Lathatjuk, hogy a lekerdezes eredmenye 2 sor (2 rows), melyet a rendszer 0.00 masodperc alatt keszitett el.

Ahhoz, hogy mi magunk is tudjunk sajat alkalmazasokat kesziteni szuksegunk lehet adatbazis letrehozasara, ezt a

CREATEDATABASEadatb~zisn~~

paranccsal tudjuk megtenni:

mysql> CREATE DATABASE temp;

Query OK, 1 row affected (0.02 sec)

Az adatbazisok kozotti valtas a

2. Az adatbazis-kezeles alapjai

31

USE ada t.be z i etiev;

paranccsal tortenik, a kivalasztott adatbazist tekintjuk aktualis adatbazisnak:

Az adatbazis torlesere a DROP DATABASE adet.be z i enev; parancsot hasznaljuk:

mysql> DROP DATABASE temp;

Query OK, 0 rows affected (0.28 sec)

Kezdjuk el megval6sitani a Iogikai szinten mar letezo sernankat, keszitsunk bel6le konkret adatbazist, amelyhez kesobbiekben megirhatjuk majd az els6 igaz! alkalmazasunkat, Fontos dolog, hogy a rendszer altal hasznalt nevekben ne legyenek ekezetes karakterek, az adatbazisnevek ne legyenek a MySQL fenntartott szavai es lehet6leg ne legyenek tul hosszuakl!l A Unix az adatbazisnevek tekinteteben erzekeny a kis es a nagy betu kulonbsegere.

Hozzuk letre a szarnla adatbazist, ellenorizzuk, hogy sikerult-e a muvelet, illetve valasszuk ki aktualis adatbazissal

2.2.2. A tablakkal kapcsolatos adminisztrcici6s miiveletek

Hasonl6an az adatbazis lekerdezesehez, a tablakat is Ie tudjuk kerdezni egy adatbazisban, ehhez nem kell mast tenni, mint kivalasztjuk, rnely adatbazis tablait szeretnenk megtudni es kiadjuk a

SHOW tables; parancsot:

32.

Webes adatbazis-kezeles MySQL es PHP hasznalataval

Az ures eredmenyu lekerdezesre a magyarazat, hogy legutoljara a szamla adatbazis lett aktualissa teve es annak nem hoztunk letre meg egy tablajat sem.

A tabla letrehozasa az egyik legbonyolultabb feladat az ad atbazisunk elkesziteseben, mert ez az a lepes, ahol meg kell adnunk valamennyi tabla, valamennyi attributumanak, valamennyi tulajdonsagat. Valamennyi lehetseges parameter felsorolasa nelkul a tabla letrehozasat a

CREATE TABLE tablanev (attributumnev tipus [attributum definici6] [, et t.r i but.umnev tipus [at.t r i biit.um definici6] ... ]);

paranccsal tudjuk vegrehajtani. Ez a latszolag bonyolult szintaxis a valosagban nemileg egyszerubbe valik, A tablak letrehozasakor meg szamos egyeb opci6t megadhatunk, de azokra a mindennapi eletben nem lesz szuksegunk. Ezen opciokrol a MySQL hivatalos kezikonyveben olvashatunk. Nezzunk ket peldat, hogy mukodik a tabla letrehozasa a gyakorlatban:

mysql> CREATE TABLE rendeles (

->rendeles_id int unsigned not null primary key

->auto_increment,

->datum date,

->vevo_id int unsigned not null,

->hatar_ido date);

Query OK, 0 rows affected (0.09 sec)

mysql> CREATE TABLE cikk ( ->cikk_id int unsigned not null,

->megnevezes varchar(lS) ,

->mennyisegi_egyseg varchar(S) default 'db',

->egysegar int,

->primary key (cikk_id),

->index (megnevezes))

->type=innodb;

Query OK, 0 rows affected (0.28 sec)

Vlzsgaljuk meg egy kicsit reszletesebben mi mire j6:

• az attributum neve (pI.: rendeles_id) utani tipus (pI.: in t.) hatarozza meg, hogy az adott attributurn milyen ertekeket vehet fel (a kulonbozo tipusokat a kovetkezo tablazatban tanulmanyozhatjuk reszletezvel

• az auto_increment segitsegevel elerhetjuk, hogy az adott attributurn erteke mindig eggyel nojon, ezt a pararnetert csak abban az esetben celszeru megadni, ha az azonosit6 felepitese nem valamilyen rendszer szerint tortenik (pI.: cikkszarn eseteben elofordulhat, hogy az

2. Az adatbazis-kezeles alapjai

33

azonosito els6 harorn szarnjegye meghatarozza a termek faj taj at)

• az unsigned parameter megadasa eseten a mez6 felvehet6 erteke csak pozitiv (el6jel nelkulil lehet

• not null eseten az adott attributurnot mindig ki kell tolteni, nem lehet uresen hagyni

• a primary key jelzi azt, hogy az ad ott attributum elsodleges kulcs (ketfelekeppen is megadhat6)

• megadhatunk alapertelmezett erteket, abban az esetben ha az attributurn erteke az esetek jelentos reszebe felvesz egy erteket (default I db ')

• bizonyos korulmenyek kozott celszeru a tabla tipusat (jelenleg InnoDB-re) is beallitani, mert a kulonbozo tablatipusok mas-mas muveleteket engedelyeznek

• a tabla bizonyos attributurnaira letrehozhatunk indextablat, amely segitsegevel lenyegesen felgyorsulhat az adatbazisban a kereses. Celszeru minden olyan attributumra letrehozni indexet, amely egy lekerdezesben a szuro feltetelek kozott szerepel. Kis meretu adatbazis eseten nem celszeru indextabla keszitese, mivel az csak noveli a karbantartas idejet es elofordulhat, hogy lassabbak lesznek tole a Iekerdezeseink,

• varhatoan a kovetkezo MySQL verzi6kban valamennyi tablatipusban elerheto lesz az idegen kulcs (foreign key) beallitasanak lehetosege, jelenleg ez csak az InnoDB tipusu tablaban hasznalhato,

Miel6tt tovabbmennenk a kovetkezo parancs ismertetesere nezzuk meg milyen lehetoseget kinal a MySQL az attributurnaink tipusanak beallitasara. Az egyszeruseg kedveert egy tablazaton keresztul tanulmanyozhatjuk a leggyakrabban hasznalt tipusokat (tovabbl tipusokat es azok Ieirasait megtalalhatjuk a MySQL Referencia Konyvben):

bigint

a legnagyobb egesz tipus (tarolhat6 ertektartomany -1019- -1019 vagy 0-1020)

pontossag + 2bajt lebeg6pontos ertekek tarolasara hasznalatok, ahol a pontossag is fontos pl.: dec (10,2)

Dec

34

Webes adatbazis-kezeles MySQL es PHP hasznalataval

double, real 8 bajt dupla pontossagu lebeg6-
pontos szam ( t a r o Lhat;o
ertektartomany --1,8E+308
es -2,2E-308 k6z6tti nega-
tiv szamok, nulla es 2,2E-
308 1,8E308 k6z6tti pozi-
tiv szamok)
float 4 bajt egyszeres pontossagu lebe-
g6pontos szam ( t.ar o Lha to
ertektartomany --3,4E+38
es -1,18E-38 k6z6tti nega-
tiv szamok, nulla, 1,18E-
38 es 3,4E+38 koz o t t i
pozitiv szamok
int, integer 4 bajt -2 147 483 648 es
2147483647 k6z6tti egesz
szamok
smallint 2 bajt - 32 768 es 32 767 koz ot.t i
egesz szamok (e16jel nel-
klil 0 es 65 535 k6z6tti
szam)
Sz6veges adattipusok
char (me r e t ) 1 - 255 r6gzitett hosszusagu szo-
veges mez6, akkor haszna-
lando, ha az a t t r i bu t.um
ertekenek hossza allando
text 0 - 65 535 bajt sz6veges ertekek tarolasa
hasznalatos
varchar(meret) 1 - 255 bajt valtozo hosszusagu sz6veg
tarolasara (maximalis
hossza 255 karakter le-
het) r akkor hasznalhato,
ha az attributum ertekenek
hossza valtozo. Egy karak-
ter tarolasa eseten a char
adattipus hasznalata java-
solt.
Datum adattipusok
Date 3 bajt Gergely-naptar szerinti
datumok tarolasara (tarol-
hato ertektartomany 1000.
januar 1-9999. december
3l. k6z6tt ) Formatuma:
EEEE-HH-NN (2005-05-12)
datetime 8 bajt Gergely-naptar szerinti
datumok es id6pontok taro-
lasara (tarolhato ertek-
tartomany 1000. januar 1
00:00:00 -9999. december
3l. 23:59:59 koz o t t.) For-
matuma: EEEE-HH-NN
00:PP:MM (2005-05-12
12:25:40) 2. Az adatbazis-kezeles alapjai

35

time 3 b<3.j t id6pont tarolasara szolgal
ejfel es ejfel-l mp kb-
zbtt. Formatuma: 66:PP:MM
(12:25:40)
timestamp 4 bajt Masodperc pontossagu egy-
szeru tarolasi forma 1970.
januar 01. es 2037. decem-
ber 31. (UNIX id6) kbzbtt.
Formatuma: EEEEHHNN66pPMM.
A tablamodositasok nyomon
kbvetesere szolgal, ha a
timestamp tipusu attribu-
tum erteket NUL ertekre
a L'I f tunk be, akkor az ak-
tualis id6pont kerul be-
irasra. Az adott sor modo-
sitasakor a timestamp er-
teka automatikusan aktua-
lizalodik.
year 1 bajt A Gergely-naptar szerinti
eveket tarolhatunk benne
1900 es 2155 kbzbtt
bsszetett adattipusok
enurn(ertek1, 1 - 255 elem: 1 bajt ezen attributum tipus ese-
ertek2, ... ) 256 - 65 535 elem: 2 ten csak az ertekek felso-
bajt rolasaban szerep16 ertek
adhato meg. Elter6 ertek
megadasa eseten ures ka-
raktersorozat kerul a me-
z6be
set(ertek1, 1 - 8 elem: 1 bajt A karakterisztikus tarola-
ertek2 ... ) 9 - 16 elem: 2 bajt si mod miatt ezen tipus
17 - 24 elem: 3 bajt eseten tbbb ertek is sze-
25 - 32 elem: 4 bajt repelhet egy mez6ben, de
33 - 64 elem: 8 bajt csak az ertekek altaI fel-
sorolt m i.n t.a bo L) . Bizonyos korulmenyek kozott elofordulhat, hogy meg szeretnenk ismerni a hasznalatban leva adatbazis valamelyik tablajanak szerkezetet, melyet a

DESCRIBE t~blan~~

parancs segitsegevel tehetunk meg:

cikk_id megnevezes mennyisegi_egyseg egysegar

int(10) unsigned varchar ( 15 ) varchar(5) int(ll)

YES YES YES

PRI MUL

o NULL db NULL

mysql> DESCRIBE cikk;

+-------------- ----+------------------+------+-----+---------+-------+

I Field I Type I Null I Key I Default I Extra I

+------------------+------------------+------+-----+---------+-------+

+------------------+------------------+------+-----+---------+-------+

4 rows in set (0.03 sec)

36

Webes adatbazis-kezeles MySQL es PHP hasznalataval

Egy tabla torlese lenyegesen egyszerubb, mint nehez munka aran, tablaink felepitese, mmdossze egy egysoros parancsb61 all

DROP TABLE t.eb l enev;

a paranccsal visszavonhatatlanul torli a tablankat, ezert 6vatosan kell vele banni, Ezt a parancsot most NE probaljuk kill!!:

rows affected (0.06 sec)

Ha a tabla letrehozasakor elfelejtettuk elkesziteni hozza az index allomanyokat, akkor ezt ut6lag is megtehetjuk a

CREATE INDEX i ndexriev ON tablanev t e t.t.r i bu t.uml , [attributum2 ... J)

paranccsal:

mysql> CREATE vevo_INDEX ON rendeles (vevo_id); Query OK, 0 rows affected (0.27 sec)

Records: 0 Duplicates: 0 Warnings: 0

Az indextablak hasonl6an a tablak torlesehez a DROP indexnevON tablanev,

paranccsal torolhetoek az eddig megismert m6don es a SHOW INDEX TABLE t.Ab l eriev;

paranccsal tekinthet6ek meg. Az indextabla torlese nem jelenti a tabla egyideju torleset.

Keszitsuk el onalloan a vevo es a tetel tablakat a 2.1.4 fejezetben megadott attributum tipusok alapjan, majd ellenorizzuk le azok felepiteset,

2.2.3. A tablak adataival kapcsolatos miiveletek

Ahhoz, hogya fizikailag kesz adatbazisunkat hasznalni is tudjuk valamire, celszeru feltolteni azt adatokkal. Ennek m6dja lenyegesen egyszerubb, mint a tablak elkeszitese, mtndossze egy parancsra, a tabla szerkezetere es a felvinni kivant adatainkra van szukseg, A tabla szerkezetenek ismerete azert fontos, mert a felvitel soran a MySQL ellenorzi, hogy megfelel6 tipusu adatokkal kivanjuk-e megtoltenl a tabla mezoit, es ha nem megfelel6 adattipusu adatot szeretnenk felvinni, akkor azt a MySQL nem enge-

2. Az adatbilzis-kezeles alapjai 37 di, hibauzenetet kuld, Az adatok feltoltesehez hasznalt parancs altalanos sziritaktikaja

INSERT INTO t.eb l ariev (e t.t.r i but.uml , e t.r r i biit.um? ... )

VALUES ( er t.ek l , e r t ek.? ... );

A MySQL tovabbi lehetosegeket biztosit, rajtunk, illetve a celszerusegen mulik melyiket erdernes valasztani.

Egy rekord bevitele a cikk tablaba a kovetkezo paranccsal tortenhet:

mysql> INSERT INTO cikk (cikk_id, megnevezes,

-> rnennyisegi_egyseg, egysegar) VALUES (1, 'csavar', 'db',

-> 10000);

Query OK, 1 row affected (0.47 sec)

Tobb rekord bevitele egy lepesben bevitele is konnyen megoldhato peldaul a vevo tablaba:

mysql> INSERT INTO vevo (vevo_id, vevonev, vevocirn, ->szarnlaszarn) VALUES

->NULL, 'Fuszekli Bt', 'Budapest', 1234567891),

->NULL, "Ko z u z o Kft', ' Szeged',2147483649),

->NULL, 'Napfut6 Rt.', 'Budapest', 2147483647);

Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 2

Elofordul, hogy nem szeretnenk az osszes mezot feltolteni, ebben az esetben viszont fel kell sorolni a pararneterek kozott, mely attributumoknak kivanunk erteket adni. E problema megoldasara ket eljaras is hasznalhato:

mysql> INSERT INTO vevo (vevo_id, vevonev, vevocirn, ->szarnlaszarn) VALUES (last_insert_id(), 'Csavargo Rt.',

->'Budapest', 2147483641);

Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO vevo SET vevo_id=null, vevonev='Nevenincs ->Bt.', vevocirn='Debrecen', szarnlaszarn=3658547454; Query OK, 1 row affected (0.00 sec)

Ha azt szeretnenk, hogy az adatfelvitel j6 legyen erdernes betartani a kovetkezo szabalyokat:

• az adatok felvitele mindig az attributum nevek megadasanak sorrendjeben tortenjen

38

Webes adatbazis-kezeles MySQL es PHP hasznalatavai

a szoveges adatokat " koze kell irni

ha az auto_increment be van allitva egy attributumnat akkor a null hatasara a soron k6vetkez6 erteket fogja a rendszer beirnia mez6be. Az els6 peldaban a last_insert_id () fUggveny eredmenye ugyanaz, mint a null ertek bevitele

ha az SQL nines beallitva magyar nyelvure, akkor lehet6leg keruljuk az ekezetes karakterek hasznalatat, erre figyelmeztet is a MySQL (warnings: 2). Az ekezetes karakterek hasznalat bizonyos korulrnenyek kozott problernat okozhat

a datumok beviteli forrnatuma a k6vetkez6: '2005-01-01'

Termeszetesen lehetosegunk van arra is, hogy tablainkat mas tabla adataival toltsuk fel, ehhez nem kell mast tennunk, mint egy SELECT kiegeszitessel kell ellatni a paranesunkat. A SELECT hasznalataval kesobbiekben b6ven fogunk foglalkozni. Peldankban egy nem letezo tablabol (vevotar) probaljuk felt6lteni a vevo tablankat, ami miatt hibauzenetet kapunk, ha kiprobaljuk a paranesot:

INSERT INTO vevo (vevo_id, veveonev, vevoeim, szamlaszam) SELECT (id, nev, eim, szlsz) FROM vevotar;

Toltsuk fel a maradek harorn tablankat az alabbi tablaban szerepl6 adatokkal.

Ezzel egyel6re tulajdonkeppen keszek is vagyunk az adatok feltoltesevel. A tovabbi adatfeltolteseket mar egy altalunk keszitett program segitsegevel fogjuk elvegezni, de elotte meg megnezunk egy-ket fontos parancsot.

A kulonbozo tablak feltoltese, illetve a tablaba torteno ujabb rekordok bevitele utan talan a legfontosabb karbantartasi muvelet a mezok ertekenek megvaltoztatasa. A modosito muveletek vegrehajtasara tortenhet az egesz tablaban, illetve annak kivalasztott attributumaiban egysegesen, vagy feltetel megadasaval esak azon rekordok eseteben, amelyek megfelelnek az altalunk megadott feltetelnek, A modositas vegrehajtasahoz az

UPDATE tablam?v SET etz cr i but.uml=er t.ek I L a t.t.r i bu= tum2=ertek2 ... ] WHERE fel t.et.e l ,

paranes szolgal, ahol a SET utan nemcsak ertek adhato meg, hanem valarnilyen ertekado utasitas is. A feltetel megadasara WHERE zaradek megadasaval van lehetosegunk. Az ertekadas soran beallithatunk valarnilyen konkret erteket, vagy akar novelhetjuk, csokkenthetjuk a rnezo erteket.

Mindkett6re nezzunk egy peldat, az elso peldaban a hataridot egysegesen 2005-05-31-re allitjuk, a masodik peldaban felemeljuk valamennyi termek arat 20%- kal:

mysql> UPDATE rendeles SET hatar_ido='2005-05-31'; Query OK, 4 rows affected (0.00 sec)

Rows matched: 4 Changed: 4 Warnings: 0

Lathato, hogy a modositas soran negy sor lett atvizsgalva es valamennyi sor megvaltozott, Nezzunk egy masik peldat:

mysql> UPDATE cikk SET egysegar=egysegar*I.25; Query OK, 7 rows affected (0.13 sec)

Rows matched: 7 Changed: 7 Warnings: 0

40

Webes adatbazis-kezeles MySQL es PHP hasznalataval

Itt het sor lett modositva. Fontos. hogy a tizedesvessz6 az angol terminusnak megfeleloen pont(.).

A ket peldanal jol lathatjuk, hogy a rnodositott tabla valamennyi sora megvaltozott, annak kovetkezteben, hogy nern adtunk meg szukito feltetelt. Ha azt szeretnenk elerni, hogy a tablazat csak bizonyos sorai keruljenek modositasra, akkor szuksegunk van a WHERE zaradek hasznalatara. A WHERE pontos hasznalataval a SELECT utasitasnal fogunk megismerkedni. Addig is csokkeritsuk az olaj arat:

mysql> UPDATE cikk SET egysegar=egysegar*OS WHERE ->megnevezes='olaj' ;

Query OK, 1 rows affected (0.06 sec) Rows matched: 1 Changed: 1 Warnings: 0

A tabla adatainak torlesere a

DELETE FROM tablanev WHERE feltetel

parancs szolgal. Ha elhagyjuk a WHERE zaradekot, akkor a tabla valamennyi sorat torolhetjuk. Nagyon veszelyes mutatvanyl!l A k6vetkez6 parancs segitsegevel lehet egy sort torolni a tablabol (az 51-es cikkszamu rekordot toroljuk):

mysql> DELETE FROM cikk WHERE cikk_id=Sl; Query OK, 1 row affected (0.03 sec)

2.2.4. Lekerdezesek

Az utolso es egyben a leggyakrabban hasznalt es erniatt talan a legbonyolultabb utasitas a SELECT. Az utasitas az adatbazisban levo adataink valarnilyen feltetel szerinti lekerdezesere szolgal, Segitsegevel lehetosegunk van az adathalrnazunkbol nagyon sokfele szempont szerint kivalasztani nehanyat es azokkal szinte barmilyen muveletet vegre is tudunk hajtani, A SELECT utasitas egyszerusitett szintaktikaja a k6vetkez6:

SELECT e t.t.r i biit.uml l . attributum2 ... J FROM t.eib l eriev l. i . tablanev2, ... J [WHERE fel t et.e L J ;

Miel6tt meg nagyon megorulnenk, hogy ennyi, meg kell jegyezni. hogy ez tenyleg csak a kezdet, de a fejezet vegere megtanuljuk, hogyan lehet barrnilyen bonyolult lekerdezest megirni.

2. Az adatbazis-kezeles alapjai 41

Kezdjuk a legelejen, a cikk tabla valamennyi soranak lekerdezesere a kovetkezo ket utasitas egyarant hasznalhato, a * karakter valamennyi attributurnot helyettesiti, ha nem szeretnenk az osszes attributumot megjeleniteni, akkor csak a megjeleniteni kivant attributumokat kell a SELECT utan feltuntetni:

mysql> SELECT * FROM cikk;

mysql> SELECT cikk_id, megnevezes, mennyisegi_egyseg, egysegar ->FROM cikk;

barmelyik valtozatot lefuttatva, a kovetkezo eredrnenyt kapjuk (erdemes odaftgyelni a vegrehajtas sebessegere):

+---------+-------------+-------------------+----------+

I cikk_id I megnevezes I mennyisegi_egyseg I egysegar I

+---------+-------------+-------------------+----------+

1 csavar db 12500

2 csavarkulcs db 1000

20 olaj I 22500

21 ecset db 312

40 gitt kg 249

50 toll db 269

+---------+-------------+-------------------+----------+

6 rows in set (0.00 sec)

A MySQL lehetoseget biztosit arra, hogy a hosszu attributum nevek helyett rovidebbet hasznaljunk, az el6bbi peldanal maradva:

mysql> SELECT cikk_id AS cikkszam, megnevezes,

-> mennyisegi_egyseg AS me, egysegar FROM cikk;

+----------+-------------+------+----------+

I cikkszam I megnevezes I me I egysegar I

+----------+-------------+------+----------+

1 csavar db 12500
2 csavarkulcs db 1000
20 olaj I 22500
21 ecset db 312
40 gitt db 249
50 toll db 269 +----------+-------------+------+----------+

6 rows in set (0.00 sec)

42 Webes adatbazis-kezeles MySQL es PHP hasznalataval

A tablazat fejsoraban lathatjuk, hogy az uj nev jelent meg, melynek hatasara erthetobbe es attekinthetobbe valhat a lekerdezesunk, hiszen nem kodokat, hanem .ertelmes" szovegeket adhatunk meg.

A lekerdezesunk tovabbi szepitesere ad lehetoseget az ORDER BY zaradek, melynek feladata a megadott attrtbutumlokl szerint a lekerdezesunk sorba rendezese. A zaradek utani attributum nevek szerint rendezi a lekerdezest a MySQL, ami jelen esetunkben azt jelentene, hogy eloszor a megnevezes szerint, majd ha ket ugyanolyan megnevezest talal akkor az egysegar szerint. Az attributum utan megadott DESC ktegeszitessel a rendezes megfordithato:

mysql> SELECT cikk_id AS cikkszam, megnevezes,

-> mennyisegi_egyseg AS me, egysegar FROM cikk ORDER BY

-> megnevezes, egysegar;

+----------+-------------+------+----------+

I cikkszam I megnevezes I me I egysegar I

+----------+-------------+------+----------+

1 csavar db 12500

2 csavarkulcs db 1000

21 ecset db 312

4 0 g itt kg 2 4 9

20 olaj I 22500

50 toll db 269

+----------+-------------+------+----------+

6 rows in set (0.00 sec)

Az eddigi osszes pelda az adott tabla valamennyi sorat megmutatta szamunkra, ami az esetek tobbsegeben nem tul szerencses, f6leg tobb ezer rekordot tartalmazo tablakban. A lekerdezesunk szukitesehez nyujt segitseget a mar korabban ernlitett WHERE zaradek. A WHERE utan gyakorlatilag barmilyen logikai oszszehasonlito muvelet megadhato (egyenloseg, kisebb, nagyobb ertek, logikai muvelet, mintaillesztes, stb.).

Lekerdezeseinkhez a cikk tablat fogjuk hasznalni vegigprobalva, azokat a lehetosegeket, amelyet a MySQL biztosit szamunkra, szukseg eseten magyarazattal:

2.2.4.1. Osszehasonlito operatorok hasznalata

Az osszehasonlit operatorok megegyeznek a matematika oran tanult operatorokkal, igy ezek hasznalata nem okozhat sok gondot. A MySQL altal hasznalt operatorok: <, >, =, !=, <>, <=, >=.

A csavar adatainak 1ekerdezese:

SELECT * FROM cikk WHERE rnegnevezes='csavar';

A 2000 Ft-na1 dragabb terrnekek 1ekerdezese:

SELECT * FROM cikk WHERE egysegar>2000;

Azon terrnekek 1ekerdezese, rne1yeknek a rnennyisegi egysege nern 'db', a '!=' he1yett haszna1hat6 '<>' is:

SELECT * FROM cikk WHERE rnennyisegi_egyseg I='db';

2.2.4.2. Logikai operatorok hasznalata

A logikai operatorok egy, kett6 vagy tobb feltetel osszekapcsolasara szolgalnak. A MySQL-ben a leggyakrabban hasznalt harom logikai operator az AND I az OR es a NOT. Az AND eseteben az osszetett feltetel akkor igaz, ha minket oldala tgaz, OR eseteben akkor igaz, ha valamelyik oldala tgaz, NOT eseteben akkor igaz, ha a feltetel hamis. A lekerdezes soran azok a rekordok fognak megjelenni, ahol a vizsgalt mez6 erteke megfelel a felteteleknek, azaz igaz erteket ad vissza.

A 800 Ft-na1 dragabb es 5000 Ft-na1 olcs6bb terrnekek 1ekerdezese:

SELECT * FROM cikk WHWRW egysegar > 800 AND egysegar < 5000;

A terrnek rnennyisegi egysege vagy 'kg' vagy '1':

SELECT * FROM cikk WHERE rnennyisegi_egyseg ='kg' OR mennyisegi_egyseg ='1';

A terrnek rnennyisegi egysege nern 'db':

SELECT * FROM cikk WHERE NOT (rnennyisegi_egyseg ='db');

A loglkai operatorok hasznalatanak sorrendje zarojelek segitsegevel modosithato, rnindig a bels6 zarojelen belull muvelet ertekelodik ki eloszor, majd az utana kovetkezo, egeszen addig, mig el nem fogynak a zarojelek.

A 2000 Ft-nal dragabb kg vagy I mennyisegt egysegu termekek lekerdezesenek m6dja:

SELECT * FROM cikk WHERE (rnennyisegi_egyseg ='kg' OR mennyisegi_egyseg ='1') AND egysegar >2000;

44 Webes adatbazis-kezeles MySQL es PHP hasznalataval

Most rnegcsereltuk a zarojelet es a lekerdezes a 'kg' mennyisegi egysegu, valamint a 2000 Ft-nal dragabb T mennyisegi egysegu cikket listazza ki:

SELECT * FROM cikk WHERE mennyisegi_egyseg ='kg' mennyisegi_egyseg ='1' AND egysegar >2000);

2.2.4.3. NULL ertek hasznalata

Korabban azt mondtuk, hogy azon mezok erteke, amelyeknek nem adtunk meg erteket NULL. igya lekerdezesek soran sem tudjuk ugy hasznalni, mint az elvarhato lenne. Egy mezo NULL ertekenek vizsgalatara az is null vagy az is not null zaradek hasznalhat6.

Az egysegar attributumban a nem NULL erteku (kitoltottl rekordokat jeleniti meg:

2.2.4.4. Tagsag vizsgalata

Sokszor szukseges annak vizsgalata, hogy egy mezo erteke beleesik-e egy altalunk megadott tartomanyba. Erre a MySQL tobb lehetoseget is kinal, bar ezek kivalasztasat mindig a feladat szabja meg. Ha egy ertektartomanyba szeretnenk megallapitani, hogy a mezo erteke benne van-e, akkor a BETWEEN operatort hasznaljuk, ha arra vagyunk kivancsiak, hogy az altalunk megadott felsorolasban benne van-e az adott ertek akkor az IN operator hasznalata szukseges, ellenkezo esetben a NOT IN. Mindharom operator hasznalata kivalthato a Iogikai operatorok alkalmazasaval.

A termek mennyisegi egysege vagy 'kg' vagy '1':

SELECT * FROM cikk WHERE mennyisegi_egyseg IN ('kg', '1');

A 800 Ft-na1 dragabb es 5000 Ft-na1 olcs6bb termekek 1ekerdezese:

SELECT * FROM cikk WHERE egysegar BETWEEN 800 AND 5000;

A termek mennyisegi egysege nem 'db':

SELECT * FROM cikk WHERE mennyisegi_egyseg NOT IN ('db');

2. Az adatbazis-kezeles alapjai

2.2.4.5. Mintaillesztes

A szabvany ANSI SQL altal biztositott eljaras, hogy a lekerdezeseinket, akkor is vegre tudjuk hajtani, ha nem ismerjuk az adott mezo erteket, Termeszetesen ebben az esetben is rendelkeznunk kell nemi informacioval, ami lehet egy szoveg eleje, vege, vagy akar a belsejebol egy vagy tobb darab. A MySQL-ben a mintaillesztes megvalositasara a LIKE zaradek szolgal, A kovetkezo peldakban vegigmegyu.nk a leggyakrabban hasznalt ugynevezett regulans kifejezeseken.

Ha isrnerjuk a feltetelunkben szereplo sz6veg elejet akkor a '%' operatorral tudjuk leggyorsabban megoldani a lekerdezesunket, lathato, hogy a paranes hatasara esak a 'csa' karakterekkel kezdodo rekordok irodtak ki:

mysql> SELECT * FROM cikk WHERE megnevezes LIKE 'csa%';

+---------+-------------+-------------------+----------+

I cikk_id I megnevezes I mennyisegi_egyseg I egysegar I

+---------+-------------+-------------------+----------+

1 I csavar I db 12500 I

2 I csavarkulcs I db 1000 I

+---------+-------------+-------------------+----------+

2 rows in set (0.00 sec)

A '%' operator korlatlan szarnu karakter helyettesitesere szolgal ellentetben a '.' karakterrel, amely esak egy karakter helyettesiteset vegzt,

Az 6t betus 'csa'<val kezdodo mezoket megletetenek vizsgalatara a jo megoldas (3 pont=3 tetszoleges karakter):

mysq1> SELECT * FROM cikk WHERE megnevezes LIKE 'csa ... ';

A '[]' zarojelek kozt barmilyen karaktert [ee], vagy karaktertartomanyt [a-zA-ZJ beirhatunk de esak akkor fog az adott feltetelnek megfelelni, ha az adott pozicioban a [] kozt leva karakter van:

mysq1> SELECT * FROM cikk WHERE megnevezes LIKE 'cs[aeoJvar';

ebben az esetben esak a esavar, esevar, esovar fog a feltetelnek megfelelni.

Annak vtzsgalatara, hogy egy sz6veg belsejeben tetszoleges helyen leva karaktersorozat megfelel-e a feltetelnek a LIKE helyett a REGEXP kifejezes hasznalhato, Ahhoz, hogy le tudjuk kerdezni

45

46

Webes adatbazis-kezeles MySQL es PHP hasznalatavel

azokat a rekordokat, melyek megnevezeseben szerepel a 'cs' betu a k6vetkez6 utasitast kell begepelnunk:

mysql> SELECT * FROM eikk WHERE megnevezes REGEXP 'es';

+---------+-------------+-------------------+----------+

I eikk_id I megnevezes I mennyisegi_egyseg I egysegar I

+---------+-------------+-------------------+----------+

1 I esavar I db 12500 I

2 I esavarkules i db 1000 I

21 I eeset I db 312 I

+---------+-------------+-------------------+----------+

3 rows in set (0.01 sec)

2.2.4.6. Csoportosftasok

A szabvanyos SQL lehetoseget biztosit arra, hogy adatainkat csoportositsuk, illetve egy adott csoporttal valamilyen egyszeru rnuveletet vegezzunk. Ilyen esetek lehetnek peldaul, ha kivancsiak vagyunk, mely varosokban vannak iigyfeleink, vagy melyik termekbol atlag mennyit adtunk el, mekkora aron stb. Lassuk ezen peldak megoldasat:

Arra a kerdesre, hogy mely varosban vannak ugyfeletnk eg;y .hagyomanyos" -SELECT vevocim FROM vevo; - lekerdezessel megoldhato lenne csak ebben az esetben a tablank valamennyi rekordjat kiirja a lekerdezes, ez pedig egy tobb ezer soros adatbazisban nem nyujt segitseget, helyette hasznaljuk a GROUP BY zaradekot, amely a csoportositast vegzi elhelyettunk, A lekerdezes megfele16 (nem hamis) eredrnenyenek kiiratasahoz fontos, hogy a GROUP BY zaradek utan szerep16 attributurn a SELECT utasitas utan szerepeljen es csak olyan attributumokkal, amelyek szamitott ertekek (AVG, SUM, stb.):

+----------+ I vevoeim +----------+ I Szeged I

I Budapest I

I Debreeen I

+----------+

3 rows in set (0.09 sec)

Termeszetesen itt is van lehetosegunk nerni szukitesre a HAVING parameterrel. A 'b' betuvel kezd6d6 varosneveket irathatjuk ki a k6vetkez6 paranccsal:

2. Az adatbazis-kezeles alapjai

mysql> SELECT vevocim FROM vevo GROP BY vevocim HAVING

-> vevocim LIKE 'b%'; +----------+

I vevocim

+----------+

I Budapest I

+----------+

1 row in set (0.00 sec)

A csoportositas elejen ernlitettuk, hogy nehany alapveto muvelet elvegzesere is van lehetosegunk, Ezek a rnuveletek az atlagolas (AVG. az osszesites (SUM), a darabszam (COUNT), minimalls ertek (MIN). maximalis ertek (MAX) meghatarozasa. A peldakon keresztul megnezhetjuk, hogy ez a nehany muvelet mennyire leegyszerusitheti a Iekerdezeseinket. lme nehany, a gyakorlatban is hasznalhato pelda:

Termekkodonkent mennyi az atlagos rnegrendeles:

mysql> SELECT cikkszam, AVG(mennyiseg) FROM tetel GROUP BY

-> cikkszam;

+----------+----------------+

I cikkszam I avg(mennyiseg) I

+----------+----------------+

1 I 20 I 21 I 40 I 50 I

10.0000 5.0000 15.0000 13.3333 4.0000

+----------+----------------+

5 rows in set (0.08 sec)

Egy adott cikkb61 mennyi volt a maximalis megrendeles:

mysql> SELECT cikkszam, MAX (mennyiseg) FROM tetel GROUP BY

-> cikkszam;

+----------+----------------+

I cikkszam I max (mennyiseg) I

+----------+----------------+

1 I 20 I 21 I 40 I 50 I

10 I 5 I 15 I 20 I 4 I

+----------+----------------+

5 rows in set (0.00 sec)

47

48

Webes adatbazis-kezeles MySQL es PHP hasznalataval

Egy adott termekbol mennyi volt a minimalis megrendeles:

mysql> SELECT cikkszam, MIN(mennyiseg) FROM tetel GROUP BY

-> cikkszam;

+----------+----------------+

I cikkszam I min (mennyiseg) I

+----------+----------------+

10

1 20 21 40 50

5

15

8 4

+----------+----------------+

5 rows in set (0.00 sec)

A COUNTO fuggveny segitsegevel kiirattathatjuk melyik rendeles soran, mennyi tetelt rendeltunk:

mysql> SELECT rendeles_id, COUNT (rendeles_id) FROM tetel GROUP

-> BY rendeles_id;

+-------------+--------------------+

I rendeles_id I count (rendeles_id) I

+-------------+--------------------+

1 I 2 I 3 I

4 I 2 I 1 I

+-------------+--------------------+

3 rows in set (0.00 sec)

Es vegul egy bonyolultnak tuno, de nagyon hasznos pelda, a szamitas es a szures hasznalata egy utasitasban,

Melyek azok a rendelesek, ahol a tetelszam kevesebb, mint harom:

mysql> SELECT rendeles_id, COUNT (rendeles_id) FROM tetel GROUP

-> BY rendeles_id HAVING COUNT (rendeles_id) <3;

+-------------+--------------------+

I rendeles_id I count (rendeles_id) I

+-------------+--------------------+

2 I 3 I

2 I 1 I

+-------------+--------------------+

2 rows in set (0.02 sec)

2. Az adatbazis-kezeles alapjai

49

2.2.4.7. Fiiggvenyek

A MySQL hason16an barmely programozasi nyelvhez sok beepitett fuggvennyel rendelkezik, ezek a fuggvenyek egy erteket adnak vissza, att61 fUgg6en, hogy milyen fUggvenynevet, illetve parametereket adunk meg. A leggyakrabban hasznalt fuggvenyek a matematikai, a szoveg, valamint a datum es a logikai fuggvenyek. A fuggvenyek elhelyezkedhetnek a SELECT utasitas utan, vagy a WHERE, illetve a HAVING BY utan a feltetelekben.

A leggyakrabban hasznalt fuggvenyek leirasat es hasznalatat a kovetkezo tablazat tartalmazza:

98, a 'b' karakter ascii kodta

A 'c' karakter ASCII kodjat adja vissza

ascii('c')

ascut'b')

numerikus ertekek atalakitasa az ascii kodtabla szerint

char(77.121.83.8 1.76)

char(77.121,83.81. 76)

MySQL

karaktersorozatok osszefuzesere szolal

concatt'szoveg I', ·szoveg2· ... )

concatf'My', ·S·. 'QL')

MySQL

megad]a, hogy a keresend6 szoveg hol kezd6dik az els6 arameterben

tnstrf'barangolas', 'g 01')

tnstrlrruben, mit)

6

vtsszaadja a szoveg hosszat

length (szoveg)

Iengtht'darab')

5

a szoveg elejebol a szamnak megfelel6 darab karaktert ad vissza

leftl'szoveg' .szam)

left(,MySQL' .3)

MyS

a szoveget kisbetusre konvertah a

lower(' szoveg')

10wer(,MySQL')

mysql

eltavolitja a szoveg elejebol a szokoz karaktereket

ltrtrnrszoveg'I

ltrim(' MySQL')

MySQL

repeatl'szoveg' , szam)

a szoveget szamszor leiria e mas melle

repeat(,MySQL' .2)

MySQLMySQL

a szoveg vegetol a szamnak megfele16 darab karaktert ad vissza

right('szoveg' . szam]

right('MySQL' .3)

SQL

eltavolitja a szoveg

vegebol a szokoz rtrim(,MySQL karaktereket

rtrtrnf'szoveg')

')

MySQL

,
50 Webes adatbazis-kezeles MySQL es PHP hasznalatavel
visszateresi erteke
0, ha a ket szoveg
strcmpf'szoveg l " azonos, -1, ha az strcmp(,MySQL', 'My
elsa elobbre van az 0
'szovegz') abeceben, mint a SQL')
masodik, kulonben
1
u ppert'szoveg') a szoveget nagy be- upper('MySQL') MYSQL
tusre konvertalia
Aritmetikai fUg.e;venyek
alapveto arttmetikai
muveletek, vala-
., /, div mint az osztas 5 div 2 2
+, -, egesz reszenek
meghatarozasara
szolgalo div
Matematikai fUggvenyek
abstszarn) a szam abszolut abs(-2) 2
erteket adja vissza
cre32 ('szoveg') Egy szoveg ere kod- ere32 (,MySQL') 3259397556
jat adja vissza
modlszam, szam) maradvanyerteket mod(355,10) 5
ad vissza osztasnal
piO a pi erteket adja 3.141593 I
vissza
powertszam l , a szam1 szam2-dik
hatvanyat adja power(2,2) 4 I
szamzl vissza
veletlenszeru sza- 0.2358746951
randO mot ad vissza o es 254
e{!y kozott
round (szam) visszaadja a szarnot round(3,14) 3
egeszre kerekitve
sqrtlszam) megadja a szarn sqrt(4) 2
{!yoket
Datum es ida fUg.e;venyek
curdatef) Aktualis datum curdatef) 2005-05-20
lekerdezese
eurtimeO aktualis ida leker- eurtimeO 12:03:18
dezese
egy teljes datum ida date('2005-05-20
datel'datum') szoegbol visszaadja 12:4:22') 2005-05-20
a datum erteket
rnegadja a ket da-
datediff(, datum 1 ' tumertek kozotti date('2005-05-20' -
, 'datum2') tavolsagot napok- '2005-05-25') 5
ban (esak a 4.1.1
verztotoll 2. Az adatbazis-kezeles alapjai

51

-
a megadott datum-
hoz adja hozza a
date addt'datum' megadott fajta erte-
interval ertek ket. A leggyakrab- date_addC2005-05- 2005-05-14
ertekfajta) ban hasznalt ertek 12'. interval 2 day)
fajtak: year, month,
day, hour, minute,
second)
a datum es az id6
megjelenitesi for-
rnajat lehet bealli-
date formatt'dat tani) a formatumok datefonnatC2005- 2005. May 23.
urn', formatum) parametereit a ko- 05-23', '%Y. %M Monday
vetkez6 tablazat %d.%W');
tartalmazza
(csak a 4.1.1 verzi6-
t61)
daynamet'datum' megadja a datum- daynameC2005-05-
) ban levo nap angol 23) Monday
nevet
monthnamel'dat megadja a h6nap monthnameC2005- May
urn') never anaolul 05-23)
nowO megadja az aktualis nowO 2005-May-21
id6t 12:24:38
ttmel'daturn'l a datumbol megad- timeC2005-05-23 12:24:38
[a az id6t 12:24:38')
timedeff(2005-05-
a ket daturnok ko- 21 46:58:57.9999
ttmedeffl'datum 1 zott kiszamitja az 23:59:59.000001', 99
, daturnz) idoelterest (csak a -> '2005-05-20
4.1.1 verziotol] 01 :01 :01.000002'); A datum es ida fuggvenyek formazott kiiratasahoz szukseges kapcsolok:

52

Webes adatbazis-kezeles MySQL es PHP hasznalataval

A fenti fUggvenyek hasznalatanak bemutatasara nezzunk egyket peldat a teljesseg igenye nelkul. Az elsa nehany lekerdezes soran lathatjuk, hogy egy fUggvenyek futtatasahoz nem szukseges, hogy barmilyen az adatbazisban leva adatot felhasznaljunk, a harmadik peldaban egy az operacios rendszertol kapott adatot tudunk Iekerdezni es megjeleniteni:

A CHAR () fuggveny segitsegevel kiirathatunk szoveget a betu ASCII kodjanak megadasaval:

mysql> SELECT CHAR(77,121,83,Sl,76);

+-----------------------+

I char(77,121,S3,81,76) I

+-----------------------+

I MySQL

+-----------------------+

1 row in set (0.02 sec)

A POWER () fUggveny lehetoseget biztosit, hogy egy szamnak valahanyadik hatvanyat megkapjuk:

mysql> SELECT POWER(2,2); +------------+

I power ( 2 , 2 ) I

+------------+

4.000000 I +------------+

1 row in set (0.05 sec)

A NOW () fUggveny segitsegevel megtudhatjuk a pontos datumot es idot:

mysql> SELECT NOW();

+---------------------+

I now()

+---------------------+

I 2005-05-21 13:57:21 I

+---------------------+

1 row in set (0.04 sec)

A kovetkezo peldakban lathato, hogy mar a lekerdezes eredmenyeinek kiiratasakor szabalyozhatjuk annak formajat, illetve m6dosithat6 a lekerdezes eredmenye (2. pelda), vagy kiirathatunk olyan erteket, amit az adatbazisunk nem is tarol (3. pelda):

mysq1> SELECT UPPER (megnevezes) FROM cikk;

+-------------------+

I upper (megnevezes) I

+-------------------+

CSAVAR CSAVARKULCS ECSET

GITT

OLAJ

TOLL

+-------------------+

6 rows in set (0.20 sec)

mysq1> SELECT rende1es_id, datum, DATE_ADD(datum, interval 2

-> day) FROM rende1es;

+-------------+------------+---------------------------------+

I rende1es_id I datum I date_add(datum, interval 2 day) I

+-------------+------------+---------------------------------+

1 2 3 4

2005-05-10 2005-05-12 2005-05-17 2005-05-17

2005-05-12 2005-05-14 2005-05-19 2005-05-19

+-------------+------------+---------------------------------+

4 rows in set (0.02 sec)

mysq1> SELECT rende1es_id, DAYNAME(datum) FROM rende1es;

+-------------+----------------+

I rende1es_id I dayname(datum) I

+-------------+----------------+

1 Tuesday 2 Thursday 3 Tuesday 4 Tuesday

+-------------+----------------+

4 rows in set (0.00 sec)

Az utols6 peldaban kiprobalhatjuk, hogy a fuggvenyek nerncsak a rnezolistaban, hanem a WHERE feltetel magadaskor is hasznalhato:

mysq1> SELECT rende1es_id FROM rende1es WHERE DAYNAME(datum)=

-> 'Thursday';

+-------------+ I rende1es_id I +-------------+

I 2 I

+-------------+

1 row in set (0.00 sec)

54 Webes adatbazis-kezeles MySQL es PHP hasznalataval

Az osszes a MySQL altal ismert fuggveny, illetve a fUggvenyek pontos parameterei terjedelrni okok miatt nem kerulhetett bemutatasra, a fuggvenyekrol b6vebben az angel nyelvu MySQL referenciak6nyvben olvashatunk, amely elerheto a MySQL hivatalos oldalan is.

2.2.4.8. Tablak osszekapcsolasa

Az eddigi peldak egy adatbazisban csak akkor tudunk teljes koruen lekerdezni, ha az 6sszes adatunk egy tablaban van tarolva es 1 NF -ju. A mindennapi eletben azonban nagyon ritkan talalkozhatunk ilyen adatbazisokkal, hiszen a magasabb normalforma elerese a hatekony mukodes szempontjabol elengedhetetlen.

T6bb tablabol val6 lekerdezes WHERE feltetel megadasaval vagy a JOIN hasznalataval tortenhet. Kezeles szernpontjabol a WHERE feltetel alkalmazasa k6nnyebb, a JOIN hasznalatanak pedig tobb lehetoseget biztosit.

Ha nem adjuk meg a kapcsol6 feltetelt a ket tabla k6z6tt, akkor a tablak Descart szorzatat kapjuk, ami az 6sszes tabla osszes sorat parba allitja es kiirja:

rnysql> SELECT rendeles_id, cikkszarn, rnegnevezes, rnennyiseg

-> FROM tetel, cikk;

+-------------+----------+-------------+-----------+

I rendeles_id I cikkszarn I rnegnevezes I rnennyiseg I

+-------------+----------+-------------+-----------+

1 I 1 I csavar 10 I
1 I 21 I csavar 15 I
1 I 40 I csavar 8 I
2 I 20 I toll 5 I
2 I 40 I toll 12 I
3 I 40 I toll 20 I +-------------+----------+-------------+-----------+

42 rows in set (0.00 sec)

Ahhoz hogy csak a megfelel6 ertekek jelenjenek meg az elsodleges kulcsot es a kulso kulcsot 6ssze kell kapcsolni a WHERE feltetelben:

mysql> SELECT rendeles_id, cikkszam, megnevezes, mennyiseg

-> FROM tetel, cikk WHERE cikk_id=cikkszam;

+-------------+----------+------------+-----------+

I rendeles_id I cikkszam I megnevezes I mennyiseg I

+-------------+----------+------------+-----------+

1 1 csavar 10
1 21 ecset 15
1 40 gitt 8
1 50 toll 4
2 20 olaj 5
2 40 gitt 12
3 40 gitt 20 +-------------+----------+------------+-----------+

7 rows in set (0.04 sec)

A WHERE feltetelben termeszetesen tovabbi felteteleket is megadhatunk, de ha helyes eredmenyu lekerdezest szeretnenk kapni, akkor a tovabbi felteteleket es (AND) operatorral kell kapcsolnunk a kapcsolofeltetelhez, A rnasodtk lekerdezesben lathatjuk, hogy a ket tablanak a kapcsolasra hasznalt nevei megegyeznek, az ebb6l ad6d6 problernat a tabla nevenek megadasaval oldhatjuk meg:

mysql> SELECT rendeles_id, cikkszam, megnevezes, mennyiseg -> FROM tetel, cikk WHERE cikk_id=cikkszam

-> and mennyiseg>10;

+-------------+----------+------------+-----------+

I rendeles_id I cikkszam I megnevezes I mennyiseg I

+-------------+----------+------------+-----------+

1 I 21 I ecset 15 I

2 I 40 I gitt 12 I

3 I 40 I gitt 20 I

+-------------+----------+------------+-----------+

3 rows in set (0.03 sec)

mysql> SELECT vevonev, rendeles_id FROM vevo, rendeles WHERE

-> rendeles.vevo_id=vevo.vevo_id;

+---------------+-------------+

I vevonev I rendeles_id I

+---------------+-------------+

Nap f ii t o Rt. 1 I

Napfut6 Rt. 2 I

Koz uz o Kft 3 I

Fuszekli Bt 4 I

+---------------+-------------+

4 rows in set (0.00 sec)

56

Webes adatbazis-kezeles MySQL es PHP hasznalatavel

A fenti lekerdezesekben nem kaphatunk informaciot arrol, hogy van -e olyan megrendelesunk, amihez nines megrendelo rendelve, illetve van-e olyan vevo, akinek nines rnegrendelese. E problema feloldasara hasznalhato a JOIN kapesolat alkalmazasa. A .hagyornanyos" JOIN a WHERE utani feltetel kivaltasara szolgal:

mysql> SELECT vevonev, rendeles_id FROM vevo INNER JOIN

-> rendeles ON rendeles.vevo_id=vevo.vevo_id;

+---------------+-------------+

I vevonev I rendeles_id I

+---------------+-------------+

Napflit6 Rt. 1

Napflit6 Rt. 2

K6zuzo Kft 3

Fuszekli Bt 4

+---------------+-------------+

4 rows in set (0.00 sec)

Ha azt szeretnenk, hogy az egyik tabla valamennyi sorat irja ki, a masikbol pedig esak a kapcsolasi feltetelekriek megfelel6ket, akkor az INNER helyett a LEFT (bal) vagy a RIGHT (jobb) parametert kell hasznalnunk. Ha a FROM utani tablabol szeretnenk valamennyi rekordot megjeleniteni, akkor a LEFT hasznalando, kuIonben a RIGHT paranesot:

mysql> SELECT vevonev, rendeles_id FROM vevo LEFT JOIN

-> rendeles ON rendeles.vevo_id=vevo.vevo_id;

+---------------+-------------+

I vevonev I rendeles_id I

+---------------+-------------+

Napflit6 Rt. 1

Napflit6 Rt. 2

K6zuzo Kft 3

Fuszekli Bt 4

NULL NULL

Csavargo Rt. Nevenincs Bt.

+---------------+-------------+

6 rows in set (0.02 sec)

mysql> SELECT vevonev, rendeles_id FROM vevo RIGHT JOIN

-> rendeles ON rendeles.vevo_id=vevo.vevo_id;

+---------------+-------------+

I vevonev I rendeles_id I

+---------------+-------------+

Napflit6 Rt. 1

Napflit6 Rt. 2

K6zuzo Kft 3

4

Fuszekli Bt

+---------------+-------------+

6 rows in set (0.00 sec)

2. Az adatbazis-kezeles alapjai

57

A masodik lekerdezesben azert nines NULL ertek, mert a logtkai szabalyok alapjan, valamennyi rnegrendeleshez tartozik megrendelo.

2.2.4.9. Beagyazot.t select hasznalata

A beagyazott SELECT hasznalatara a MySQL 4. l-es verziojatol van lehetoseg, mely segitsegevel tobb egymas utani SELECT hasznalatat elozhetjuk meg. Erre peldaul akkor lehet szukseg, es csak akkor hasznalhato, ha egy lekerdezes egyertekes eredmenyet (belso select) akarjuk felhasznalni egy masik lekerdezes (kulso select) eredmenyenek szukitesere. Az atlagosnal dragabb termekek kiiratasara a kovetkezo parancsot tudjuk hasznalni:

rnysql> SELECT rnegnevezes, egysegar FROM cikk WHERE

-> egysegar> (SELECT AVG(egysegar) FROM cikk);

+-------------+----------+

I rnegnevezes I egysegar I

+-------------+----------+

I csavar 12500 I

I olaj 22500 I

+-------------+----------+

2 rows in set (0.02 sec)

2.2.5. Tranzakci6k jelentosege es hasznalata

Az adataink modositasa soran gyakran elofordul, hogy egymas utani muveleteket szeretnenk vegrehajtani, ugy, hogy biztosak lehessunk abban, hogy valamennyi muvelet garantaltan vegrehajtodjon. Ilyen rendszerek peldaul a banki rendszerek, ahol az atutalasok soran biztosnak kell lennunk abban, hogy az egyik szamlarol leemelt 6sszeg megjelenik a masik szamlan. A tranzakci6k altalaban meg is tortennek, de mint tudjuk egy ararnszunet, vagy egyeb a rendszerre hat6 varatlan eserneny ezt megakadalyozhatja. Az adatbazisunk ebben az esetben inkonziszterisse valik, amely a kesobbi mukodes szernpontjabol helytelen eredmenyeket okozhat. A tranzakci6, ugy rnukodik, mintha az utasitas sorozatot egy utasitaskent hajtanank vegre.

Ez a funkci6 azonban csak az InnoOB, valamint a BOB tipusu tablak eseten mukodik. Alapertelmezesben a MySQL automatikusan vegrehajtja a begepelt es helyes parancsainkat, ahhoz hogy a tranzakci6 kezelest kiprobaljuk, be kell kapcsolni ezt a funkciot a kovetkezo paranccsal:

SET AUTOCOMMIT= 0 ;

BEGIN;

UPDATE szamla SET egyenleg = egyenleg + 2000 WHERE szamla_id=12; UPDATE szamla SET egyenleg = egyenleg - 2000 WHERE szamla_id=18; COMMIT;

58

Webes adatbazis-kezeles MySQL es PHP hasznalatavel

A tranzakci6 vegrehajtasa a begin utasitassal kezd6dik, majd a vegrehajtando paranesokkal folytat6dik es a COMMIT paranee sal fejez6dhet be, akkor ha az 6sszes vegrehajtando utasitas megfelel6en vegrehajtodik, ellenkez6 esetben a ROLBACK (vtsszavonas) hasznalando a tranzakei6 veglegesitesenek elkerulesere. Nezzunk egy egyszeru peldat a gyakorlati eletbol:

ha nem hajtodik vegre valamelyik muvelet, akkor hasznalando paranes a

ROLLBACK;

melynek hatasara az adatbazis visszaall a BEGIN elotti allapotra.

Szerencsere a tranzakei6 kezelese, esak komoly adatbaziskezelesi feladatok soran fordul e16, amelynek megalapozasara ez a konyv ir6dott.

2.2.6. Teibleik zarolasa

Bizonyos muveletek vegrehajtasa soran elengedhetetlen, hogy biztosak legyunk abban, hogy a lekerdezesunk vagy modositasunk alatt a tabla adataiban ne tortenjen valtozas, A zarolast, akkor erdemes elvegezni, ha kulso modositasra vagy olvasasra szamithatunk. A zarolas hatasara a muveletek vegrehajtasa gyorsabb lesz, valamint az egyrnas utani modositasamk kivulrol nezve egy muveletkent hajt6dnak vegre. Olvasasi zarolas eseten az ermtett tablakat a felhasznalok esak olvashatjak, nem irhatjak. Helyi olvasasi zarolas eseten mas felhasznalok esak olvashatjak az ermtett tablakat, mig a helyi felhasznalok reszere engedelyezve van a nem ukozo INSERT utasitasok kiadasa. lrasi zarolas seten a felhasznalok nem olvashatjak es irhatjak a tablazatot.

A tabla zarolasa utan nem feledkezzurik meg a zarolas feloldasarol sem:

mysql> SELECT * FROM vevo;

+---------+---------------+----------+------------+

I vevo_id I vevonev I vevocim I szamlaszam I

+---------+---------------+----------+------------+

1 Napfut6 Rt. Budapest 2147483647

2 K6zuzo Kft Szeged 2147483649

3 Fuszekli Bt Budapest 1234567891

4 Csavargo Rt. Budapest 2147483641

5 Nevenincs Bt. Debrecen 3658547454

+---------+---------------+----------+------------+

5 rows in set (0.00 sec) mysql> UNLOCK TABLES;

Query OK, 0 rows affected (0.00 sec)

mysql> LOCK TABLES vevo WRITE;

Query OK, 0 rows affected (0.07 sec)

Az utasitasban szereplo WRITE az Irasi, a READ az olvasasi zarat allitja be. A helyi zarolas azt jelenti, hogy a szamitogepen 10- kalisan vegezzuk a muveleteket.

2.2.7. Jogosultsagok kezelese

A MySQL a felhasznalok jogosultsagait egy kulon adatbazisban tarolja. Az adatbazishoz a GRANT es a REVOKE parancsokkal ferhetunk, hozza, anelkul, hogy ismernenk a tabla szerkezetet, A parancsok hasznalataval egy vagy tobb felhasznalo reszere adhatunk vagy vehetunk el jogokat, illetve allithatjuk be a jelszavat. A felhasznalo szamara pontosan meg tudjuk hatarozni, hogy mely oszlopokkal, mely tablaban mit csinalhat. A kovetkezo egyszeru peldaban letrehozunk egy teszt nevu felhasznalot es a szamla adatbazisban teljes jogosultsagot adunk neki, jelszavat pedig beallitjuk tesztpass-ra. A WITH GRANT OPTION parameter lehetoseget biztosit a teszt nevu felhasznalo szarnara, hogy 6 is jogokat osztogasson:

mysql> GRANT ALL ON szamla.* TO teszt IDENTIFIED BY 'tesztpass' -> WITH GRANT OPTION;

Query OK, 0 rows affected (0.05 sec)

A fenti parancs szinte teljes koru jogosultsagot biztosit a teszt felhasznalo szamara a szamla adatbazisban, amely biztonsagi szempontb6l nem tul j6 megoldas, hiszen egy mozdulattal torolheti adatbazisunk teljes adatmennytseget. Ha egy adott

60

Webes adatbazis-kezeles MySQL es PHP hasznalataval

felhasznalonak szeretnenk teljesoru, az osszes adatbazisra kiterjedo jogokat adni, akkor azt az on utan *. *-gal tehetjuk meg. A felhasznalo megadasanal lehetosegunk van beallitani, hogy helyileg, illetve tavoli eleres eseten is mas-mas jogosultsagot kapjon. Ez a felhasznalonev utan kozvetlenul begepelt @ karakter segitsegevel tortenhet, melyet vagy a loealhost (helyi bejelentkezes), vagy pedig a szamitogep azonositasara szolgalo nev (peldaul; teszt.fejleszto.eom) vagy egy ip-cim (peldaul 10.123.123.54) kovethet, illetve megadhatjuk a * karaktert, melynek segitsegevel nem befolyasoljuk az eleres helyet.

A MySQL altal biztositott legfontosabb jogosultsagokat a kovetkezo tablazatban tanulmanyozhatjuk:

I.{ . .j o99sul};'/s .. "q,'I!t~. l h ,,:,,1"7 n,,;l '''''ii, -" llfjp; ,,., ,fa h.:iPiFF!&
all all teljes koru jogosultsagot kap az ada t baz i s-
vagy hoz, kiveve file, reload es
privileges a process, a
shutdown parancsokhoz
alter megvaltoztathatja a tabla strukturajat (veg-
rehajthatja az alter paranes)
create uj tablak es adatbazisok letrehozasat vegez-
heti (vegrehajthatja a create paranes)
delete torolheti a t ab l ak sorait
drop torolheti a tablakat es adatbazisokat
A MySQL kiszolgal6 folyamataival azonos m6don
ferhet hozza a kiszolgal6n tarolt faj lokhoz.
file Szukseges, ha hasznalni szeretne a load data
infile, valamint a select into outfile paran-
esokat. Vigyazat kiskaput nyit a rendszerunk-
ben!! !
index kezelheti az indexeket
insert uj sorokat szurhat be a tablazatba
hozzaferes biztosit a MySQL folyamatokhoz
process (vigyazat kiskaput nyit a rendszerunkbenl I I)
reload az ideiglenes tarol6ban lev6 adatok betolte-
set engedelyezi
select adatolvasast vegezhet
shutdown kilepest engedelyez a MySQL-b61
update adatm6dositast vegezhet
A MySQL-hoz torten6 kapcsol6dast engedelyez,
usage mas muveletet nem 2.2.8. Kiilso adatallornanyok kezelese

Gyakori feladat, hogy kulso adatallornanyokbol kell az adatbazisba adatokat bevinni. Erre termeszetesen bizonyos feltetelek mellett van esak lehetosegunk. Az allornanynak text tipusunak kell lennie, lehetnek benne elvalaszto karakterek, valamennyt attributumnak szukseges, hogy legyen rnegfeleloje az adatallomanyban vagy helyette IN, ha nines benne elvalaszto, akkor tabulatorral kell a szoveget elvalasztant.

2. Az adatbitzis-kezeh§s alapjai 61

A kulso ad at bevitelere a LOAD parancs szolgal, a LOCAL parameter segitsegevel adhatjuk meg, hogy a MySQL a helyi gepen keresse az adatallomanyt, kulonben a kiszolgaloszerveren:

Lehetosegunk van ismetlodo rekordok eseteben azok elhagyasara, vagy az adatbazisunkban levo rekord feluliratasara a IGNORE, illetve a REPLACE parameterekkel, Tagol6 karakter beallitasara a ; elott kiadott FIELDS TERMINATED BY ',' parameterrel tortenhet,

A SELECT utasitasunk altal letrehozott lekerdezes eredmenyet kiirathatjuk adatallornanyba, megadva a mezo erteket befoglal6 karaktert, az elvalaszto karaktert, az allomany nevet:

TERMINATED BY ',' FROM vevo;

Akar a kiszolgalon, akar a helyi szamitogepen van az adatbazis a letrejovo allomany az adatbazis konyvtaraba keszul el.

Az adatbazist kezel6 altalaban grafikus feluletu szoftverek lehetoseget biztositanak az adatbazis, a tablak szerkezeteriek es adatallomanyainak eloallitasahoz szukseges SQL utasitassort tartalmaz6 scriptet. A script lefuttatasa soran vegrehajtodnak azok a muveletek, amelyek a scriptben helyesen vannak. Ilye allomanyt mi is el tudunk kesziteni csak egy szoveges allomanyt kell letrehoznunk es el kell mentenunk, lehetoseg szerint SQL krterjesztessel:

A futtatand6 allornanynak a MySQL parancsait tartalmaz6 konyvtarban kell lennie, Windows operacios rendszer eseten a c: \MySQL \bin konyvtarban,

62

Webes adatbazis-kezeles MySQL es PHP hasznalatava

3. A PUP nyelv alapjai

A PHP az egytk leggyakrabban hasznalt prograrnozasi eszkoz webes alkalmazasok keszitesehez. Konnyen illeszthet6 szinte barmelyik operacios rendszer ktszolgalojahoz legyen az akar a windows Internet Information Services (lIS). vagy akar az Apache Linux alatt.

A prograrnozasi nyelv eszkozei, a parancsok szintaktikaja nagyban hasonlitanak a C programozasi nyelvre. igy akik C-ben mar tudnak programozni nem lesz nehez dolguk a nyelv elsajatitasaban,

A PHP-szkriptnyelv. ami azt jelenti, hogy a programunk kodjat szinte barrnilyen szovegszerkesztovel meg tudjuk irni. a lenyeg, hogy a mentesnel egyszeru szovegformatumba es . php kiterjesztessel rnentsuk el az allomanyunkat a webkiszolgalonk megfele16 konyvtaraba. A legtobb HTML szerkeszt6 program kezeli a PHP k6dokat es szamos olyan van koztuk, amely kulonbozo szinekkel jelzi, hogy egy parancsot. vagy valamilyen egyeb prograrnozasi eszkozt hasznalunk-e.

A szkriptunk forditasat minden alkalommal elvegzi a ktszolga- 16 szerver, amikor meghivjuk a szkriptet. Ez nemileg lassabb futast eredrnenyez, mintha egy korabban leforditott programot futtatnank (pl.: Pascal, C. stb .... J. de ezert cserebe hordozhat6 k6dot kapunk, ami azt jeleriti, hogy a programjaink jelentos resze fut majd Linux alatt es Windows alatt is. Ha a programjainkat korultekint6en keszitettuk es figyeltunk a rendszerszintu programozasi eszkozok megfelelo hasznalatara, akkor azok teljes mertekben hordozhat6ak lesznek.

A szkript tipusu nyelveknek nagy hatranya, hogy a k6dban megbu]o hibara csak akkor derul feny, ha a program futasa soran arra a k6dsorra lepunk, ahol a hiba van. emiatt a program tesztelese nehezkesse valhat, hiszen minden parancson vegig kell mennunk ahhoz, hogy a szkriptunk legalabb szintaktikatlag (helyestrasilag) helyes legyen. Az elore leforditott programoknal mar a forditas soran kiderul, hogy hibas a programk6d es hiba eseten a k6d nem is kerul leforditasra.

3. A PHP nyelv alapjai

63

Ha azt szeretnenk, hogy a programjaink logikailag is j61 mukodjenek, azaz azt csinaljak amit elvarunk toluk, akkor lehetoseg szerint a program valamennyi agat teszteljuk Ie, meg szelsoseges ertekekre is. Egy alkalrnazas fejlesztese soran tetelezzunk fel minden .rosszat" a felhasznalorol, mert amit el lehet rontani azt valoszinuleg az els6 probalkozas utan meg is fogja tenni. A f6 feladat els6sorban a hibalehetosegek kiszurese es megfelel6 modon val6 kezelese.

3.1.A PHP es a HTML kapcsolata

A bongeszonk szamara a PHP k6djaink eredmenyei ugy jelennek meg, mintha azok egy H1ML k6dok lennenek. A PHP k6d atalakitasarol a Web kiszolgalo gondoskodik. A kiszolgalo vegzi el az osszes PHP k6d kiertekeleset es adja at a k6dot a bengeszonknek, Maga a PHP k6d is tartalmazhat H1ML elemeket, melyek segitsegevek tudjuk a szovegunket formazni, illetve mindenfele egyeb muveletet vegrehajtani. Ha azt szeretnenk, hogy a bongeszonk a PHP k6db61 megjelenitsen valamit, akkor ahhoz a .kiiro" paranesokat tudjuk hasznalni. Leggyakrabban hasznalt ilyen jelegu paranesunk az echo, valamint a print () es a printf () . Az els6 kett6 formazas nelkuli sz6veg kiirasara alkalmas, a p r i n t f l] formazott sz6veg kiirasara hasznalhatjuk,

Biztonsagunk szernpontjabol is nagyon fontos dolog, hogy a bongeszonk, mar esak a vegeredmenyt kapja meg, fiiggetleniil attol, hogy mi volt a PHP k6dunka irva, maga a k6d nem latszik es semmi sem utal arra, hogy ott korabban egy masik nyelv kodja allt ott. Err61 magunk is konnyen meggyozodhetunk, ha megnezzuk a betoltott oldal forrasat (Ne z e t z'Eo.r r a s ) .

A szkriptjeinket altalaban HTML k6dba epulve gepeljuk be egy egyszeru szovegszerkesztovel, vagy az Internetrol ingyenesen letoltott eel szoftverrel, amelyek mar a legtobb esetben nyelverzekenyek, ami azt jelenti, hogy mas szinnel jeloli a parancsokat, a valtozokat es az egyeb nyelvi eszkozoket. Bizonyos fejleszto eszkozok meg a szintaktikai hibaellenorzest is elvegzik, vagy legalabb jelolik a lehetseges hibak helyet.

A PHP szkripteket, hasonl6an barmilyen mas HTML tag-hoz, nytto es zarocimkek koze kell zarni,

<?php

?>

Ez a legaltalanosabban hasznalt cimke, mi is ezt 'uk hasznalni

<%

?>

Ha oldalunk XML kodokat s tartalmaz, valamint be van allitva a r6vid cimkek felismerese a php.ini allomanyban (short_open_tag=On;), akkor forditasi roblemat okoz

R6vid cimke

ASP cimkek

>

Az ASP-szeru cimke, akkor muk6dik, ha az asp_tags=On, be van allitva a php.ini all

Szkript cimke

<SCRIPT LANGUAGE

</SCRIPT>

Hossza miatt nem igazan hasznalatos

">

A leggyakrabban a szabalyos cimke megoldassal talalkozhatunk az irodalomban, mivel az nem utkozik semmivel es kellokeppen rovid is. fgy mi is ezt fogjuk alkalmazni.

A HTML altal hasznalt egyeb tag es azok funkci6it a mellekletben talalhato tablazatbol megismerhetjuk.

Az elso szkriptunk, mindjart egy klasszikus sz6veg kiiratasa, ame11yel valamennyi programozast k6nyv kezd6dik (he 11 0 . php) :

?>

<?php

print ("Hello Vilag");

A szkriptunk a print () fUggveny segitsegevel kiirat a bongesz6nkbe egy r6vid uzenetet. Probaljuk ki! Mentsuk el az allomanyt a webszerverunk megfelel6 konyvtaraba (Apache eseten: c: \apache\apache2 \htdocs, Windows eseten:c . \inetpub\). Inditsuk el a bongeszonke; es a hivatkozas sorba irjuk be, hogy http://loca1host/he110.php es marls megjelenik a k6vetkez6 kepernyo felteve, ha mindent j61 gepeltunk be:

13. abra A hello.php futas! eredmenye

3. A PHP nyelv alapjai

65

Hiba eseten a hibas sor feltuntetesevel hibauzenetet kapunk, ha elrontottuk a rnentesnel az allomanyunk nevet, vagy ha olyan hibat vetettunk, hogy a bongeszo nem tudja megallapitani, hogy a kodreszletunk PHP nyelven irodott, akkor a teljes k6d megjelenik.

A k6d nem tartalmaz HTML elemeket, ami eleg ritka dolog, mivel nagyon sok mindent a HTML nyelv segitsegevel konnyebben meg tudunk valositani. Termeszetesen a print () fuggveny segitsegevel konnyeden at tudunk adni barmilyen szoveget a bongesz6nknek, de ez folosleges pluszmunkat igenyel. Az egyik ilyen do log a bongeszonk cimsoranak kitoltese: (hello_fejleccel.php):

<htrnl> <head>

<title>Els6 PHP prograrnorn</title> </head>

<body>

<i>

<?php

print ("Hel16 Vil~g"); ?>

<Ii>

</body>

Az elozo program kibovitese utan a bongeszo cimsora is kitoltesre kerult, valamin a <.L> hatasara a kiirand6 szoveg is doltte valtozott.

14. abra A hello_fejleccel.php futas! eredrnenye

Egy HTML (PHP) allomanyba korlatlan szamu -cgymastol fuggetlen- PHP kodreszlet szurhato be.

A PHP kodunkban a jobb erthetoseg kedveert es a program dokumentalasaert lehetosegunk van megjegyzeseket beszurni. Az egy vagy tobb soros megjegyzeseket a PHP fordito flgyelmen kivul hagy]a. Az egysoros megjegyzesek eseteben a / / vagy a # karakterek utani szovegresz kerul kihagyasra a sor vegeig, a tobbsoros megjegyzesek eseteben a/* * /kozott szovegresz kerul kihagyasra,

II egysoros rnegjegyzes

# egy rnasik egysoros rnegjegyzes 1* Ez a harrnadik,

de nern egysoros,

han ern negysoros

rnegjegyzes*1

66

Webes adatbazis-kezeles MySQL es PHP hasznalataval

Ez ut6bbi barhova beszurhato, ahova a paranes szintaktikaja megengedi, hogy szokozt szurjunk be:

3.2. Muveletek adatokkal

A kovetkezo oldalakon, megismerkedhetunk a PHP szkriptnyelv epitoelemeivel, reszletesen megismerhetjuk a valtozo fogalmat es hasznalatat, betekintest nyerhetunk a vezerlesi szerkezetek, a fUggvenyek hasznalataba.

A fejezet sok ujdonsagot tartalmaz, ezert, ha nem sikerult valamit ponto san megjegyeznunk, kesobb erdernes ide visszaternl, Akik mar korabban programoztak mas programozast nyelven szinten ajanlott ez a fejezet, hiszen a PHP sajatossagait, mas programozasi nyelvekt61 valo eltereseit is megtalalhatoak itt.

3.2.1. A valtoz6k jelentosege

Valamennyi programozasi nyelv alapja a vci1toz6, ami nem mas, mint a szamitogep mernoriajaban egy rekesz, ahova adatokat irhatunk es ahonnan adatokat olvashatunk. Valtozok hasznalata nelkul esak olyan szkripteket tudnank irni. amelyek tartalma az id6k soran nem valtozik, mint peldaul a hello.php szknptunk. A valtozoknak erteket adhatunk magabol a szkriptb61, kulso forrasbol, vagy akar egy adatbazis lekerdezeseb61 (mtndharom formara nezunk peldat a kesobbiekben).

Valamennyi valtozonak van neve, tipusa es ert.eke.

A valtozo neve, azonositja magat a valtozo erteket, illetve pontosabban azt a helyet, ahol azt a memoriaban taroljuk, A szkriptjeinkben a valtozo nevenek megadasaval hivatkozunk a valtozo ertekere.

A valtozo neve mindig az angol abece betuivel vagy alahuzas jellel U kezd6dik es betuvel, szarnmal vagy alahuzas jellel folytat6dik, de nem tartalmazhat szokozt, valarnint specialis (peldaul ekezetes) karaktert. A valtozo nevenek kivalasztasakor ugyeljunk arra, hogya nevek beszedesek es rovidek legyenek, utaljanak az adattartalomra, hogy kesobb esetleg nehany h6nap mulva is fel-

3. A PHP nyelv alapjai

67

ismerjuk oketo A PHP a valtozo neveben kulonbseget tesz a kis es a nagy betuk kozott, nem ugyanazt a valtozot jeleriti a valt es a VALT. A szkriptunk irasakor a valtozora neve ele a $ jelet kell imunk, hogy a fordit6 is tudja, hogy egy mem6ria teruletre hivatkozunk. Nehany pelda a j6 valtozonev kivalasztasahoz:

$j elszo ' $szamlalo $rekord_id $db_name

A PHP-ban es mas programozasi nyelvekben a valtozo neveket gyakran az angolul adjuk meg, aminek kovetkezteben a szkriptunket a vtlag mas reszein is fel tudjak hasznalni, es mi is fel tudjuk hasznalni a masok altal keszitett szkrtpteket. Ami a mai programozas szellemisegenek es a kodhordozhatosag lenyege. A k6nnyebb erthetoseg kedveert, a szkrtptjeinkben mi a magyar nyelvhez kozel a116 valtozorieveket alkalmazunk, termeszetesen ekezetes karakterek nelkul,

A valtozo tipusa hatarozza meg, hogy a valtozo milyen ertekeket vehet fel es azt hogy a valtozo ertekevel milyen muveleteket vegezhetunk. A PHP az integer, a double, a string, a boolean, az object, es az array tipusokat ismeri. Ha egy valtozonak nem adtunk kezdoerteket, akkor NULL tipusunak, azaz nem rneghatarozott tipusunak mondjuk. Logikai valtozoknak csak true vagy false erteket vehetnek fel, double es integer tipusu valtozok csak szamokat tudnak tarolni, az integer csak egeszeket, a double egeszeket es tizedes t6rteket!

A valtozo erteke, az az ertek, amelyet ertekadas soran a valtoz6hoz rendeltunk, A kezdoertek megadasa nelkuli a valtozo meghatarozhatatlan (NULL) erteku, A valtozonak erteket adhatunk a programba peldaul:

• fUggveny meghivasaval,

• osszeadast muvelettel,

• felhasznalotol adat bekeressel,

• adatbazisbol val6 lekerdezessel

• egy kulso eszkozrol torteno ertek beolvasassal,

Ha egy valtozora a sz6vegben hivatkozunk es korabban nem hoztuk letre, akkor az automatikusan letrejonl

Ha egy valtozohoz erteket szeretnenk rendelni, azt ertekadassal tudjuk megtenni. Az ertekadas eseten a bal oldali operandus veszi fel a jobb oldali operandus erteket.

Valtozo ertek adasi Iehetosegei (amit kesobbiekben hasznalni is fogunk):

68

Webes adatbazis-kezeles MySQL es PHP hasznalatavel

• $szamlalo=O; / /Icezdoertek adassal

• print ($szoveg); / /ertekadas nelkul, a valtozo er-

teke NULL, azaz nem definialt

• $szamlalo = 1 + 2; / / ertekadassal

• $tav=tav_fv(apont, bpont); / / fuggveny segitsegevel

• $ igaz = true; / / boolean tipusu ertekadas

Az automatikus tipusmegadas miatt a szkript irasa soran kritikus lehet, hogy egy valtozonak milyen a tipusa, his zen mas muveleteket tudunk vegezni egy string tipusban taro It ertekkel (meg, ha az szam is), mint egy integer tipusu ertekkel. A valtozo tipusariak lekerdezesere a get type () fuggveny szolgal, melynek parametere a valtozo neve, es eredmenye a valtozo tipusa. A kovetkezo szkript (get type_fv . php) megmutatja, hogy kell egy valtozonak erteket adni, illetve, hogy tudjuk a valtozo tipusat lekerdezni:

<?php $teszt;

print ("~rt~k n~lkfili deklarAci6 eset~n a vAltoz6 tipusa: ".gettype( $teszt ));

print ("<br>"(;

$teszt = 5;

print ("Ha a vAltoz6 ~rt~k~nek a S-bt adjuk meg, akkor a vAltoz6 tipusa: ". gettype ( $teszt ));

print ("<br>");

$teszt = "o t v:

print ("Ha a vAltoz6 ~rt~k~nek az bttbt (betfikkel) adjuk meg, akkor a v a Lt.o z o tipusa: ".gettype( $teszt )); print("<br>"); $teszt = 5.0;

print ("Ha a vAltoz6 ~rt~k~nek S.O-At adjuk meg, akkor a vAltoz6 tipusa: ". get type ( $teszt ));

print ("<br>") ;

$teszt = true;

print ("Ha a vAltoz6 ~rt~k~nek true-t adjuk meg, akkor a vAltoz6 tipusa: ".gettype( $teszt ));

print ("<br>");

?>

A pr in t ( n <br> n ); utasitas sortores beszurasat eredrnenyezi. A PHP es a HTML kapcsolata ugy mukodik, hogy a PHP szkriptunk egy sora (egysege) lefut, ami ad valamilyen kimenetet a HTML fele, es a bongeszonk ezt az eredmenyt Irja ki.

69

Ertek nelkuli deklaracio eseten a VrutOZ0 tipusa NULL

Ha a valtozo ertekenek a 5-ot adjuk meg, akkor a valtozc tipusa integer

Ha a valtozo ertekenek az ottot (betukkel) adjuk meg, akkor a valtozo tipusa strmg Ha a valtozo ertekenek a 5. O-at adjuk meg, akkor a valtozo tipusa: double

Ha a valtozo ertekenek a true-t adjuk meg, akkor a valtozo tipusa boolean

15. abra A gettype.php futas! eredmenye

A peldankban a print () fUggveny kiirja a HTML szamara a <br>, azaz sortores tagot, amelyet a bongeszonk ertelmez es a kovetkezo kiirast uj sorba kezdi. a <br> a HTML programozasban bir utasitas jelleggel, a PHP szamara nem ertelmezheto, mint utasitas. A get type () fuggveny e16tti pont (.), ket szoveg osszefuzesere szolgal,

Ha arra vagyunk kivancsiak, hogy egy valtozo olyan tipusu-e mint amit szeretnenk akkor az is_type () fUggveny hasznalhatjuk, megpedig ugy, hogya type helyett a kerdeses tipust (integer, double, array) irjuk:

?>

<?php

$teszt = 12;

if (is_int($teszt))

print("Va16ban integer tipus6 a sz~munk!");

Az if utan, ha igaz a feltetel, akkor a kovetkezo sort (blokkot) hajtja vegre, ha nem igaz, akkor az azt kovetot (reszletesen kes6bb talalkozunk az if hasznalataval).

16. abra Az is_int.php futasi eredmenye

70 Webes adatbilzis-kezeles MySQL es PHP hasznalataval

GyakoIi feladat, hogy egy valtozo tipusat rnegvaltoztassuk, erre a set type () fUggvenyt hasznaljuk. A konvertalas soran oda kell figyelnunk arra, hogy:

• karakter tipusu valtozokat csak akkor konvertaljunk numertkussa (integer, double), ha karaktersorozat megfeleltethet6 egy szamnak, pI.: 5.32 j6, de a 12.45.4 mar nern

ha integerre konvertaljuk a valtozo erteket doubleb61, akkor a kerekites szabalyaival egessze valtozik az ertek

ha boolean tipusura valtoztatjuk a valtozo tipusat, akkor annak erteke vagy 1 vagy 0 lesz

a valtozo tipusanak megvaltozasaval jaro konverzi6 nem megfordithato, ha elveszetek a tizedes ertekeink, akkor azok vegleg elvesztek

<?php

$teszt= 5.25;

print ("A v~ltoz6 ~rt~ke: ".$teszt."<br>");

print ("A deklar~ci6 ut~n a v~ltoz6 tipusa: ".gettype( $teszt ) . "<br>") ;

print ("<br>");

settype($teszt, 'string');

print ("A v~ltoz6 ~rt~ke sting-g~ konvert~l~s ut~n: " .$teszt."<br>") ;

print ("Av~ltoz6 tipusa: ".gettype( $teszt )."<br>"); print ("<br>");

settype($teszt, 'integer');

print ("A v~ltoz6 ~rt~ke integer-r~ konvert~l~s ut~n: " .$teszt. "<br>");

print ("Av~ltoz6 tipusa: ".gettype( $teszt )."<br>"); print ("<br>");

settype($teszt, 'double');

print ("A v~ltoz6 ~rt~ke double-v~ konvert~l~s ut~n: " .$teszt. "<br>");

print ("A va Lt.oz o tipusa: ".gettype( $teszt ) ."<br>"); print ("<br>");

settype($teszt, 'boolean');

print ("A v~ltoz6 ~rt~ke boolean-~ konvert~l~s ut~n: " .$teszt."<br>") ;

print ("Av~ltoz6 tipusa: ".gettype( $teszt )."<br>"); ?>

A peldankban lathato, a settype () fUggveny hasznalata, melyben a fuggveny els6 parametere a valtozo neve, mig masodik pararnetere a valtozo kivant tipusa. Ha olyan erteku valtozonak probaljuk a tipusat konvertalni, amelynek nem lehet megfelel6

3. A PHP nyelv alapjai

71

erteke az u] tipussal Ipeldaul egy karakterekb61 a1I6 szoveget egesz szarnma), akkor hamis (0) eredmenyt fogunk kapni. Ki is probalhatjuk ezt, ha a $teszt valtozonk ertekenek egy szoveget adunk meg (pl.: "teszt szoveg").

A valtozo erteke 5 25

A deklaracio utan a valtozo tipusa: double

A valtozo erteke sting-ge kcnvertalas utan 5.25 A valtozo tipusa: string

A valtozo erteke integer-re konvertalas utan 5 A valtozo tipusa: integer

A valtczo erteke double-ve konvertalas utan 5 A valtozo tipusa double

A valtozo erteke boolean-e konvertalas utan:

A valtozo tipusa boolean

17. abra A settype_fv.php futasl eredmenye

A tipus valtoztatasnak van egy explicit rnodja is, amikor az ertekadas soran a valtozo neve ele beirjuk a tipusat is (tipus ($val t.oz orrev ) formaban:

<?php

$teszt= 3.14;

$tarolo = (integer)$teszt;

print("Itt rn~g double: ".$teszt."<br>"); print("Itt rn~r integer: ".$tarolo);

?>

A peldankban a $tarolo erteke mar integer tipusu, es ha ezzel a m6dszerrel adunk erteket egy valtozonak, akkor az eredeti erteke nem valtozik a $teszt tovabbra is az eredeti erteket tartalmazza.

72

18. abra Az explicit.php futas! eredmenye

A tipus ellenorzesere es a rnegvaltoztatasara nem lesz szuksegunk a napi munka soran tul gyakran, ha a szkriptjeink irasa soran k6vetkezetesen hasznaljuk valtozoinkat, numerikus adatot numerikus adatkent tarolunk, sztringet pedig sztingkent.

Ha egy tobb soros szoveget szeretnenk tarolni es feldolgozni, akkor heredoc szintaxisban kell azt tarolni, ugyanis ebben az esetben tarolodnak a specialis karakterek is. Az ilyen szintaxis kezd6 eleme a «< azonosi t6, majd ezt k6veti a sz6veg tobb sorban es az utols6 sorban sz6k6z, tabulator es egyeb karakterek nelkul ujra az azonosit6 (heredoc _ php) :

<?php

$str = «<PROBA

Ez egy heredocszintaxissal tobb sorban tarolt szoveg, mely gyakorlasra szolgal PROBA;

$str = str_replace ("\n","<br>",$str); print ("$str");

?>

Az str_replace () fuggveny segitsegevel a szovegben Ievo sortoreseket (\ n) atalakitottuk a HTML szamara ertelrnezheto sortoresre (cbr»).

3. A PHP nyelv alapjai

73

Ez egy heredocszintaxissal tobb sorban tarolt szoveg, mely gyakorlasra szolgal

19. abra A heredoc.php futasi eredmenye

Ha egy level szovegebe szeretnenk beszurni a $str valtozo erteket, akkor nines szukseg a karaktercserere.

Lehetosegunk van arra is, hogy egy valtozo altal hasznalt tarteruletet uj nevvel lassuk el, nines mas dolgunk mint egy aliast vagy mas neven hrvatkozast rendelni a valtozohoz. A hivatkozast az eredeti valtozoriev helyett hasznalhatjuk, mert ugyanazt a tarteruletet cimzik meg es ugyanugy lehet veluk barmilyen rnuveletet vegrehajtani. A hivatkozasokrol bovebben a fuggvenyek hasznalatarol sz616 fejezetben olvashatunk. A kovetkezo egyszeru pelda segitsegevel betekinthetunk a deklaracioba, amelyhez egy & jel szukseges es a hasznalataba, mely ugyanugy mukodik, mint barmilyen masik valtozo (hivatkozas .php):

<?php $x=5; $f=&$x;

print("Az f v~ltoz6 ~rt~ke: $f<br>"); $f+=2;

print("Az f v~ltoz6 ~rt~ke: $f<br>"); print("Az x v~ltoz6 ~rt~ke:$x");

?>

Lathatjuk, hogy az $ f valtozo teljes mertekben helyettesitheti az $x valtozot mind ertekadasnal, mind, a print () fUggveny parametereken t.

74

20. abra A hivatkozas.php futaai eredmenye

Fuggvenyhivasoknal es a programjaink tesztelese soran gyakran el6fordulhat, hogy kivancsiak vagyunk egy valtozonk letezesere, illetve arra, hogy a valtozonknak adtunk-e erteket. Erre a PHP-ban az isset () es az empty () fuggvenyeket hasznalhatjuk:

?>

<?php

if (isset($x)) {

echo 'Az x valtozo letezik<br>, ; if (ernpty($x))

echo 'Az x valtozo tires';

else

echo 'Az x valtozo nern letezik';

Az isset () fUggveny segitsegevel megallapithatjuk, hogy a valtozo letezik-e, az empty () fuggveny segitsegevel pedig megvizsgalhatjuk, hogy a valtozonak adtunk-e erteket,

Att6l hogy egy valtozo letezik, meg nem biztos, hogy van erteke, de ha a valtozot nem deklaraltuk, akkor biztosan nines erteke.

Az x valtozo nem letezik

21. abra Az isset_fv.php futas! eredmenye

3. A PHP nyelv alapjai

75

3.2.2. Konstansok szerepe

Barmely szkript irasa soran elofordulhat, olyan helyzet, hogy olyan .valtozot" kell hasznalnunk, amelynek erteke a futas soran nem valtozik, nem valtozhat. Az ilyen programozasi eszkozt kons tansnak nevezzuk. A konstans letrehozasara a PHP-ben a define () fuggvenyt hasznalhatjuk, melynek ket parametere van a konstans neve, valamint az erteke. Az ertek egyarant lehet szam, szoveg, vagy Iogtkai ertek,

A konstansok neveit a hagyornanyoknak megfele16en nagy betuvel irjuk es a konstans azonositasahoz nem kell a $ jelet vagy idezojelet hasznalni. A konstans hasznalatahoz nezzuk meg a kovetkezo programot:

<?php

define ( "FELHASZNALO", "Kedves Fe Lha s z na Lo ! ? , true ); print "Udv6z611ek ".FELHASZNALO;

?>

A define () fuggveny harmadik pe r-ame t e r ene k true ertekure allitasaval elerhetjuk, hogy a konstansra val6 hivatkozasnal ne legyen szerepe a kis- es a nagybetuknek.

22. abra A konstans.php futasi eredmenye

Ebben az esetben mindegy, hogy a hivatkozasban FelHasznalO, vagy felhasznalo szerepel. Alapertelrnezesben -ha nem adunk meg sernmit- a szkript kulonbseget tesz a kulonfele valtozatok kozott.

3.2.3. Operatorok es kifejezesek hasznalata

Az el6z6 fejezetben megtsrnerkedhettunk egy specialis operatorral, amit a hetkoznapi eletben csak az ertekado operatornak szoktunk nevezni, ez kulonleges jet pedig az ,,=" jel.

76

Webes adatbazis-kezeles MySQL es PHP hasznalataval

Az operator jel, valamint az operandus vagy operandusok alkotjak a kifejezeseket. Altalaban az operatort balrol es jobbrol is operandus zarja pl.: 6 + 2, ahol a 6 es a 2 az operandus, a + jel az operator.

A PHP hasonl6an nehany mas programozasi nyelvhez szinte barhol megengedi, hogy egy valtozot deklaraljunk, aminek kovetkezteben szinte barhol tudunk erteket adni ezeknek, a valtozoknak print ($teszt="haz").

Az operatorok masik es talan hasonl6an gyakran hasznalt fajtaja az aritmetikai operatorok csoportja. Ezen operatorok azokat a matematikai muveletek hajtjak vegre, amelyek hasznalataval az iskolai tariulmanyaink alatt megismertunk. Ezek az operatorok a negacio (-$x) az osszeadas (+l. a kivonas (-), a szorzas (*), az osztas (j), es a maradekosztas (%). A rnaradekosztas eredmenye a bal oldali szarn, a jobb oldali szammal torteno osztasanak rnaradeka (pl.: 10%3 =1).

Az osszefiizo operatorrol mar korabban volt szo. Ket operandus osszefuzesere a pont (.) operator hasznalhato, Ez az operator kozvetlenul kapcsolja ossze a ket oldalan leva ertekeket, nem tesz kozejuk szokozt,

Az osszetett ert.ekado operatorok a leggyakrabban hasznalt operatorok, lenyegeben ket operatort kapcsolhatunk vele ossze, az aritmetikait es az ertekado. Valamennyi osszetett ertekado utasitasnak ket alakja van, de barmelyik format is hasznaljuk az eredrneny ugyan az lesz. Ezt az operator a valtozok ertekenek megvaltoztatasara hasznaljuk:

Az eddig megismert operatorral a prograrnozasunk soran valamennyi jelentosebb aritmetikai muveletet el tudunk vegezni, van azonban egy rnuvelet, amelyet meg ennel is egyszerubben megoldhatunk, megpedig a valtozo ertekenek noveles vagy csokkentese eggyel. Az eddig tanultak alapjan ezt el tudjuk vegezni a $x = $x + 1 vagy a $x += 1 kifejezesekkel, de ermel talan egyszerubb a $x++ kifejezes, valamint ennek ellentetje a $x--, amelya valtozo erteket csokkenti eggyei.

3. A PHP nyelv alapjai

A $x++ es a $x-kifejezesek utonovekmenyes operatorok, ami azt jeleriti, hogy a valtozo ertekenek megvaltoztatasa csak az esetlegesen mellette leva rnasik operator altal vegrehajtott muvelet utan tortenik:

$x =5;

$x++ <6 II igaz lesz, mivel az $x erteke csak az osszehasonlitas utan kerul novelesre

A elonovekrnenyes operatorok ++$x es a --$x eseteben eloszor vegrehajtodik a valtozo ertekenek megvaltoztatasa, majd utana tortenhetnek az u] ertekkel az egyeb rnuveletek:

--$x <6 II hamis lesz, mivel az $x erteke mar az osszehasonlitas elott modositasra kerult

A bitorientaIt operatorok segitsegevel lehetosegunk van szamokon valamint szovegeken bitmuveleteket, peldaul maszkolast vegeznt es ezzel megvaltoztatni a valtozo erteket. Ezen operatorok segitsegevel lehetosegunk van peldaul a szovegunk kodolasara, Leggyakrabban hasznalt bitorientalt operatorok:

&

t lesz '1' az eredmenyben, ahol $a es $b mindegyikeben az a bit '1'-es, Minden mas biten '0',

t lesz '1' az eredmenyben, ahol $a es $b k6zul legalabb az egyik azon a bitje '1'-es, Minden mas

i ten '0',

tt lesz '1' az eredmenyben, ahol $a es $b k6zul csakis pontosan az '1' allt, Minden mas biten

~ $b

a bitjeit $b olja (minden bitnyi eltolas 2-vel 10 szorzast jelent [amig el nem $a« $b fogynak a bitek, utolso helyen e16-

i e Lb i.t; van?!])

$a bitjeit $b szamu bittel jobbra tolja (minden bitnyi eltolas 2-vel

10 egesz-osztast jelent, [Vi- $a » $b

azz, negativ szamot inkabb ne

Ij jobbra'])

77

I $b

<?php

print (12 A 9); II '5' -at ir ki

print ("12" A "9"); 1* kiirja a visszaperje1 karak-

tert (ASCII #8), mert ('1' (ASCII #49)) A ('9' (ASCII #57)) (ASCII #8)*1

print ("hallo" A "hello");

1* e.r edmeny : #0 #4 #0 #0 #0 II

'a' A 'e' = #4*1

?>

Az osszehasonlito operatorok feladat a bal es a jobb oldalon levo operandus osszehasonlitasa. Az eredmenynek ket erteke lehet igaz (true, 1) vagy hamis (false, 0) aszerint, hogya feltetel igaz vagy nem:

>

$x >= 5

'="Hf':l,b\

$x -- 5

== egyen16 a bal egyen16 a jobb oldal

=== azonos a ket oldal nemcsak ertek szerint, hanem tipusat tekintve is megegyezik

$x --- 5

'= nem egyen16 a bal es a jobb oldal nem

egyen16

$x '= 5

'== nem azonos a bal es a jobb oldal nem azo-

$x ,== 5

nos

a ba1 olda1 nagyobb oldalnal

$x > 5

nagyobb mint

kisebb mint

a bal oldal kisebb mint a jobb

$x < 5

<

nagyobb egyen16

a bal olda1 nagyobb vagy egyen- 16 a jobb oldallal

$x >= 5

>=

kisebb egyen16

a bal oldal kisebb vagy egyen16 a jobb oldal1al

<=

A '=' jel ertekado operator nem hasznalhato osszehasonhtasrat A hibakeze16 operator (@) hasznalataval a kifejezesben szerep- 16 nem szemantikai hiba nem jelenik meg hibauzenetkent, a hibak a felhasznalo e16l rejtve maradnak. Az alabbi peldaban nem kapunk hibauzenetet, ha a ku1cs nem letezik:

$ertek = @$tomb[$kulcs];

A logikai operatorok segitsegevel ket operandus, vagy ket OSZszehasonlit6 feltetel altal keletkezett logikal ertek osszehasonlitasara hasznalhatjuk.

3. A PHP nyelv alapjai

79

Az eddik megtsmert operatorok szarna soknak tunhet szamunkra, de nehany 6ra gyakorlas es nehany elrontott feladat utan tudni fogjuk, melyik operatort, mikor kell hasznalnunk. Miel6tt azonban tovabbmennek, akad meg egy fontos dolog, megpedig a muveletek vegrehajtasi sorrendje, amit a kovetkezo tablazat tartalmaz.

Az asszociatfvitas azt jeleriti, hogy az egy szinten levo operatorok milyen sorrendbe hajtodnak vegre, ha nines zarojel hasznalatban, A muveletek vegrehajtasanak sorrendje a kovetkezo: minel lejjebb talalhato az operator annal er6sebb (hamarabb hajt6dik vegrel es egy sorcn belul a vegrehajtas sorrendjerol az aszszociativitas dont, Osszehasonlito operatorok eseteben nem ertelmezhet6 az asszociativitas. A tablazatban szerepl6 sorrendet zarojelek hasznalataval barmikor m6dosithatjuk.

Fontos tudnunk, hogy a PHP-ban nehany mas programozasi nyelvt6l elteroen a logikai hamis egyen16 a a-val, minden mas szam logikai muveletekben igaznak szarnit, meg a negativ ertekek is. Tehat ha Iogikat tipusuva konvertalunk egy valtozonk tipusat, akkor barmilyen nullatol kulonbozo ertek eseten igaz (1) erteket vesz fel a valtozonk, ha nullat konvertaljuk logikai tipusuva, akkor a nulla (0) ertek fog tarolodni. A memoriaban az igaz (true) I-kent, a hamis (false) a-kent tarolodik.

?>

80

Webes adatbazis-kezeles MySQL es PHP hasznalataval

3.3. Vezerlesi szerkezetek

A vezerlesi szerkezetek hasznalata nelkul a programunk 50[rol-sorra haladva hajt6dna vegre, nem hagyva lehetoseget arra, hogy a program bizonyos utasitasokat rnegismeteljen, vagy bizonyos feltetelek eseten vegrehajtson valamilyen utasitast. Ez meglehetosen merev megoldast jelentene, gyakorlatilag megoldhatatlanna tenne barmilyen feladat hatekony megoldast. Valamennyi vezerlesi szerkezet felteteleket hasznal, arra hogy mi legyen a kovetkezo vegrehajtando utasitas, legyen az egy elagazas, vagy egy ciklus. Vezerlesi szerkezetek rnegfelelo hasznalataval a programunk attekinthetove es dinamikusan valtozova valik,

3.3.1. Felt.etefes utasttasok

A felteteles utasitasok arra szolgalnak, hogy a szkriptunk bizonyos pont jan egy feltetel megvizsgalasa utan valamilyen iranyba haladjon tovabb a szkriptunk futasa.

3.3.1.1. Az if utasttas

Az if utasitas arra szolgal, hogy a kifejezes kiertekelese utan a program vegrehajtsa-e a so ron kovetkezo utasitas blokkot, vagy utasitast (if_utasitas .php):

<?php

$ igaze = H igen H ;

if ( $igaze == HigenH {

print (HT~nyleg igazl I IH); } ;

Ebben az szkriptben az if utasitas utani kifejezes erteke igaz (true), ezert a kapcsos zarojelek { } kozotti utasitasblokk hajt6dik vegre, ami jelen esetben egy utasitasbol all. A blokk vegrehajtasa utan a szkript futasa a blokk utani elso utasitas vegrehajtasaval folytat6dik.

3. A PHP nyelv alapjai

81

23. abra Az if_utasitas.php futasi eredmenye

Az if utasitast kiegeszitve el se zaradekkal elerhetjuk, hogy a szkriptunk a kifejezes kiertekelese utan, akkor is vegrehajtson egy blokkban levo utasitassorozatot, ha a kifejezes erteke false (if_else_utasitas .php):

print ("Tenyleg igaz I I I") ;

<7php

$igaze = "nem";

if ( $igaze == "igen" {

else {

print ("Megsem igazl I I"); }

7>

Mivel az if utani kifejezes erteke harnis (false) igy az else ag fog vegrehajtodni.

24. abra Az if_else.php futas! eredmenye

A if utasitasnak letezik egy elseif zaradeka is, amelyben ujabb kifejezest adhatunk meg, es aszerint, hogy melyik kifejezes igaz, hajtodik vegre az azt koveto utasitasblokk, illetve az else ag utani utasitasblokk (elseif_utasitas .php):

<?php

$igaze = "nero";

if ( $igaze == "igen" {

print ("Tenyleg igazlll");

elseif ($igaze== "nero") {

print ("Nero igaz I I ''') ; }

else

{

print ("Nero t.udom , hogy igaz-e?!"); }

?>

Lathatjuk, a szkriptunk lefutatasa soran az elseif ag kerul vegrehajtasra, mert a kifejezes erteke, akkor valik igazza, ha a valtozonak mas erteket (nem "igaz") adunk, akkor az else agban leva utasitasblokk hajt6dik vegre,

25. abra Az elseif.php futasl eredmenye

3.3.1.2. Az switch utasitas

A swi tch utasitas szolgal a tobbiranyu elagazas kezelesere, Segitsegevel tobb alternativ iranyba is folytat6dhat a program futasa. A swi tch utani kifejezes -cllentetben az if utasitas utani kifejezessel- tobb erteku is lehet es az osszehasonlitas az egyes case agakban tortenik. A defaul t ag akkor hajt6dik vegre, ha egyik case ag eseteben sem bizonyul az kifejezes megfelelonek, Ugyelnunk kell arra, hogy valamennyi case ag le legyen zarva break utasitassal, kulonben az elsa igaz ag utan kovetkezo case agakban szereplo utasitasok is vegre fognak hajtodni. A swi tch utasrtas utani kifejezes alta laban egy valtozo szokott lenni (switch.php) :

<7php

Snap = "cstitOrtOk"; switch $nap) {

case "hetf6":

print "Ma hetf6 van"; break;

case "kedd":

print "Ma kedd van"; break;

case "szerda":

print "Ma szerda van"; break;

default:

print "Ma a he t; ma s od i.k f e Leberi jarunk vagy rossz a nap nevenek megadasa.";

7>

Ez a kis szkriptunk megvizsgalja a Snap kifejezes erteket, rnajd osszehasonlitja a case agakban szerepl6 ertekekkel es ha valamelyiket tgaznak talalja (nines ilyen ag), akkor lefuttatja a kovetkez6 break utasitasig, vagy ha egyik sem igaz akkor lefuttatja a defaul t agat, majd a case szerkezet utani k6vetkez6 utasitassal folytatja a programunk futasat,

26. abra A switch.php futasi eredmenye

3.3.1.3. A termincilis operator

Ezen harom reszbol a116 [t e rmi ne Li.s] operator segitsegevel, egy valtozonak adhatunk erteket, megpedig egy feltetel segitsegevel, az egyes reszek ? jellel es .-tal vannak elvalasztva (terminal is. php) :

<7php $igaze="igaz"; $szoveg = ($igaze hogy nines igazarn"; print ("$szoveg"); 7>

"igaz")7 "Hurr~ igazarn van"

"De kar ,

A szkript a $szoveg valtozonak a kerdojel utani els6 erteket fogja atadni, mivel a kifejezes erteke igaz. Ha a $igaze valtozo erteket megvaltoztatjuk, akkor pedig a':' utani erteket fogja felvenni a $szoveg valtozo.

27. abra A terminalis.php futas! eredrnenye

3.3.2. Ciklusok

A eiklusok egy utasitasblokk tobbszori vegrehajtasara alkalmazott programoz6i eszkoz. A PHP lehetove teszi szamunkra mind az el6tesztel6, mind a hatultesztelo, valamint a szamlalo eiklusok hasznalatat.

3.3.2.1. A while ciklus hasznalata

A legegyszerubben hasznalhato eiklus utasitas a while () eikIus, amely addig hajtja vegre az utana kapesos zarojelben leva utasitasblokkot, mig a while () utani zarojelben levo kifejezes igaz, ez az el6tesztel6 eiklusok jellemz6je. El6fordul, hogya kifejezes mindig hamis, akkor az utasitastomb soha nem hajt6dik vegre. Ha allandoan igaz es nines semrnilyen a eiklusb61 kilepteto utasitas, akkor a eiklusunk vegtelenszer fog vegrehajtodni, ami nem biztos, hogy tul szerencses. Ha vegtelen eiklust keszitettunk es abba belepunk, akkor a szkriptunk futasat esak a bongeszonk bezarasaval tudjuk .Jeallitani'', ez esetben az addigi munkank el is veszhet. A feladatban (while.php) egy szamlalot keszitunk, amely elszarnol kileneig es minden erteket u] sorba ir.

<?php $i=l;

while ($i<10) {

print ("A s z amunk : $i<br>"); $i++;

}

?>

A szkriptunk, azert szamol csak kilenctg mert ha az $ i val tozonk elert a tizet a kifejezes erteke hamissa fog valni, igy a ciklus mar nem fog tobbszor lefutni.

A szamunk: 1 A szamunk 2 A szamunk 3 A szamunk 4 A szamunk: 5 A szamunk 6 A szamunk: 7 A szamunk: 8 A szamunk 9

28. abra A while.php futas! eredmenye

Az while () e16teszte16 ciklust gyakran fogjuk alkalmazni, arnikor az adatbazisunkbol adatot nyerunk ki, amikor egy tornbot vagy egy allomanyt olvasunk. Termeszetesen a kifejezes tetszoleges bonyolultsagu lehet, a lenyeg az, hogy a vegen lehet6leg valarnilyen logikai erteket adjon.

3.3.2.2. A do ... whileO ciklus hasznalat

A k6vetkez6 ciklikus utasitas a do ... while () ciklus, amelyegy hatultesztelo ciklus. A hatultesztelo jellernzoje, hogya ciklus addig fut, amig a while () utani kifejezes harnissa nem valik, azaz arnig a bent maradasi feltetel igaznak ertekelodik ki. Ebben az esetben a do es a while () kozotti utasitasblokk hajtodik vegre a kilepesi felteteltol fUgg6en legalabb egyszer. Fontos, hogy a ciklusban levo utasitasblokk legalabb egyszer vegrehajtodik. A kovetkez6 programunk is addig szarnol, mig a $ i valtozo el nem eri a tizet (do_while. php) :

<?php $i=l; do

print ("A s z amun k : $i<br>"); $i++;

}

while ($i<lO) ?>

A feje tetejere allitott ciklus szinten kilencig fogja kiiratni az ertekeket, hiszen, ha az $i valtozo eleri a tizet, akkor a while () utani kifejezes erteke harnissa valik es kilep a ciklusb61.

A szamunk: 1 A szamunk: 2 A szamunk: 3 A szamunk 4 A szamunk 5 A szamunk 6 A szamunk 7

29. libra A do_while.php futas! eredmenye

3.3.2.3. A for'[] ciklus hasznalata

A for () utasitas, a whilef) utasitas specialis esete, viszont szamlalasi, illetve lista megjelenitesere konnyebben hasznalhato, mint a while (). A for () utasitasban levo zarojelben meg adhatjuk a ciklusvaltozo kezdeti erte ket , a bent maradasi feltetelt, valamint a ciklusvaltozo novelesenek, csokkentesenek modjat), pontosvessz6vel elvalasztva, ha valamelyik pararnetert nem adjuk meg, akkor azt egymas utani pontosvessz6vel jelolhetjuk, de ebben az esetben a ciklus vegrehajtasa bizonytalanna valhat, konnyen kialakulhat vegtelen ciklus). A feladatunkban keszitunk egy nagyon egyszeru szorzotablat, mely l-t6l IO-ig megszorozza a 3-at es az eredrnenyt kiirja for. php) :

<?php

for ( $i=l; $i<ll;$i++) {

print(" <br>3 * $i =" 3*$i); }

?>

3"'1=3 3"'2=6 3"'3=9 3'" 4 = 12 3 '" 5 = 15 3 '" 6 = 18 3"'7=21 3" 8 = 24 3 '" 9 = 27 3" 10 = 30

30. abra A for.php futast eredmenye

A feltetel kivetelevel a tobbi pararnetert kivehetjuk, de a szknptunk futasanak erdekeben a kivett parameterekrol gondoskodnunk kell (for_specialis. php) :

<?php $i=l; for (;;)

{

print(" <br>3 * $i $i++;

if($i>10)

break;

}

?>

3 * $ i) ;

A kisse furcsa for () utasitasban, az ertekadast korabban megoldottuk, a valtozo ertekenek megvaltoztatasat beraktuk az utasitasblokkunkba, a kilepesrol pedtg az if () utasitasblokkjaban levo break utasitas gondoskodik, amely csak akkor hajtodik

88 Webes adatbazis-kezeles MySQL es PHP hasznalataval vegre, ha a $i valtozo erteke nagyobb lesz, mint 10. A break utasitassal barmikor elhagyhatjuk a ciklusmagunkat.

3*1=3 3*2=6 3"3=9 3*4=12 3 * 5 = 15

31. abra A for_specialis.php futasi eredmenye

Nehany esetben elofordulhat, hogy a ciklusunk futasa soran bizonyos feltetelek meglete eseten a ciklusmag ne fusson le es a ciklusbol ne lepjunk ki. Ilyen eset amikor egy osztotablat keszitunk es nem akarjuk, hogy az osztonk erteke nulla legyen, hiszen matematika orarol tudjuk, hogy a nullaval valo osztas nem ertelmezheto muvelet. A PHP, mas programozasi nyelvekkel ellentetben nem all le a fenti esetben csak hibauzenetet kuld, ami valljuk be nem egy szep dolog a honlapunkon. Ennek a problemanak megoldasara hasznalhatjuk a continue utasitast (continue .php):

<?php

for ($i=10;$i>-10;$i--) {

if ($i==O) continue;

print(" <br>100 / $i = ". 100/$i); }

3. A PHP nyelv alapjai 89

A szkriptunk bongeszoben valo futasakor lathatjuk, hogy 10- t6l -lO-ig elvegzi az osztast, de az if () utasitas hatasara a O-at kihagyja, de a ciklus futasa tovabb folytat6dik.

1001 10 = 10

100 1 9 = 11. 1111111111 100/8=12.5

100 i7 = 14.2857142857 100 1 6 = 16.6666666667 10015 = 20

10014 = 25

100/3= 33.3333333333 100/2=50 100/1=100

100 1 - 1 = - 1 00 100/-2=-50

1001 -3 = -33.3333333333 1001 -4 = -25 100/-5=-20

100 1 -6 = -16.6666666667 1001 -7 = -14.2857142857 100/-8=-12.5

100 1 - 9 = -11. 1111111111 100 1 -10 = -10

32. abra A continue.php futas! eredrnenye

3.3.2.4. Egymasba agyazott ciklus

T6bbdimenzi6s tornbok (reszletesen kesobb). valamint adatbazisb6l va16 lekerdezesek soran szinte mindig clofordul, hogy adatainak tablazatos formaban kell megjelenitenunk. Ennek megva lositasara hasznalhatunk egymasba agyazott ciklusokat. A kulso ciklus a sorok megjeleneset szabalyozza, a belso ciklus az oszlopoket, Egy egyszeru pelda segitsegevel tekintsuk meg ket ciklus mukodeset, egy szorzotabla keszito szkript segitsegevel (szorzo .php):

<7php

print ("<table border= \" 1 \ "> \n") ; for ($i=l;$i<ll;$i++)

{

print ("<tr> \n"); for ($j=1;$j<16;$j++)

{

print (" \ t<td>") ; print ($i*$j);

print ("<ltd> \n"); }

print ("</tr>\n"); }

print ("<It able>") ; 7>

Az elsore tal an bonyolultnak tuna szkript.a HTML tagok ismereteben egyszeruve fog szamunkra is valni. A HTML oldalakon barmilyen formazas tag-ek segitsegevel tortenik, legyen a betu kierneles, Igazitas, vagy akar egy tablazat keszitese.

[1-[2'[3'-4-[5- [6'f718"[9- [io'Il1' [12- li3 114 I

f~,··· f~·:: r~; t~~··'{~1·~~·.1~1· f~! •. ~~ ~~r· !~~.: ,~t: [~~ .•• :~~·····I ~ff~:'" ~1.~ !I~·'~§r.~(@'p2. plI3~:-~~-·~[ [fl"~~~'1

is no :15 :20 ,25:30 !35 140 145:50 iSS :60 ,65 170 i

~:-:~: ~ - -. : " ; ~, ;._ _. ~.- , :- , ; , ~, - ~ - - .. ;~ , ; __ _ _ : - ~ - ;···:·",,-,,:·1

:6 '12 :18'24:30 '36:42148 !54 :60:66 02:78 '84 !

[i'- r14 ~21' '2813'5' ~-2~9 fS6' '63' 170-- ~i- r84-"9i-' 1.98--1 1'8- r16 :24 :32 [40 14-8156-164' 172180 18s' :9-6- :104 r1-12 I

, 1 . . . t 1 ,";.

19[18127,36145 [S4J63 172 1 !9oj99 li08 [117 [1261 flO 120 [30 '40 15'6 16'0 lio 180 "90 1100f1-10 [1-20 \130 l14'0

33. abra A szorzo.php futas! eredmenye

A mukodes szernpontjabol fontos dolog, hogy szinte valarnenynyi tag-ot le kell zami (peldaul a <b>-t a < /b>-vel). Jelen esetben egy tablazatot keszitettunk, amely a <table

3. A PHP nyelv alapjai

91

border= \ "1 \ "> \n") utasitassal indul, melyben a table jeloli a tablazat kezdetet, a border parameter segitsegevel allithatjuk be a tablazat szegelyenek vastagsagat (jelen esetben l-re). Fontos dolog, ha olyan erteket szeretnenk atadni a HTML-nek amit ott aposztr6fok koze kell tenni, akkor azt csak ugy tudjuk megtenni, ha ele teszunk egy forditott perjelet (\). A <tr> tag segitsegevel egy u] sort kezdunk a tablazatban a </tr> segitsegevel lezarhatjuk azt a sort. A <td> a soron beluli cella kezdesre szolgal, a <ltd> pedig a cella tartalmanak veget szabalyozza. A \n az uj sort, \ t a tabulatorjelet jeleriti a bongeszonk szamara es segitseget nyujt abba, hogy a bongeszonknek atadott HTML k6d olvashat6 es attekintheto legyen. A forras HTML k6dot a Ne z e t, menuben talalhato Po r r a s menu kivalasztasaval tekinthetjuk meg.

A fenti szkripten addig nem menjunk tovabb, mig nem teljesen vilagos a rnukodese, mert a kovetkezo fejezetek alapjat ez fogja kepezni.

Az egymasba agyazott ciklus feladatat megoldhatjuk while () utasitas hasznalataval is, csak egy kicsit nagyobb gond j6I megcsinalni,

3.3.3. A fiiggvenyek

Valamennyi magas szintu programozast nyelv alapjat a fUggvenyek kepezik, vannak olyan nyelvek, amelyek szinte kizarolag csak fUggvenyeket hasznalnak es nem Ietezik olyan fejlett nyelv, amely nem tsmerne ezt a programozasi eszk6zt. Bonyolultabb feladatok megoldasa a fuggvenyek nelkul nem is lehetseges. Its nem utols6 sorban a fuggveny az ujrafelhasznalhatosag egyik legfontosabb eszk6ze.

De mi is ez a fontos dolog? Nem mas mint egy gep, amelybe belerakjuk az alkatreszeket, a gep csinal vele nehany muveletet es visszaadja az eredrnenyt. S mindez ugy tortenik, hogy a kulso szemlelo nem latja csak az alkatreszeket es az eredmenyt, magat a muveletet nem.

Leegyszerusitve es a programozas nyelvere leforditva a fuggvenyunk kap pararnetereket (adatokat), az adatainkkal vegrehajtja a kert muveleteket, majd visszaad egy eredrnenyt. A fuggveny egy teljesen onallo egyseg, csak akkor fog muveletet vegrehajtaru (a fuggveny lefutni), ha meghivjuk. Akkor, ha egypar soros muveletet csak egyszer vegzurik el eleturikben nem biztos, hogy erdemes ra fuggvenyt irnunk, de ha az adott fuggveny tobbszor is szeretnenk meghivni, esetleg mas szkriptekben hasznalni, akkor mindenkeppen keszitsunk fuggvenyt, A PHP lehetoseget biztosit

7>

92 Webes adatbilzis-kezeles MySQL es PHP hasznalataval arra is, hogy nagyobb es bonyolultabb fuggvenyemek kulon allomanyba taroljuk, es ily m6don akar tobb programunk is hasznalhatja egyszerre.

A kulonfele programozasi nyelvek szamos beepitett fuggvenynyel rendelkeznek (a PHP tobb szazzal), amelyeket mar masok megirtak helyettunk, nekunk csak az a dolgunk, hogy megtanuljuk mire es hogyan tudjuk kihasznalni azok lehetosegett. Azonban meg igy is maradt szamos olyan feladat, amelyre fuggveny; egyaltalan nem, vagy csak nagyon hosszas keresgeles utan talalhatunk, ezert valamennyi programozasi nyelv biztositja a sajat fuggveny kesziteset es hasznalatat. Az altalunk es a programoz6k altal keszitett es publikalt fuggvenyeket osszefoglaloan felhasznalo altal deflnialt fUggvenyeknek nevezzuk.

3.3.3.1. A fiiggvenyek meghfvasa

Ahhoz, hogy egy fUggveny lefusson, a szkriptunk valamelyik rcszen meg kell hivni. A fuggveny meghivasa a fUggveny nevenek, valamint a bemeno pararneterek zarojelben torteno megadasaval lehetseges.

Az eddigi fejezetben is talalkozhattunk mar nehany fUggvenynyel, peldaul a print () fuggveny, melynek pararneterei a kiirand6 sz6veg, vagy az str_replace () fuggveny, amelynek bemeneti pararneterei az egymassal felcserelendo karakterek, valamint a valtozo, amely a szoveget tartalmazza, de ilyen tobbek kozott az abszolut ertek szamitasara hasznalt fUggveny is (fv_hivas .php):

<7php

$szam~ -2442;

$abszolut ~ abs($szam);

print ("A" . $szam." abszolut erteke: $abszolut");

Itt ket fUggvenyt is hasznaltunk, az elso az abs () fUggveny, amelynek eredrneny (vtsszateresi erteke) a parameterenek abszolut erteke, a masodlk, pedig a mar j61 ismert print () fUggveny.

3. A PHP nyelv alapjai

34. abra Az fv _hivas.php futasi eredmenye

93

3.3.3.2. A PHP nyelv fontosabb beepitett fuggvenye!

A PHP-ban tobb szaz beepitett fUggvenyt tudunk elerni, ezek leirasat es hasznalatat a PHP referencia konyvben, illetve a www.php.net oldalon talalhatjuk meg. A szamunkra fontos fUggvenyeket az alabbi tablazatban tekinthetjuk at:

Matematikai fuggvenyek

abs (s z am)

egy s z , vagy

egy lebegapontos

s z am O-t6l va16 abs(-12.653)

tavolsagat adja

vissza

12.653

max (array)

min (array)

min (szam1, szam2, szamn)

($szam,

$tizedesj egyek_ szama.

$tizedesj el, $ezres elvalaszt6

egy tomb legna- ha $x=[12,18,

gyobb erteket adja 5,45]

45

-5

-5

1 254,65

a pi erteket kapjuk segitsegevel 13 szamjegy pon-

pi ()

a ban leva legkisebb erteket adja viszsza (a max() fuggveny is mukodhet

min(12,18,-5,45)

pi ()

sqrt ($szam)

lebegapontos s z am f o rrna z a s a r a hasznaljuk

number_fonnat(1254

.657, 2, , )

sqrt (16)

3.1415 ....

4

a

Sztring fuggvenyek

chop ($szoveg)

.. Ez egy szoveg"

chr($szarn)

el t tj a a s z o- chop ( n Ez egy szb-

veg vegen al16 veg

sz6kbzbket, tabu-

latorokat .. )

A s ASCII karakterenek megfele16 karaktert adja vissza. Az ord ($karakter) az ellente e

chr (82)

R

echo ($szoveg)

szbveg

n12br($szoveg)

egy vagy tbbb karaktert irathatunk

Echo ( .. szbveg")

print ($szoveg)

ki vele

n12br("ez egy szbveg \n egy mas i k vn " )

Az o s s z e s kicsereli a HTML sortoresere cbr>re

egy sztringet irat ki, ha sikerult akkor igaz a viszszateresi erteke

print ( n nem semmi")

strcmp($szoveg1, $szoveg2) )

s trs tr ( $ szoveg, $mit)

strlen($szoveg)

a sz sonlitja ossze a

szoveg2-vel. Az

eredmeny 0, ha azonosak, 1. ha a szoveg1 nagyobb, - I, ha a szoveg2

strcmp ( n semmi", ""v alarni)

ez egy sz6veg egy masik

nem semmi v i s s z at er , hogy

true

-1

4

ez

12

a

melyik strstr( .. De t a l a r- hO"If/j6")

j6

nicsak k i az

strtolower($szo veg)

mea a szoveg hosszat numerikus ertekben

Strlen ("De igy" )

j6

k i s be t us r e konvertalja a sztringet. Ellentettje az

st er ()

strtolower( .. Nicsak Ki Az")

20050528

datum es id6fuggvenyek

visszaadja az aktua1is datumot

Date(Y. m. d)

1117302663

UNIX id6t adja vissza

Time ( )

Az egyik leggyakrabban hasznalt beepitett fUggveny a datum fuggveny, melynek parametereit a kovetkezo tablaban talalhatjuk meg:

napj a, felesleges

1 (kis szbveges

'L' )

L

vagy sern

szamreprezentaci6ja, 2

12-ig

m

M

Dec

n

o

21 Dec 2000

z

z6na eltolas rnasodpercekben. UTe-tal nyugatra rnindig negativ, letre pedig pozitiv.

9S

alatt,

o egyeb-

tho J61 egyiltt.

<7php

function kiir ( )

96 Webes adatbaLis-kezeles MySQL es PHP hasznalataval

Letezik meg egy fontos fUggveny, megpedig a vegtelen szam generalasara, a mt_rand(min, max) fUggveny. A fUggveny viszszateresi erteke egy veletlen szarn a min es a max ertek kozott. Az mt_rand () fejlettebb (veletlenebb szamot general), mint a korabban hasznalt rand ().

Ha adatbazis-kezelesre szeretnenk hasznalni a PHP szkriptjeinket, akkor az adatbazisbol torteno lekerdezes soran szinte valamennyi fuggvenyt elerhetjuk az SQL-ben es a PHP-ben egyarant. Rajtunk rnulik melyiket valasztjuk, de arra erdemes odafigyelni, hogy az SQL-ben hasznalt fuggvenyek az adatbazis szervert terhelik, a PHP fuggvenyek, pedig a web szervert.

3.3.3.3. Felhaszncil6i fiiggvenyek

A felhasznaloi fuggvenyek azok a fuggvenyek, amelyeket mi magunk irtunk a function () parancs utan. A fuggveny deflnialasa soran meg kell adnunk a fUggveny nevet, majd a parametereit. A fuggveny nevere azok a szabalyok vonatkoznak, mint a valtozo nevere: nem lehet benne szokoz, lehet benne szam, betu, alahuzasjel, es egyedinek kell Iennie a szkriptunkben. A parameterlistaba azon valtozokat kell felvenni, amelyeket a fuggveny hivasakor at kivanunk adni a fuggvenyunk belseje szamara, ezek a valtozok altalaban a futastol fUggo tenyezok,

A fuggveny definialasanak mmdig meg kell eloznie a fuggveny hivasat, kulonben hibauzenetet kapunk. Ha belecsunk a fuggvenyek buvos csapdajaba, akkor elkepzelheto, hogy olyan programot is fogunk tudni irni, amely fUggvenyhivasok sorozata. Nezzunk egy peldat egyszeru fUggvenyre (felh_fv. php) :

print("Hel16 vil~g"); }

kiir();

7>

A fuggveny hivasakor nem adtunk meg semmilyen parametert, amelynek az az eredmenye, hogy akarrnikor hivjuk meg a fUggvenyt, mindig ugyanazt a muveletet fogja vegrehajtani.

97

35. abra A kiiras.php futasi eredmenye

Ha azt szeretnenk, hogy a fuggveny hivasakor mas eredmeny

keletkezzen, akkor szuksegunk van parameteratadasra

(param_fv. php) :

<?php

function kiir($szoveg)

{ print("$szoveg<br>") ; }

kiir("Ez az elsa sor"); kiir("A k oz ep s o ... "); kiir("Ez meg az uto16s"); ?>

36. abra A param_fv.php futas! eredmenye

Ha egy kicsit rugalmasabba szeretnenk tenni a fuggvenyunket, akkor lehetosegunk van egy valtozo nevenek atadasara is. Ez az ugynevezett dinamikus fUggvenyhivas (par am_fv2 . php) :

<7php

function kiir($fv_szoveg)

{ print("$fv_szoveg<br>") ; }

$szoveg="Ez az els6 sor"; kiir($szoveg) ; $szoveg="A k6z~ps6 ... kiir($szoveg) ; $szoveg="Ez meg az uto16s"; kiir ($szoveg) ; ;

" . r

7>

37. libra A param_fv2.php futas! eredmenye

A fuggvenyeink rugalmassagat tovabb novelhetjuk, azzal, hogy a hfvott fuggveny formalis parameterhstajaban, az egyes parameterekhez alapertelmezett erteket adunk. Ha a fuggvenyhivaskor nem adunk meg aktualis parametert, akkor a fuggvenylinkben a hivatkozott valtozonk az alapertelrnezett erteket veszi fel (alapert_fv.php):

<7php

function terulet($aoldal, $boldal = 10) {

print ( "A t~glalap t.e r u Le t.e : " $aoldal * $boldal.

B<br>lI) ;

terulet(3,4) ; terulet(3) ; 7>

A masodik terulet () fUggveny hivasakor az aktualis pararneterlista, hianyos, ezert a fUggveny az alapertelmezett erteket veszi figyelembe.

3. A PHP nyelv alapjai

99

A teglalap terulete: 12 A teglalap terulete 30

38. abra Az alapert_fv.pbp futas! eredmenye

A beepitett fUggvenyek jelent6s resze rendelkezik visszaterest ertekkel, ami nem mas, mint a bemen6 parameterekbol, a fUggveny altal eloallitott ertek, Ezt a visszateresi erteket barhova behelyettesithetjiik, ahova valamilyen erteket, legyen az egy sz6veg, vagy egy szarn, be tudunk illeszteni. Azt, hogy mi legyen a visszateresi ertekunk, a return paranes utan megadott valtozonevvel tudjuk beallitani, ha nines return, akkor az utolso kifejezes ertekevel ter vissza a fUggveny (return. php) :

$eredmeny= $szam1 + $szam2; return $eredmeny;

}

$tag1 = 12; $tag2 = 21;

print (osszead($tag1, $tag2)); ?>

<?php

function osszead($szam1, $szam2)

Lathatjuk, hogy az osszead () fUggveny lefutasa utan kerult kiirasra az eredmeny.

Sign up to vote on this title
UsefulNot useful