Adatbázisok Kezelése - MySQL

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 26

12.

RA
Adatbzisok kezelse MySQL
A PHP nyelv egyik meghatroz tulajdonsga, hogy nagyon knnyen kpes adatbzisokhoz csatlakozni s azokat kezelni. Ebben az rban elssorban a MySQL adatbzisokkal foglalkozunk, de amint majd szre fogjuk venni, a PHP ltal tmogatott sszes adatbzist hasonl fggvnyek segtsgvel rhetjk el. Mirt esett a vlaszts ppen a MySQL-re? Mert ingyenes, ugyanakkor nagyon hatkony eszkz, amely kpes megfelelni a vals feladatok ltal tmasztott ignyeknek is. Az sem elhanyagolhat szempont, hogy tbbfle rendszerhez is elrhet. A MySQL adatbziskiszolglt a http://www.mysql.com cmrl tlthetjk le. Ebben az rban a kvetkez tmkkal foglalkozunk: Megnznk nhny SQL pldt. Csatlakozunk egy MySQL adatbziskiszolglhoz. Kivlasztunk egy adatbzist. Tanulunk a hibakezelsrl. Adatokat visznk fel egy tblba.

212

12. ra Adatokat nyernk ki egy tblbl. Megvltoztatjuk egy adattbla tartalmt. Megjelentjk az adatbzis szerkezett.

(Nagyon) rvid bevezets az SQL nyelvbe


JDONSG Az SQL jelentse Structured Query Language, vagyis strukturlt lekrdez nyelv. Az SQL szabvnyostott nyelvezete segtsgvel a klnbz tpus adatbzisokat azonos mdon kezelhetjk. A legtbb SQL termk sajt bvtsekkel ltja el a nyelvet, ahogy a legtbb bngsz is sajt HTML nyelvjrst beszl. Mindazonltal SQL ismeretek birtokban nagyon sokfle adatbzist fogunk tudni hasznlni, a legklnbzbb opercis rendszereken. A knyvben terjedelmi okok miatt mg bevezet szinten sem trgyalhatjuk az SQL-t, de megprblunk megvilgtani egy-kt dolgot a MySQL-lel s ltalban az SQL-lel kapcsolatban. A MySQL kiszolgl dmonknt fut a szmtgpen, gy a helyi vagy akr tvoli gpek felhasznli brmikor csatlakozhatnak hozz. Miutn a csatlakozs megtrtnt, ki kell vlasztanunk a megfelel adatbzist, ha van jogunk hozz. Egy adatbzison bell tbb adattblnk is lehet. Minden tbla oszlopokbl s sorokbl ll. A sorok s oszlopok metszspontjban troljuk az adatokat. Minden oszlopba csak elre megadott tpus adatot tlthetnk, az INT tpus pldul egsz szmot, mg a VARCHAR vltoz hosszsg, de egy adott rtknl nem hosszabb karakterlncot jelent. A kivlasztott adatbzisban a kvetkez SQL utastssal hozhatunk ltre j tblt: CREATE TABLE entablam ( keresztnev VARCHAR(30), vezeteknev VARCHAR(30), kor INT ); Ez a tbla hrom oszlopot tartalmaz. A keresztnev s vezeteknev oszlopokba legfeljebb 30 karaktert rhatunk, mg a kor oszlopba egy egsz szmot. A tblba j sort az INSERT paranccsal vehetnk fel: INSERT INTO entablam ( keresztnev, vezeteknev, kor ) VALUES ( 'Jnos', 'Kovcs', 36 );

Adatbzisok kezelse MySQL A mezneveket az els, zrjelek kzti kifejezssel adjuk meg, mg az rtkeket a megfelel sorrendben a msodik zrjelpr kztt soroljuk fel. A tblbl az sszes adatot a SELECT paranccsal kaphatjuk meg: SELECT * FROM entablam; A * szoksos helyettest karakter, jelentse az sszes mez. Ha nem az sszes mez tartalmt akarjuk lekrdezni, rjuk be az rintett mezk neveit a csillag helyre: SELECT kor, keresztnev FROM entablam; Mr ltez bejegyzst az UPDATE paranccsal mdosthatunk. UPDATE entablam SET keresztnev = 'Gbor'; Az utasts az sszes sorban "Gbor"-ra mdostja a keresztnev mez tartalmt. A WHERE zradkkal leszkthetjk a SELECT s UPDATE parancsok hatskrt. Pldul: SELECT * FROM entablam WHERE keresztnev = 'Gbor'; Ez az utasts csak azokat a sorokat rja ki, amelyekben a keresztnev mez rtke "Gbor". A kvetkez plda csak azokban a sorokban vltoztatja "Gbor"-ra a keresztnev mez rtkt, ahol a vezeteknev mez a "Szakcs" karakterlncot tartalmazza. UPDATE entablam SET keresztnev = "Gbor" WHERE vezeteknev = = "Szakcs"; Az SQL-rl tovbbi informcikat tallunk Ryan K. Stephens s szerztrsai Teach Yourself SQL in 21 Days cm knyvben.

213

12

Csatlakozs a kiszolglhoz
Mieltt elkezdhetnnk dolgozni az adatbzissal, csatlakoznunk kell a kiszolglhoz. A PHP-ben erre a mysql_connect() fggvny szolgl. A fggvny hrom karakterlncot vr paramterknt: a gazdagp nevt, a felhasznl nevt s a jelszt. Ha ezek egyikt sem adjuk meg, a fggvny felttelezi, hogy a krs a localhost-ra (azaz a helyi gpre) vonatkozik s felhasznlknt a PHP-t futtat felhasznlt, jelszknt pedig egy res karakterlncot ad t. Az alaprtelmezs

214

12. ra a php.ini fjlban fellbrlhat, de egy prblkozsra sznt kiszolglt kivve nem blcs dolog ezzel prblkozni, ezrt a pldkban mindig hasznlni fogjuk a felhasznlnevet s a jelszt. A mysql_connect() fggvny siker esetn egy kapcsolatazonostt ad vissza, amelyet egy vltozba mentnk, hogy a ksbbiekben folytathassuk a munkt az adatbziskiszolglval. Az albbi kdrszlet a mysql_connect() fggvny segtsgvel kapcsoldik a MySQL adatbziskiszolglhoz. $kapcsolat = mysql_connect( "localhost", "root", "jelszo" ); if ( ! $kapcsolat ) die( "Nem lehet csatlakozni a MySQL kiszolgalohoz!" ); Ha a PHP-t az Apache kiszolgl moduljaknt hasznljuk, a mysql_pconnect() fggvnyt is hasznlhatjuk az elzekben megadott paramterekkel. Fontos klnbsg a kt fggvny kztt, hogy a mysql_pconnect()-tel megnyitott adatbziskapcsolat nem sznik meg a PHP program lefutsval vagy a mysql_close() fggvny hatsra (amely egy szoksos MySQL kiszolglkapcsolat bontsra szolgl) , hanem tovbbra is aktv marad s olyan programokra vrakozik, amelyek a mysql_pconnect() fggvnyt hvjk. Ms szval a mysql_pconnect() fggvny hasznlatval megtakarthatjuk azt az idt, ami egy kapcsolat felptshez szksges s egy elzleg lefutott program ltal hagyott azonostt hasznlhatunk.

Az adatbzis kivlasztsa
Miutn kialaktottuk a kapcsolatot a MySQL dmonnal, ki kell vlasztanunk, melyik adatbzissal szeretnnk dolgozni. Erre a clra a mysql_select_db() fggvny szolgl, amelynek meg kell adnunk a kivlasztott adatbzis nevt s szksg szerint egy kapcsolatazonost rtket. Ha ez utbbit elhagyjuk, automatikusan a legutoljra ltrehozott kapcsolat helyettestdik be. A mysql_select_db() fggvny igaz rtket ad vissza, ha az adatbzis ltezik s jogunk van a hasznlatra. A kvetkez kdrszlet a pelda nev adatbzist vlasztja ki. $adatbazis = "pelda"; mysql_select_db( $adatbazis ) or die ( "Nem lehet megnyitni a kvetkez adatbzist: $adatbazis" );

Adatbzisok kezelse MySQL

215

Hibakezels
Eddig ellenriztk a MySQL fggvnyek visszatrsi rtkt s hiba esetn a die() fggvnnyel kilptnk a programbl. A hibakezelshez azonban hasznosabb lenne, ha a hibazenetek valamivel tbb informcit tartalmaznnak. Ha valamilyen mvelet nem sikerl, a MySQL bellt egy hibakdot s egy hibazenetet. A hibakdhoz a mysql_errno(), mg a hibazenethez a mysql_error() fggvnnyel frhetnk hozz. A 12.1 plda az eddigi kdrszleteinket teljes programm kapcsolja ssze, amely kapcsoldik az adatbziskezelhz s kivlasztja az adatbzist. A hibazenetet a mysql_error() fggvnnyel tesszk hasznlhatbb.

12.1. program Kapcsolat megnyitsa s az adatbzis kivlasztsa


1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: <html> <head> <title>12.1. program Kapcsolat megnyitsa s adatbzis kivlasztsa</title> </head> <body> <?php $felhasznalo = "jozsi"; $jelszo = "bubosvocsok"; $adatbazis = "pelda"; $kapcsolat = mysql_connect( "localhost", $felhasznalo, $jelszo ); if ( ! $kapcsolat ) die( "Nem lehet kapcsoldni a MySQL kiszolglhoz!" ); print "Sikerlt a kapcsolatfelvtel<P>"; mysql_select_db( $adatbazis ) or die ( "Nem lehet megnyitni a $adatbzist: " .mysql_error() ); print "Sikeresen kivlasztott adatbzis: \" $adatbazis\"<P>"; mysql_close( $kapcsolat ); ?> </body> </html>

12

216

12. ra Ha az $adatbazis vltoz rtkt mondjuk "nincsmeg"-re mdostjuk, a program egy nem ltez adatbzist prbl meg elrni. Ekkor a die() kimenete valami ilyesmi lesz: Nem lehet megnyitni a nincsmeg adatbzist: Access denied for user: 'jozsi@localhost' to database 'nincsmeg'

Adatok hozzadsa tblhoz


Mr sikerlt hozzfrst szerezni az adatbzishoz, gy ideje nmi adatot is bevinni a tblkba. A kvetkez pldkhoz kpzeljk el, hogy az ltalunk ksztend oldalon a ltogatknak lehetsgk lesz tartomnyneveket vsrolni. A pelda adatbzisban ksztsk el az t oszlopot tartalmaz tartomanyok tblt. Az azonosito mez lesz az elsdleges kulcs, amely automatikusan nvel egy egsz rtket, ahogy jabb bejegyzsek kerlnek a tblba, a tartomany mez vltoz szm karaktert tartalmazhat (VARCHAR), a nem mez egyetlen karaktert, az email mez pedig a felhasznl elektronikus levlcmt. A tblt a kvetkez SQL paranccsal kszthetjk el: CREATE TABLE tartomanyok ( azonosito INT NOT NULL AUTO_INCREMENT, PRIMARY KEY( azonosito ), tartomany VARCHAR( 20 ), nem CHAR( 1 ), email VARCHAR( 20 ) ); Az adatok felvitelhez ssze kell lltanunk s le kell futtatnunk egy SQL parancsot, erre a clra a PHP-ben a mysql_query() fggvny szolgl. A fggvny paramterknt egy SQL parancsot tartalmaz karakterlncot s szksg szerint egy kapcsolatazonostt vr. Ha ez utbbit elhagyjuk, a fggvny automatikusan az utoljra megnyitott kapcsolaton keresztl prblja meg kiadni az SQL parancsot. Ha a program sikeresen lefutott, a mysql_query()pozitv rtket ad vissza, ha azonban formai hibt tartalmaz vagy nincs jogunk elrni a kvnt adatbzist, a visszatrsi rtk hamis lesz. Meg kell jegyeznnk, hogy egy sikeresen lefutott SQL program nem felttlenl okoz vltozst az adatbzisban vagy tr vissza valamilyen eredmnnyel. A 12.2 pldban kibvtjk a korbbi programot s a mysql_query() fggvnnyel kiadunk egy INSERT utastst a pelda adatbzis tartomanyok tbljn.

Adatbzisok kezelse MySQL

217

12.2. program j sor hozzadsa tblhoz


1: <html> 2: <head> 3: <title>12.2. program j sor hozzadsa tblhoz</title> 4: </head> 5: <body> 6: <?php 7: $felhasznalo = "jozsi"; 8: $jelszo = "bubosvocsok"; 9: $adatbazis = "pelda"; 10: $kapcsolat = mysql_connect( "localhost", $felhasznalo, $jelszo ); 11: if ( ! $kapcsolat ) 12: die( "Nem lehet kapcsoldni a MySQL kiszolglhoz!" ); 13: mysql_select_db( $adatbazis, $kapcsolat ) 14: or die ( "Nem lehet megnyitni a $adatbzist: ".mysql_error() ); 15: $parancs = "INSERT INTO tartomanyok ( tartomany, nem, email ) 16: VALUES ( '123xyz.com', 'F', 'okoska@tartomany.hu' )"; 17: mysql_query( $parancs, $kapcsolat ) 18: or die ( "Nem lehet adatot hozzadni a \"tartomanyok\" tblhoz: " 19: .mysql_error() ); 20: mysql_close( $kapcsolat ); 21: ?> 22: </body> 23: </html>

12

Vegyk szre, hogy nem adtunk rtket az azonosito meznek. A mez rtke automatikusan nvekszik az INSERT hatsra. Termszetesen minden esetben, amikor a bngszben jratltjk a 12.2 pldaprogramot, ugyanaz a sor addik hozz a tblhoz. A 12.3 plda a felhasznl ltal bevitt adatot tlti be a tblba.

218

12. ra

12.3.program A felhasznl ltal megadott adatok beszrsa a tblba


1: <html> 2: <head> 3: <title>12.3. program A felhasznl ltal megadott adatok beszrsa a tblba</title> 4: </head> 5: <body> 6: <?php 7: if ( isset( $tartomany ) && isset( $nem ) && isset( $email ) ) 8: { 9: // Ne feledjk ellenrizni a felhasznl ltal megadott adatokat! 10: $dbhiba = ""; 11: $vissza = adatbazis_bovit( $tartomany, $nem, $email, $dbhiba ); 12: if ( ! $vissza ) 13: print "Hiba: $dbhiba<BR>"; 14: else 15: print "Ksznjk!"; 16: } 17: else { 18: urlap_keszit(); 19: } 20: 21: function adatbazis_bovit( $tartomany, $nem, $email, &$dbhiba ) 22: { 23: $felhasznalo = "jozsi"; 24: $jelszo = "bubosvocsok"; 25: $adatbazis = "pelda"; 26: $kapcsolat = mysql_pconnect( "localhost", $felhasznalo, $jelszo ); 27: if ( ! $kapcsolat ) 28: { 29: $dbhiba = "Nem lehet kapcsoldni a MySQL kiszolglhoz!"; 30: return false; 31: } 32: if ( ! mysql_select_db( $adatbazis, $kapcsolat ) ) 33: { 34: $dbhiba = mysql_error();

Adatbzisok kezelse MySQL

219

12.3.program (folytats)
35: return false; 36: } 37: $parancs = "INSERT INTO tartomanyok ( tartomany, nem, email ) 38: VALUES ( '$tartomany', '$nem', '$email' )"; 39: if ( ! mysql_query( $parancs, $kapcsolat ) ) 40: { 41: $dbhiba = mysql_error(); 42: return false; 43: } 44: return true; 45: } 46: 47: function urlap_keszit() 48: { 49: global $PHP_SELF; 50: print "<form action=\"$PHP_SELF\" method=\"POST\">\n"; 51: print "A kvnt tartomny<p>\n"; 52: print "<input type=\"text\" name=\"tartomany\"> "; 53: print "Email cm<p>\n"; 54: print "<input type=\"text\" name=\"email\"> "; 55: print "<select name=\"nem\">\n"; 56: print "\t<option value=\"N\"> N\n"; 57: print "\t<option value=\"F\"> Frfi\n"; 58: print "</select>\n"; 59: print "<input type=\"submit\" value=\"Elkld\">\n</form>\n"; 60: } 61: ?> 62: </body> 63: </html>

12

A tmrsg rdekben a 12.3. pldbl kihagytunk egy fontos rszt. Megbztunk a felhasznlkban: semmilyen formban nem ellenriztk a felhasznl ltal bevitt adatokat. Ezt a feladatot a 17. rban trgyalt karakterlnckezel fggvnyekkel vgezhetjk el. Meg kell jegyeznnk, hogy a berkez adatok ellenrzse mindig fontos feladat, itt csak azrt maradt el, mivel gy jobban sszpontosthattunk az ra tmjra.

220

12. ra Ellenrizzk a $tartomany, $nem s $email vltozkat. Ha megvannak, nyugodtan feltehetjk, hogy a felhasznl adatokat kldtt az rlap kitltsvel, gy meghvjuk az adatbazis_bovit() fggvnyt. Az adatbazis_bovit()-nek ngy paramtere van: a $tartomany, a $nem s az $email vltozk, illetve a $dbhiba karakterlnc. Ez utbbiba fogjuk betlteni az esetlegesen felbukkan hibazeneteket, gy hivatkozsknt kell tadnunk. Ennek hatsra ha a fggvnytrzsn bell megvltoztatjuk a $dbhiba rtkt, a msolat helyett tulajdonkppen az eredeti paramter rtkt mdostjuk. Elszr megksrlnk megnyitni egy kapcsolatot a MySQL kiszolglhoz. Ha ez nem sikerl, akkor hozzrendelnk egy hibaszveget a $dbhiba vltozhoz s false rtket visszaadva befejezzk a fggvny futst. Ha a csatlakozs sikeres volt, kivlasztjuk a tartomany tblt tartalmaz adatbzist s sszelltunk egy SQL utastst a felhasznl ltal kldtt rtkek felhasznlsval, majd az utastst tadjuk a mysql_query() fggvnynek, amely elvgzi az adatbzisban a kvnt mveletet. Ha a mysql_select_db() vagy a mysql_query() fggvny nem sikeres, a $dbhiba vltozba betltjk a mysql_error() fggvny ltal visszaadott rtket s false rtkkel trnk vissza. Minden egyb esetben, vagyis ha a mvelet sikeres volt, true rtket adunk vissza. Miutn az adatbazis_bovit() lefutott, megvizsgljuk a visszatrsi rtket. Ha true, az adatok bekerltek az adatbzisba, gy zenetet kldhetnk a felhasznlnak. Egybknt ki kell rnunk a bngszbe a hibazenetet. Az adatbazis_bovit() fggvny ltal visszaadott $dbhiba vltoz most mr hasznos adatokat tartalmaz a hiba termszett illeten, gy ezt a szveget is belefoglaljuk a hibazenetbe. Ha a kezdeti if kifejezs nem tallja meg a $tartomany, $nem vagy $email valamelyikt, feltehetjk, hogy a felhasznl nem kldtt el semmilyen adatot, ezrt meghvunk egy msik ltalunk rt fggvnyt, az urlap_keszit()-et, amely egy HTML rlapot jelent meg a bngszben.

Automatikusan nvekv mez rtknek lekrdezse


Az elz pldkban gy adtuk hozz a sorokat a tblhoz, hogy nem foglalkoztunk az azonosito oszlop rtkvel, hiszen az adatok beszrsval az folyamatosan nvekedett, rtkre pedig nem volt szksgnk. Ha mgis szksgnk lenne r, egy SQL lekrdezssel brmikor lekrdezhetjk az adatbzisbl. De mi van akkor, ha azonnal szksgnk van az rtkre? Flsleges kln lekrdezst vgrehajtani, hiszen a PHP tartalmazza a mysql_insert_id() fggvnyt, amely a legutbbi INSERT kifejezs sorn belltott automatikusan nvelt mez rtkt adja vissza. A mysql_insert_id() fggvnynek szksg esetn tadhatunk

Adatbzisok kezelse MySQL egy kapcsolatazonost paramtert, amelyet elhagyva a fggvny alaprtelmezs szerint a legutoljra ltrejtt MySQL kapcsolat azonostjt hasznlja. gy ha meg akarjuk mondani a felhasznlnak, hogy milyen azonost alatt rgztettk az adatait, az adatok rgztse utn kzvetlenl hvjuk meg a mysql_insert_id() fggvnyt. $parancs = "INSERT INTO tartomanyok ( tartomany, nem, email ) VALUES ( '$tartomany', '$nem', '$email' )"; mysql_query( $parancs, $kapcsolat ); $azonosito = mysql_insert_id(); print "Ksznjk. Az n tranzakci-azonostja: $azonosito. Krjk jegyezze meg ezt a kdot.";

221

Adatok lekrdezse
Miutn adatainkat mr kpesek vagyunk az adatbzisban trolni, megismerkedhetnk azokkal a mdszerekkel, amelyek az adatok visszanyersre szolglnak. Mint bizonyra mr nyilvnval, a mysql_query() fggvny hasznlatval ki kell adnunk egy SELECT utastst. Az azonban mr korntsem ilyen egyszer, hogyan jutunk hozz a lekrdezs eredmnyhez. Nos, miutn vgrehajtottunk egy sikeres SELECT-et, a mysql_query() visszaad egy gynevezett eredmnyazonostt, melynek felhasznlsval elrhetjk az eredmnytblt s informcikat nyerhetnk rla.

12

Az eredmnytbla sorainak szma


A SELECT utasts eredmnyeknt kapott tbla sorainak szmt a mysql_num_rows() fggvny segtsgvel krdezhetjk le. A fggvny paramtere a krdses eredmny azonostja, visszatrsi rtke pedig a sorok szma a tblban. A 12.4. pldaprogramban lekrdezzk a tartomany tbla sszes sort s a mysql_num_rows() fggvnnyel megkapjuk a teljes tbla mrett.

12.4. program Sorok szma a SELECT utasts eredmnyben.


1: <html> 2: <head> 3: <title>12.4. program A mysql_num_rows() fggvny hasznlata</title> 4: </head> 5: <body> 6: <?php

222

12. ra

12.4. program (folytats)


7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: $felhasznalo = "jozsi"; $jelszo = "bubosvocsok"; $adatbazis = "pelda"; $kapcsolat = mysql_connect( "localhost", $felhasznalo, $jelszo ); if ( ! $kapcsolat ) die( "Nem lehet kapcsoldni a MySQL kiszolglhoz!" ); mysql_select_db( $adatbazis, $kapcsolat ) or die ( "Nem lehet megnyitni a $adatbazis adatbzist: ".mysql_error() ); $eredmeny = mysql_query( "SELECT * FROM tartomanyok" ); $sorok_szama = mysql_num_rows( $eredmeny ); print "Jelenleg $sorok_szama sor van a tblban<P>"; mysql_close( $kapcsolat ); ?> </body> </html>

A mysql_query() fggvny egy eredmnyazonostt ad vissza. Ezt tadjuk a mysql_num_rows() fggvnynek, amely megadja a sorok szmt.

Az eredmnytbla elrse
Miutn vgrehajtottuk a SELECT lekrdezst s az eredmnyazonostt troltuk, egy ciklus segtsgvel frhetnk hozz az eredmnytbla soraihoz. A PHP egy bels mutat segtsgvel tartja nyilvn, hogy melyik sort olvastuk utoljra. Ha kiolvasunk egy eredmnysort, a program automatikusan a kvetkezre ugrik. A mysql_fetch_row() fggvnnyel kiolvashatjuk a bels mutat ltal hivatkozott sort az eredmnytblbl. A fggvny paramtere egy eredmnyazonost, visszatrsi rtke pedig egy tmb, amely a sor sszes mezjt tartalmazza. Ha elrtk az eredmnykszlet vgt, a mysql_fetch_row() fggvny false rtkkel tr vissza. A 12.5. plda a teljes tartomany tblt megjelenti a bngszben.

Adatbzisok kezelse MySQL

223

12.5. program Tbla sszes sornak s oszlopnak megjelentse


1: <html> 2: <head> 3: <title>12.5. program Tbla sszes sornak s oszlopnak megjelentse</title> 4: </head> 5: <body> 6: <?php 7: $felhasznalo = "jozsi"; 8: $jelszo = "bubosvocsok"; 9: $adatbazis = "pelda"; 10: $kapcsolat = mysql_connect( "localhost", $felhasznalo, $jelszo ); 11: if ( ! $kapcsolat ) 12: die( "Nem lehet kapcsoldni a MySQL kiszolglhoz!" ); 13: mysql_select_db( $db, $kapcsolat ) 14: or die ( "Nem lehet megnyitni a $adatbazis adatbzist: ".mysql_error() ); 15: $eredmeny = mysql_query( "SELECT * FROM tartomanyok" ); 16: $sorok_szama = mysql_num_rows( $eredmeny ); 17: print "Jelenleg $sorok_szama sor van a tblban<P>"; 18: print "<table border=1>\n"; 19: while ( $egy_sor = mysql_fetch_row( $eredmeny ) ) 20: { 21: print "<tr>\n"; 22: foreach ( $egy_sor as $mezo ) 23: print "\t<td>$mezo</td>\n"; 24: print "</tr>\n"; 25: } 26: print "</table>\n"; 27: mysql_close( $kapcsolat ); 28: ?> 29: </body> 30: </html> Kapcsoldunk a kiszolglhoz s kivlasztjuk az adatbzist, majd a mysql_query() fggvnnyel egy SELECT lekrdezst kldnk az adatbzis kiszolgljhoz. Az eredmnyt az $eredmeny vltozban troljuk, amit az eredmnysorok szmnak lekrdezshez hasznlunk, ahogy korbban lttuk.

12

224

12. ra A while kifejezsben a mysql_fetch_row() fggvny visszatrsi rtkt az $egy_sor vltozba tltjk. Ne feledjk, hogy az rtkad kifejezs rtke megegyezik a jobb oldal rtkvel, ezrt a kirtkels sorn a kifejezs rtke mindig igaz lesz, amg a mysql_fetch_row() fggvny nem nulla rtkkel tr vissza. A ciklusmagban kiolvassuk az $egy_sor vltozban trolt elemeket s egy tblzat celliknt jelentjk meg azokat a bngszben. A mezket nv szerint is elrhetjk, mghozz ktfle mdon. A mysql_fetch_array() fggvny egy asszociatv tmbt ad vissza, ahol a kulcsok a mezk nevei. A kvetkez kdrszletben mdostottuk a 12.5. plda while ciklust, a mysql_fetch_array() fggvny felhasznlsval: print "<table border=1>\n"; while ( $egy_sor = mysql_fetch_array( $eredmeny ) ) { print "<tr>\n"; print "<td>".$egy_sor["email"]."</td><td>".$egy_sor["tartomany"]. "</td>\n"; print "</tr>\n"; } print "</table>\n"; A mysql_fetch_object() fggvny segtsgvel egy objektum tulajdonsgaiknt frhetnk hozz a mezkhz. A meznevek lesznek a tulajdonsgok nevei. A kvetkez kdrszletben ismt mdostottuk a krdses rszt, ezttal a mysql_fetch_object() fggvnyt hasznltuk. print "<table border=1>\n"; while ( $egy_sor = mysql_fetch_object( $eredmeny ) ) { print "<tr>\n"; print "<td>".$egy_sor->email."</td><td>".$egy_sor-> tartomany."</td>\n"; print "</tr>\n"; } print "</table>\n"; A mysql_fetch_array() s mysql_fetch_object() fggvnyek lehetv teszik szmunkra, hogy a sorbl kinyert informcikat szrjk s vgrehajtsuk sem kerl sokkal tbb idbe, mint a mysql_fetch_row() fggvny.

Adatbzisok kezelse MySQL

225

Adatok frisstse
Az adatokat az UPDATE utastssal frissthetjk, amelyet termszetesen a mysql_query() fggvnnyel kell tadnunk az adatbzis kiszolgljnak. Itt is igazak a korbban elmondottak, azaz egy sikeres UPDATE utasts nem felttlenl jelent vltozst az adatokban. A megvltozott sorok szmt a mysql_affected_rows() fggvnnyel krdezhetjk le, amelynek szksg szerint egy kapcsolatazonostt kell tadnunk. Ennek hinyban a fggvny mint azt mr megszokhattuk a legfrissebb kapcsolatra rtelmezi a mveletet. A mysql_affected_rows() fggvnyt brmely olyan SQL lekrdezs utn hasznlhatjuk, amely felteheten mdostott egy vagy tbb sort az adattblban. A 12.6. plda egy olyan programot tartalmaz, amely lehetv teszi az adatbzis karbantartja szmra, hogy brmelyik sor tartomany mezjt megvltoztassa.

12.6. program Sorok frisstse az adatbzisban


1: <html> 2: <head> 3: <title>12.6. program Sorok frisstse az adatbzisban 4: </title> 5: </head> 6: <body> 7: <?php 8: $felhasznalo = "jozsi"; 9: $jelszo = "bubosvocsok"; 10: $adatbazis = "pelda"; 11: $kapcsolat = mysql_connect( "localhost", $felhasznalo, $jelszo ); 12: if ( ! $kapcsolat ) 13: die( "Nem lehet kapcsoldni a MySQL kiszolglhoz! ); 14: mysql_select_db( $adatbazis, $kapcsolat ) 15: or die ( "Nem lehet megnyitni a $adatbazis adatbzist: ".mysql_error() ); 16: if ( isset( $tartomany ) && isset( $azonosito ) ) 17: { 18: $parancs = "UPDATE tartomanyok SET tartomany = '$tartomany' WHERE azonosito=$azonosito"; 19: $eredmeny = mysql_query( $parancs );

12

226

12. ra

12.6. program (folytats)


20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: if ( ! $eredmeny ) die ("Nem sikerlt a mdosts: " .mysql_error()); print "<h1>A tbla mdostva, ". mysql_affected_rows() . " sor vltozott</h1><p>"; } ?> <form action="<? print $PHP_SELF ?>" method="POST"> <select name="azonosito"> <? $eredmeny = mysql_query( "SELECT tartomany, azonosito FROM tartomanyok" ); while( $egy_sor = mysql_fetch_object( $eredmeny ) ) { print "<option value=\"$egy_sor->azonosito\""; if ( isset($azonosito) && $azonosito == $egy_sor->azonosito ) print " selected"; print "> $egy_sor->tartomany\n"; } mysql_close( $kapcsolat ); ?> </select> <input type="text" name="tartomany"> <input type="submit" value="Frissts"> </form> </body> </html>

A mvelet a szoksos mdon indul: kapcsoldunk az adatbzis kiszolgljhoz s kivlasztjuk az adatbzist. Ezek utn megvizsgljuk a $tartomany s az $azonosito vltozk megltt. Ha mindent rendben tallunk, sszelltjuk az SQL utastst, amely a $tartomany vltoz rtknek megfelelen frissti azt a sort, ahol az azonosito mez tartalma megegyezik az $azonosito vltoz rtkvel. Ha nem ltez azonosito rtkre hivatkozunk vagy a krdses sorban a $tartomany vltoz rtke megegyezik a tartomany mez tartalmval, nem kapunk hibazenetet, de a mysql_affected_rows() fggvny visszatrsi rtke 0 lesz. A mdostott sorok szmt kirjuk a bngszbe.

Adatbzisok kezelse MySQL A karbantart szmra ksztnk egy HTML rlapot, amelyen keresztl elvgezheti a vltoztatsokat. Ehhez ismt a mysql_query() fggvnyt kell hasznlnunk: lekrdezzk az azonosito s tartomany oszlopok sszes elemt s beillesztjk azokat egy HTML SELECT listba. A karbantart ezltal egy lenyl menbl vlaszthatja ki, melyik bejegyzst kvnja mdostani. Ha a karbantart mr elkldte egyszer az rlapot, akkor az utoljra hivatkozott azonosito rtk mell a SELECTED mdostt is kitesszk, gy a mdostsok azonnal ltszdni fognak a menben.

227

Informcik az adatbzisokrl
Mindezidig egyetlen adatbzisra sszpontostottunk, megtanulva, hogyan lehet adatokkal feltlteni egy tblt s az adatokat lekrdezni. A PHP azonban szmos olyan eszkzzel szolgl, amelyek segtsgvel megllapthatjuk, hny adatbzis hozzfrhet az adott kapcsolaton keresztl s milyen ezek szerkezete.

Az elrhet adatbzisok kiratsa


A mysql_list_dbs() fggvny segtsgvel listt krhetnk az sszes adatbzisrl, melyek az adott kapcsolaton keresztl hozzfrhetk. A fggvny paramtere szksg szerint egy kapcsolatazonost, visszatrsi rtke pedig egy eredmnyazonost. Az adatbzisok neveit a mysql_tablename() fggvnnyel krdezhetjk le, amelynek paramtere ez az eredmnyazonost s az adatbzis sorszma, visszatrsi rtke pedig az adatbzis neve. Az adatbzisok sorszmozsa 0-val kezddik. Az sszes adatbzis szmt a mysql_list_dbs() fggvny utn meghvott mysql_num_rows() fggvny adja meg.

12

12.7. program Adott kapcsolaton keresztl elrhet adatbzisok


1: <html> 2: <head> 3: <title>12.7. program Adott kapcsolaton keresztl elrhet adatbzisok 4: </title> 5: </head> 6: <body> 7: <?php 8: $felhasznalo = "jozsi"; 9: $jelszo = "bubosvocsok"; 10: $kapcsolat = mysql_connect( "localhost", $felhasznalo, $jelszo );

228

12. ra

12.7. program (folytats)


11: if ( ! $kapcsolat ) 12: die( "Nem lehet kapcsoldni a MySQL kiszolglhoz!" ); 13: $adatbazis_lista = mysql_list_dbs( $kapcsolat ); 14: $szam = mysql_num_rows( $adatbazis_lista ); 15: for( $x = 0; $x < $szam; $x++ ) 16: print mysql_tablename( $adatbazis_lista, $x )."<br>"; 17: mysql_close( $kapcsolat ); 18: ?> 19: </body> 20: </html>

A mysql_list_dbs() fggvny visszaad egy eredmnyazonostt, amelyet paramterknt tadunk a mysql_num_rows() fggvnynek. Az gy megkapott adatbzisok szmt a $szam vltozba tltjk s felhasznljuk a for ciklusban. Az $x indexet minden lpsben eggyel nveljk, 0-tl a tallt adatbzisok szmig, majd az eredmnyazonostval egytt tadjuk a mysql_tablename() fggvnynek az adatbzis nevnek lekrdezshez. A 12.1 brn a 12.7 program eredmnye lthat egy bngszablakban.

12.1. bra
Az elrhet adatbzisok listja

Adatbzisok kezelse MySQL A mysql_list_dbs() fggvny ltal visszaadott eredmnyazonostt a mysql_query() eredmnyhez hasonlan is felhasznlhatnnk, vagyis a tnyleges neveket a mysql_fetch_row() fggvnnyel is lekrdezhetnnk. Ekkor eredmnyl egy tmbt kapnnk, melynek els eleme tartalmazn az adatbzis nevt.

229

Adatbzistblk listzsa
A mysql_list_tables() fggvnnyel egy adott adatbzis tblinak nevt soroltathatjuk fel. A fggvny paramterei az adatbzis neve s szksg szerint a kapcsolat azonostja. A visszatrsi rtk egy eredmnyazonost, ha az adatbzis ltezik s jogunk van hozzfrni. Az eredmnyazonostt mysql_tablename() vagy mysql_fetch_row() hvsokhoz hasznlhatjuk fel, a fent ltott mdon. A kvetkez kdrszlet a mysql_list_tables() fggvny segtsgvel az adatbzis sszes tbljt kirja. $eredmeny = mysql_list_tables( "pelda", $kapcsolat ); while ( $tabla_sor = mysql_fetch_row( $eredmeny ) ) print $tabla_sor[0]."<BR>\n";

12

Informcik a mezkrl
A SELECT lekrdezs utn az eredmnytbla mezinek szmt a mysql_num_fields() fggvnnyel kaphatjuk meg. A fggvny paramtere egy eredmnyazonost, visszatrsi rtke pedig egy egsz szm, amely a mezk szmt adja meg. $eredmeny = mysql_query( "SELECT * from tartomanyok" ); $mezok_szama = mysql_num_fields( $eredmeny ); A mezkhz sorszmokat rendelnk, a szmozs 0-val kezddik. A sorszm s az eredmnyazonost alapjn szmos informcit lekrdezhetnk a mezrl, belertve a nevt, tpust, legnagyobb hosszt s egyb jellemzit is. A mez nevnek lekrdezsre a mysql_field_name() fggvny szolgl. $eredmeny = mysql_query( "SELECT * from tartomanyok" ); $mezok_szama = mysql_num_fields( $eredmeny ); for ( $x=0; $x<$mezok_szama; $x++ ) mysql_field_name( $eredmeny, $x ) . "<br>\n";

230

12. ra A mez legnagyobb hosszt a mysql_field_len() fggvnnyel kaphatjuk meg. $eredmeny = mysql_query( "SELECT * from tartomanyok" ); $mezok_szama = mysql_num_fields( $eredmeny ); for ( $x=0; $x<$mezok_szama; $x++ ) mysql_field_len( $eredmeny, $x ) . "<BR>\n"; A mez egyb jellemzit a mysql_field_flags() fggvnnyel olvashatjuk ki: $eredmeny = mysql_query( "SELECT * from tartomanyok" ); $mezok_szama = mysql_num_fields( $eredmeny ); for ( $x=0; $x<$mezok_szama; $x++ ) mysql_field_flags( $eredmeny, $x ) . "<BR>\n"; Lehetsgnk van mg a mez tpusnak megllaptsra, a mysql_field_type() fggvnnyel: $eredmeny = mysql_query( "SELECT * from tartomanyok" ); $mezok_szama = mysql_num_fields( $eredmeny ); for ( $x=0; $x<$mezok_szama; $x++ ) mysql_field_type( $eredmeny, $x ) . "<BR>\n";

Az adatbzis szerkezete sszell a kp


A 12.8 plda egyesti a fenti eljrsokat s megjelent minden elrhet adatbzist, tblt s mezt.

12.8 program Minden adatbzis, tbla s mez megjelentse


1: <html> 2: <head> 3: <title>12.8. program Minden adatbzis, tbla s mez megjelentse</title> 4: </head> 5: <body> 6: <?php 7: $felhasznalo = "root"; 8: $jelszo = "titkos"; 9: $kapcsolat = mysql_connect( "localhost", $felhasznalo, $jelszo );

Adatbzisok kezelse MySQL

231

12.8 program (folytats)


10: if ( ! $kapcsolat ) 11: die( "Nem lehet kapcsoldni a MySQL kiszolglhoz!" ); 12: $adatbazis_lista = mysql_list_dbs( $kapcsolat ); 13: while ( $adatbazisok = mysql_fetch_row ( $adatbazis_lista ) ) 14: { 15: print "<b>".$adatbazisok[0]."</b>\n"; 16: if ( !@mysql_select_db( $adatbazisok[0], $kapcsolat ) ) 17: { 18: print "<dl><dd>Nem lehet kivlasztani " . mysql_error() ." </dl>"; 19: continue; 20: } 21: $tablak = mysql_list_tables( $adatbazisok[0], $kapcsolat ); 22: print "\t<dl><dd>\n"; 23: while ( $tabla_sor = mysql_fetch_row( $tablak ) ) 24: { 25: print "\t<b>$tabla_sor[0]</b>\n"; 26: $eredmeny = mysql_query( "SELECT * from " .$tabla_sor[0] ); 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: $mezok_szama = mysql_num_fields( $eredmeny ); print "\t\t<dl><dd>\n"; for ( $x=0; $x<$mezok_szama; $x++ ) { print "\t\t<i>"; print mysql_field_type( $eredmeny, $x ); print "</i> <i>"; print mysql_field_len( $eredmeny, $x ); print "</i> <b>"; print mysql_field_name( $eredmeny, $x ); print "</b> <i>"; print mysql_field_flags( $eredmeny, $x ); print "</i><br>\n"; } print "\t\t</dl>\n"; }

12

232

12. ra

12.8 program (folytats)


43: 44: 45: 46: 47: 48: print "\t</dl>\n"; } mysql_close( $kapcsolat ); ?> </body> </html>

Elszr is a szoksos mdon a MySQL kiszolglhoz kapcsoldunk, majd meghvjuk a mysql_list_dbs() fggvnyt. A kapott eredmnyazonostt tadjuk a mysql_fetch_row() fggvnynek s az $adatbazisok tmb els elembe betltjk az aktulis adatbzis nevt. Ezutn megprbljuk kivlasztani az adatbzist a mysql_select_db() fggvnnyel. Ha nincs hozzfrsi jogunk, akkor megjelentjk a hibazenetet a bngszablakban, majd a continue utastssal tovbblpnk a kvetkez adatbzisra. Ha ki tudjuk vlasztani az adatbzist, a mveletet a tblanevek kirsval folytatjuk. Az adatbzis nevt tadjuk a mysql_list_tables() fggvnynek, troljuk az j eredmnyazonostt, majd a mysql_fetch_row() fggvnnyel kiolvassuk a tblk neveit. Minden tbln a kvetkez mveletsort hajtjuk vgre: kirjuk a tbla nevt, majd sszelltunk egy SQL utastst, amely az sszes oszlopot lekrdezi az adott tblban. A mysql_query() fggvnnyel vgrehajtjuk a lekrdezst, majd az eredmnyazonost alapjn a mysql_num_fields() fggvnnyel meghatrozzuk a mezk szmt. A for ciklusban minden mezn elvgezzk a kvetkez mveletsort: belltjuk az $x vltozt, hogy az aktulis mez sorszmt tartalmazza (ez kezdetben 0). Ezutn a sorszm ismeretben meghvjuk az elz rszben trgyalt sszes ellenrz fggvnyt, eredmnyket pedig tlthat formban, tblzatba rendezve elkldjk a bngsznek. Ezeket a mveleteket minden elrhet adatbzison elvgezzk. A program egy ttekinthet szerkezeti vzlatot jelent meg a bngszablakban, amely az adott kapcsolaton keresztl elrhet sszes adatbzist, adattblt s mezt tartalmazza. A 12.2. bra a program kimenett mutatja.

Adatbzisok kezelse MySQL

233

12.2. bra
Az sszes elrhet adatbzis, tbla s mez listja

sszefoglals
Ebben az rban a MySQL adatbziskezels alapjait tanultuk meg: az adatok trolst s visszanyerst. Megtanultuk, hogyan ptsk fel a kapcsolatot a MySQL kiszolglval a mysql_connect() s mysql_pconnect() fggvnyek segtsgvel. Az adatbzist a mysql_select_db() fggvnnyel vlasztottuk ki. Ha a kivlaszts nem sikerlt, lekrdeztk a hibt a mysql_error() fggvnnyel. SQL utastsokat adtunk ki a mysql_query() fggvny segtsgvel s a fggvny ltal visszaadott eredmnyazonost segtsgvel elrtk az adatokat vagy megtudtuk a mdostott sorok szmt. A PHP MySQL fggvnyeinek segtsgvel kirattuk az elrhet adatbzisokat, tblkat s mezket, s az egyes mezkrl is bvebb informcikat szereztnk.

12

234

12. ra

Krdsek s vlaszok
Ez az ra szigoran a MySQL-re vonatkozik. Hogyan ltethetjk t ezeket a fogalmakat ms adatbzissal mkd rendszerekre? Az mSQL-kezel fggvnyek pldul szinte teljesen megegyeznek a MySQL fggvnyekkel, de ms SQL kiszolglknak is megvannak a sajt PHP fggvnyeik. SQL utastsokat minden adatbziskiszolglnak kldhetnk. Ha szabvnyos ANSI SQL-lel dolgozunk, nem lesz klnsebb problmnk az adatbziskiszolglk kztti tllskor. Hogyan rhatunk olyan kdot, amelyet knny tltetni egy msik adatbzis kiszolgl krnyezetbe? Gyakran j tlet az adatbzis-lekrdez fggvnyeket egy egyszer osztlyba vagy knyvtrba csoportostani. gy ha fel kell kszteni a kdot egy msik adatbziskezelvel val egyttmkdsre, a kdnak csak kis rszt kell trni.

Mhely
A mhelyben kvzkrdsek tallhatk, melyek segtenek megszilrdtani az rban szerzett tudst. A vlaszokat az A fggelkben helyeztk el.

Kvz
1. Hogyan kell csatlakozni a MySQL adatbziskiszolglhoz? 2. Melyik fggvny szolgl az adatbzis kivlasztsra? 3. Melyik fggvnnyel kldhetnk SQL utastst a kiszolglnak? 4. Mit csinl a mysql_insert_id() fggvny? 5. Tegyk fel, hogy kldtnk egy SELECT lekrdezst a MySQL-nek. Nevezznk meg hrom fggvnyt, amelyekkel hozzfrhetnk az eredmnyhez. 6. Tegyk fel, hogy kldtnk egy UPDATE lekrdezst a MySQL-nek. Melyik fggvnnyel llapthatjuk meg, hny sort rintett a mdosts? 7. Melyik fggvnyt kellene hasznlnunk, ha az adatbziskapcsolaton keresztl elrhet adatbzisok nevt szeretnnk megtudni? 8. Melyik fggvnnyel krdezhetjk le az adatbzisban tallhat tblk neveit?

Adatbzisok kezelse MySQL

235

Feladatok
1. Hozzunk ltre egy adattblt hrom mezvel: email (legfeljebb 70 karakter), uzenet (legfeljebb 250 karakter) s datum (a UNIX idblyegzt tartalmaz egsz szm). Tegyk lehetv a felhasznlknak, hogy feltltsk az adatbzist. 2. Ksztsnk programot, amely megjelenti az 1. pontban elksztett tbla tartalmt.

12

You might also like