E N D
PHP nyelv 2. rész
Űrlapok • Eddigi programjainkból egy fontos dolog hiányzott: nem tettük lehetővé, hogy a felhasználó által megadott adatokkal dolgozzon a program, vagy hogy a felhasználó módosíthassa az adatokat. Ahhoz, hogy ezt a felhasználó megtehesse, egy felületet kell számára biztosítani. Az Interneten alapvetően a HTML űrlapokon keresztül áramlik az információ a felhasználó és a kiszolgáló között. A PHP-t úgy tervezték, hogy a kitöltött HTML űrlapokat könnyen fel tudja dolgozni. Mielőtt azonban rátérnénk az űrlapok használatára, meg kell ismerkednünk néhány lehetőséggel, ugyanis információt a felhasználóról nem csak űrlapok segítségével kaphatunk.
Globális és környezeti változók • A globális változókat a program legfelső szintjén találjuk, és a függvényeken belül is használhatjuk őket. A PHP rendelkezik egy $GLOBALS tömbbel, ami tartalmazza például a programban definiált változókat, és az ún. környezeti változókat is. • A példaprogram a $GLOBALS tömb elemeit listázza ki: • <?php • $nev="Péter"; • foreach ($GLOBALS as $kulcs=>$ertek) • { • print $kulcs." = ".$ertek."<br>"; • } • ?> • A listában megtalálhatjuk az általunk bevezetett $nev változót a ’Péter’ értékével, a tömb kilistázásához felhasznált $kulcs és $ertek változókat értékükkel, és láthatunk sok, elsőre ijesztőnek tűnő nevet is.
Űrlap létrehozása • Készítsünk el egy olyan egyszerű űrlapot, amely egy beviteli mező segítségével bekéri a felhasználó nevét, majd egy gombra kattintva később megjeleníti. • Az űrlap-fájl! • <html> • <head> • <title>Egyszerű űrlap</title> • <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2"> • </head> • <body> • <form action="nevf.php" method="POST"> • <p>Adja meg a nevét: <input type="text" name="nev"></p> • <input type="submit" value="Mehet"> • </form> • </body> • </html>
Űrlap létrehozása • Mint látható, az űrlapot a HTML kódban a <form> és a </form> határolja. E két tag közé kell elhelyeznünk az űrlapelemeket, amelyek lehetnek szöveges beviteli mezők, listák, rádiógombok, elküld (submit) gombok, stb. A 8. sorban egy beviteli mezőt láthatunk, melynek azonosítója nev, a 9. sorban pedig egy elküld gombot, melynek értéke a Mehet (ez a gomb felirata), és feladata az űrlap továbbítása a megadott helyre. • A 7. sorban látható, hogy az űrlap az értékeket POST–módszerrel továbbítja a célfájlnak (nevf.php), melyet az action-nel határoztuk meg. A POST mind nagy értékekkel, mind az értékek hosszú listájával működik. Amennyiben egy űrlapot a GET-módszerrel küldünk el, akkor annak mezői és azok értékei (URL kódolásban) hozzáfűződnek ahhoz a címhez (URL-hez), ahová az űrlapot küldjük. Az értékek ekkor elérhetők lesznek a kiszolgáló, illetve az általa futtatott programok számára. A kérés például a következőképpen nézne ki, ha a fenti példában a POST helyett GET szerepelne: • http://localhost/nevf.php?nev=Kiss+Pista
Űrlap létrehozása • Minden mező nevét egy ”=” jel választja el annak értékétől, a név-érték párokat pedig ”&” jelek határolják. A PHP visszafejti a jeleket, a talált adatokat a $HTTP_GET_VARS asszociatív tömbben teszi elérhetővé a program számára, valamint az űrlapelemek nevével azonos nevű globális változókat létrehoz a megfelelő tartalommal, függetlenül a kérelem típusától. A nev nevű GET változóhoz az alábbi két módon férhetünk hozzá: • $HTTP_GET_VARS["nev"]; • $nev; • A GET lekérések szerencsére nem csak űrlapokkal kapcsolatban használhatók, könnyen készíthetünk mi is ilyen karakterláncokat, így a fontos adatokat könnyedén továbbíthatjuk lapról lapra.
Űrlap létrehozása • Az adatok feldolgozásának vagy tárolásának megvalósítása a célfájl, ebben az esetben a nevf.php feladata lesz. A feldolgozáshoz már szükséges a PHP, míg magát az űrlapot leíró fájl tisztán HTML-kódot tartalmaz. • Nézzük a nevf.php fájlt, aminek a feladata, hogy a beírt nevet megjelenítse: • <?php • print "Az Ön neve: $nev"; • ?> • Az űrlapelemek neveiből PHP változók lesznek, így a nev name-paraméterével megadott beviteli mező tartalma egy $nev változóba került. Semmi más dolgunk nem volt, mint kiíratni a böngészőbe a $nev változó tartalmát (2. sor).
Űrlap létrehozása • Nézzünk egy másik példát: Adjuk meg a másodfokú egyenlet megoldásait a felhasználó által megadott együtthatók segítségével! • Az űrlap állomány! • <html> • <head> • <title>A másodfokú egyenlet megoldásai</title> • <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2"> • </head> • <body> • <form action="masodf.php" method="POST"> • Adja meg az együtthatókat: <br><br> • <input type="text" name="a"> *x*x + • <input type="text" name="b"> *x + • <input type="text" name="c"> = 0<br><br> • <input type="submit" value="Megoldás"> • </form> • </body> • </html>
Űrlap létrehozása • <?php • $d=$b*$b-4*$a*$c; • if ($a==0) • if ($b==0) print "Nincs megoldás"; • else • { • $x=-$c/$b; • print "Megoldás:<br>x = "; • printf("%.3f",$x); • } • else • { • if ($d<0) • { • $d=$d*(-1); • $e=-$b/(2*$a); • $f=sqrt($d)/(2*$a); • print "Megoldások:<br>x1 = "; • printf("%.3f",$e);print " + "; • printf("%.3f",$f); • print " * i<br>x2 = "; • printf("%.3f",$e);print " - "; • printf("%.3f",$f);print " * i"; }
Űrlap létrehozása • else • { • $x1=(-$b+sqrt($d))/(2*$a); • $x2=(-$b-sqrt($d))/(2*$a); • print "Megoldások:<br>x1 = "; • printf("%.3f",$x1); • print "<br>x2 = "; • printf("%.3f",$x2); • } • } • ?> • Ez pedig az űrlap feldolgozó php-állomány! • Itt a feldolgozás már bonyolultabb volt, mint az előző esetben, de jól látszik, hogy a három változó – a $a, a $b, és a $c – a beviteli mezők neveiből keletkeztek. A printf() függvénnyel a kapott lebegőpontos számokat fixpontosan íratjuk ki 3 tizedesjegyet megjelenítve.
Űrlapelemek használata • A nem és a kontinens kiválasztásához rádiógombokat használtunk. Ezek rádiógombok általában egy csoportot alkotnak, és a csoportból mindig csak egy választható ki (a checked tulajdonság jelzi azt, hogy kezdetben melyik van kiválasztva). • A name tulajdonság értéke (nemcsop és kontcsop) lesz a változó neve, ami tartalmazza a kiválasztott értéket (a value tulajdonság értékét). Az életkor kiválasztásához egy listát használtunk (20. sor), a később létrejövő $eletkor változó valamelyik <option> és </option> közötti részt fogja tartalmazni. • Az érdeklődési kör egy olyan lista (63. sor), amelyből több elem kiválasztható (multiple), neve az erdelkodes[], jelezve, hogy ebből egy tömb keletkezik. Ennek tartalmát később egy foreach segítségével íratjuk ki. • Végül az űrlap alján a válaszok megerősítésére szolgáló jelölőt (checkbox) láthatunk, melynek később az állapotát vizsgáljuk meg (kipipáltuk vagy sem).
Űrlapelemek használata • <?php • if ($nev=="") • print "<h3>Nem adta meg a nevét!</h3>"; • elseif (!isset($erdeklodes)) • print "<h3>Nem adta meg az érdeklődési körét!</h3>"; • elseif (!isset($megfelel)) • print "<h3>Nem hitelesítette adatait!</h3>"; • else • { • print "<h3>Ön a következő adatokat adta meg:</h3>" • ."<b>Név: </b>".$nev."<br>" • ."<b>Neme: </b>".$nemcsop."<br>" • ."<b>Életkora: </b>".$eletkor."<br>" • ."<b>Kontinens: </b>".$kontcsop."<br>" • ."<b>Érdeklődési köre:</b><br>"; • foreach ($erdeklodes as $kor) • { • print $kor."<br>"; • } • } • ?>
Űrlapelemek használata • A programunk már tartalmaz némi ellenőrző részt is: az űrlap kitöltöttségét ellenőriztük le (2-7. sor). A későbbi fejezetekben láthatunk példát egyéb űrlapelemekre, és az adatok fájlban ill. adatbázisban tárolására is. • A kód eredménye!
Űrlap és PHP kód egy oldalon • A célunk az, hogy egy olyan oldalt készítsünk, amely tartalmazza egyrészt az űrlapot, másrészt a feldolgozását is megvalósítja. Ez csak úgy lehetséges, hogy az űrlap-fájl tartalmazza a PHP kódot, és önmagát hívja meg. • A példaprogram egy számkitalálós játék, 1 és 100 közötti egész számot kell kitalálni maximum 10 lépésből.
Űrlap és PHP kód egy oldalon • <html> • <head> • <title>Számkitalálós játék</title> • </head> • <body> • <?php • if (isset($szam)) • { • if ($db==10 || $szam==$aszam) • { • print "<h3>"; • if ($szam!=$aszam) • print "Sajnos Ön nem tudta kitalálni a számot • 10 próbálkozással!"; • else • print "Ön kitalálta a számot $db próbálkozással!"; • print "</h3>"; • unset($szam); • print "<a href=$PHP_SELF>Új játék</a>"; • die(); • }
Űrlap és PHP kód egy oldalon • else • { • print "<h3>"; • if ($szam<$aszam) print "Próbálkozzon nagyobbal!"; • else print "Próbálkozzon kisebbel!"; • print "</h3>"."<p>Próbálkozások száma: $db</p>"; • $db++; • } • } • else • { • $aszam=rand(1,100); • print "<h3>Adja meg a számot:</h3>"; • $db=1; • } • ?> • <form action="<?php print $PHP_SELF."?db=".$db ?>” method="POST"> • <p><input type="text" name="szam"></p> • <input type="submit" value="Mehet"> • <input type="hidden" name="aszam" value="<?php print $aszam ?>"> • </form> • </body> • </html>
Űrlap és PHP kód egy oldalon • Az elgondolásunk az, hogy ha nincs a beviteli mezőnek értéke, azaz nincs kitöltve (8. sorban vizsgáljuk), akkor az azt jelenti, hogy most indul a játék. Ekkor generálunk egy véletlen számot ($aszam), és a számlálót ($db) 1-re állítjuk (34. és 36. sorok). • Az elküld gombra kattintva a fájl önmagára hivatkozik a $PHP_SELF változó segítségével. Kapcsolt adat formájában küldjük tovább a próbálkozások számát tartalmazó számlálót (39. sor), és a kitalálandó számot egy rejtett mező segítségével küldjük tovább a későbbi vizsgálatok elvégzéséhez (42. sor). A számlálót minden új kitöltésnél növeljük eggyel (29. sor), és megjelenítjük a felhasználó számára, hogy az általa megadott szám nagyobb vagy kisebb –e a kitalálandónál (26. és 27. sorok). Amennyiben eltaláltuk a számot, akkor kiírjuk, hogy hány próbálkozással sikerült (17. sor), majd a beviteli mező nevéből keletkezett változót ($szam) megszűntetjük (19. sor), és a program futását megállítjuk a die() függvénnyel (21. sor). • A változó megszűntetése a játék újraindításához szükséges. Ugyan ezt az utat járjuk végig, ha 10 lépésből nem sikerült kitalálni a számot, csak akkor a ”Sajnos Ön nem tudta kitalálni a számot 10 lépésből!” szöveg kiíratása után szűntetjük meg a változót, és állítjuk meg a programot.
Fájlok és könyvtárak • A fájlok számtalan formátumban és funkcióban fordulnak elő a különböző operációs rendszerekben, azonban elmondható, hogy mindenhol az adattárolás alapegysége. Szerencsére számos programozási nyelv mellett a PHP is biztosít számunkra lehetőséget a fájl- ill. könyvtárkezelésre.
Könyvtárak • A PHP az opendir() - könyvtár megnyitása, readdir() - könyvtár olvasása, closedir() - megnyitott könyvtár bezárása, és az is_dir() - eldönti valamiről, hogy könyvtár-e, függvényeket nyújtja a könyvtárak tartalmának megjelenítéséhez, míg az mkdir() új könyvtárat hoz létre, az rmdir() pedig létező könyvtárat töröl.
Könyvtárak listázása • Két lehetőséget mutatunk be a sok közül erre a célra. Az első úgy listázza a könyvtár tartalmát, hogy megjeleníti a fájlok és könyvtárak nevét, és a könyvtárakhoz a [Dir] jelzést hozzáteszi. A másik leszámolja, hogy hány darab fájl ill. könyvtár található az aktuális könyvtárban. • Az első: • <?php • $kvtnev="C:"; • $kvt=opendir($kvtnev); • while ($fajl=readdir($kvt)) • { • print "$fajl"; • if (is_dir("$kvtnev/$fajl")) print " [Dir]"; • print "<br>"; • } • closedir($kvt); • ?>
Könyvtárak listázása • Az egyetlen magyarázatra szoruló sor a 4. sor. A while feltételében egy értékadás szerepel, ami azt jelenti, hogy a ciklus addig ismétel, amíg sikeres az értékadás. A readdir() így addig olvas a könyvtárból a $fajl változóba, amíg van fájl a könyvtárban. A $fajl változóról pedig később eldöntjük az is_dir() függvény segítségével (függvényparaméterének abszolút elérési útnak kell lennie), hogy könyvtár volt –e (7. sor). • A második megoldás:
Könyvtárak listázása • <?php • $kvtnev="C:"; • $kvt=opendir($kvtnev); • while ($fajl=readdir($kvt)) • { • $tipus=filetype("$kvtnev/$fajl"); • if (isset($melyik[$tipus])) $melyik[$tipus]++; • else $melyik[$tipus]=0; • } • closedir($kvt); • foreach ($melyik as $kulcs=>$ertek) • { • print $kulcs.": ".$ertek."<br>"; • } • ?> • A 6. sorban található filetype() függvény sztringként a fájl típusát adja vissza, ami a dir, file vagy link közül valamelyik lehet. A különböző típusok számát $melyik asszociatív tömbben tároljuk (7. sor).
Egyéb könyvtárfüggvények • A dirname() függvénybe a fájl elérési útját írva az elérési út könyvtárrészét kapjuk, míg a basename() a maradékot, a fájlnevet eredményezi. A pathinfo() ugyanazt az információt adja, mint a dirname() és a basename() összekapcsolva. A realpath() a relatív útvonalat abszolút elérési úttá konvertálja.
Fájlok • A következőkben megtudhatjuk, hogy hogyan kell egy létező PHP fájlt beágyazni egy másik PHP fájlba, hogyan lehet fájltulajdonságokat megjeleníteni, hogyan lehet fájlokat létrehozni, olvasni, írni és törölni, valamint a fájlfeltöltésről is lesz szó.
Fájlok beágyazása • Az include() függvény lehetőséget ad arra, hogy fájlt ágyazzunk be a PHP dokumentumokba. A fájlban szereplő PHP kód úgy hajtódik végre, mintha a fődokumentum része lenne, ami hasznos, ha egy többoldalas programban külső kódokat szeretnénk beágyazni. Másrészről a többször felhasználandó részeket célszerű külön fájlokba elhelyezni, így azokat bármikor, bármelyik fájlba könnyedén beilleszthetjük. • include("proba.php");
Fájlok listázása attribútumokkal együtt • <?php • $kvtnev="C:/"; • $kvt=opendir($kvtnev); • while ($fajl=readdir($kvt)) • { • fileinformaciok($kvtnev.$fajl); • } • closedir($kvt); • function fileinformaciok($f) • { • print "$f ".(is_file($f)?"":"nem")." fájl<br>"; • print "$f ".(is_dir($f)?"":"nem")." könyvtár<br>"; • print "$f ".(is_readable($f)?"":"nem")." olvasható<br>"; • print "$f ".(is_writable($f)?"":"nem")." írható<br>"; • print "$f ".(is_executable($f)?"":"nem")." futtatható<br>"; • print "$f ".(filesize($f))." bájt méretű<br>"; • print "$f utolsó megnyitásának dátuma: ".date("Y.m.d H:i",fileatime($f))."<br>"; • print "$f utolsó módosításának dátuma: ".date("Y.m.d H:i",filemtime($f))."<br>"; • print "$f utolsó változásának dátuma: ".date("Y.m.d H:i",filectime($f))."<br>"; • } • ?>
Fájlok létrehozása és törlése • Amennyiben egy üres fájlt szeretnénk létrehozni, a touch() függvényt kell használnunk. A paraméterként megadott fájlnév elé az elérési útvonalat is meg kell adnunk, ha nem az aktuális könyvtárban szeretnénk a fájlt létrehozni. Amennyiben a fájl már létezik, akkor az utolsó módosítás dátuma módosul az utasítás végrehajtási idejére. • Pl.: touch("proba.txt"); • Létező fájlt törölni az unlink() függvénnyel lehet. Az unlink() paramétere a fájl elérési útja: • Pl.: unlink("proba.txt"); • A létrehozás, törlés, írás, olvasás, módosítás csak akkor lehetséges egy fájlon, ha a megfelelő jogosultságokkal rendelkezünk.
Fájlok olvasása • A fájlokat szekvenciálisan tudjuk olvasni és írni. A szekvenciális input fájt háromféleképpen lehet a PHP-ben olvasni: bájtonként, karakterenként, soronként. Ezek közül az egyiket mutatja be az alábbi példa fájl megnyitás után: • A 3. sorban a file_exists() függvénnyel a fájl létezését döntjük el. A karakterenkénti olvasást a 13. sortól kezdve láthatjuk. A 15. sorban a fájlt megnyitjuk olvasásra (r - read) az fopen() függvénnyel, melynek eredménye a $f fájlváltozó (a továbbiakban ezzel dolgozunk). Ezek után egy karaktert olvasunk a fájlból az fgetc() függvénnyel, amíg a fájl végére nem érünk (feof() - logikai értékű függvény, igaz értéket ad, ha a fájl végére értünk).
Fájlok írása • Fájlok írásánál ugyanúgy az fopen() függvényt használjuk, de a második paraméterét ”w”-re (write-ra) állítjuk, míg a hozzáfűzésnél ”a”-ra (append-re). Abból nem lehet probléma, ha több felhasználó is ugyanazt a fájlt olvassa, de azt nem engedélyezhetjük, hogy valaki írjon egy fájlt, míg más olvassa, vagy többen ugyanazt a fájlt írják. Amennyiben egy fájlt írásra vagy hozzáfűzésre meg tudunk nyitni, akkor zároljuk, hogy más felhasználó ne tudja addig írni, amíg mi írjuk. A példa az írást és a hozzáfűzést mutatja be:
Fájlok írása • <?php • $fajlnev="proba.txt"; • print "$fajlnev fájlba írás<br>"; • if (!file_exists($fajlnev)) touch($fajlnev); • $fa=fopen($fajlnev,"w") or die("$fajlnev nem nyitható meg"); • flock($fa,2); //más folyamatok nem olvashatják és írhatják ebben az időben • fwrite($fa, "Helló, világ!\n"); • flock($fa,3); //zárolás feloldása • fclose($fa); • print "$fajlnev fájlhoz hozzáfűzés"; • $fa=fopen($fajlnev,"a") or die("$fajlnev nem nyitható meg"); • flock($fa,2); • fputs($fa,"Helló, Web!"); • flock($fa,3); • fclose($fa); • ?>
Fájlok írása • Egy proba.txt nevű fájllal dolgozunk a példaprogramban. A 4. sorban döntjük el, hogy létezik-e a fájl, ha nem akkor létrehozzuk. Amennyiben a fájl létezett, akkor az írásnál elveszik korábbi tartalma. Az 5. sorban a fájlt megnyitjuk olvasásra, majd a 6. sorban zároljuk az flock() utasítással. Az flock() második paramétere lehet 1, 2 és 3. Az 1-es jelentése, hogy más folyamatok olvashatják, de nem írhatják. Ezt akkor használjuk, ha olvassuk a fájlt. A 2-es jelentése, hogy más folyamatok nem olvashatják és nem írhatják. Ezt akkor használjuk, amikor írunk a fájlba. A 3-as feloldja a zárolást. • A fájlba íráshoz az fwrite() függvényt használjuk, melynek első paramétere a fájlváltozó, második paramétere jelen esetben egy string. A példaprogram további részében hozzáfűzzük a fájlhoz a ”Helló, Web!” szöveget az fputs() utasítással. Az fwrite() és az fputs() eredménye ugyanaz, az fputs() az fwrite() aliasa.
Fájlok feltöltése • <html> • <head> • <title>Fájl feltöltése</title> • <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2"> • </head> • <body> • <?php • $konyvtar="C:/munka/kepek"; • if(isset($uploadfile)) /*ha kiválasztottuk a fájlt, akkor kiírjuk az adatait*/ • { • print "Fájl: " . $uploadfile; • print "<br>Fájl neve: " . $uploadfile_name; • print "<br>Fájl mérete: " . $uploadfile_size; • print "<br>Fájl típusa: " . $uploadfile_type; • } • else • { • print "<br>Adja meg a fájlt: "; • print "<form enctype=\"multipart/form-data\"" ." action=$PHP_SELF method=\"post\">" • ."<input type=\"hidden\" name=\"MAX_FILE_SIZE\"" • ." value=\"200000\">" • ."<input type=\"file\" name=\"uploadfile\" size=\"40\">" • ."<br><input type=\"submit\" value=\"Feltöltés\"></form>"; • }
Fájlok feltöltése • if(is_uploaded_file($uploadfile)) • /*ha a Feltöltés gombra rákattintottunk, akkor átmozgatjuk az ideiglenes könyvtárból a fájlt a célkönyvtárba*/ • { • if(move_uploaded_file($uploadfile,”$konyvtar/$uploadfile_name”)) • { • print "<br><br>Fájl feltöltése sikerült."; • } • else • { • print "<br><br>Fájl feltöltése sikertelen."; • } • } • ?> • </body> • </html>
Fájlok feltöltése • Az űrlap megjelenítése hasonló elven történik, mint a számkitalálós játékban: ha nincs még kiválasztva a fájl, akkor meg kell jeleníteni az űrlapot (9. sor). Az űrlap a 20. sortól a 25. sorig tart, ahol láthatjuk, hogy a fájlátvitelhez a form enctype=”multipart/form-data” sor szerepel a HTML részben, és a fájl önmagára fog hivatkozni a $PHP_SELF változóval. • A fájl feltöltéséhez szükséges űrlapelemet a 24. sorban találjuk, melynek neve uploadfile, így ebből a $uploadfile változó fog keletkezni. A maximális fájlméretet (MAX_FILE_SIZE) beállítjuk 200000 bájtra, és egy rejtett mező segítségével küldjük tovább (22-23. sor). Ha kiválasztottuk a fájlt, akkor a fájl jellemzőit megjelenítő rész fut le (12-15. sor). • A 27. sortól már a záró lépések láthatók: a fájl a célszerver ideiglenes fájlokat tartalmazó könyvtárába került, és onnan el kell mozgatnunk a célkönyvtárba (30. sor). Ha ez sikerül, akkor készen vagyunk a feltöltéssel, ellenkező esetben valami hiba folytán vagy nem került a fájl az ideiglenes fájlokat tartalmazó könyvtárba (pl. túl nagy a fájl), vagy nem lehet onnan elmozgatni.
Adatbázisok: MySQL • A PHP előnyei közé soroltuk, hogy rengeteg adatbázissal képes dolgozni. Az adatbázisokhoz való csatlakozás, illetve azok kezelése a PHP-ben nagyon hasonló. A MySQL fejlesztői azt a célt tűzték ki, hogy egy praktikus, mindennapi használatra alkalmas adatbázist fejlesszenek, amely biztosítja a MySQL további sikerességét. Több érv is a MySQL adatbázis mellett szól: • Egyszerű és gyors. • Nyílt forráskódú. • A kicsi és közepes méretű honlapokhoz ideális. • A legtöbb szolgáltató a PHP-MySQL párost szokta nyújtani. • A phpMyAdmin Database Manager egy olyan felületet nyújt, amely segítségével könnyen kezelhetjük a MySQL adatbázisainkat. • Természetesen nem azt állítjuk, hogy a MySQL a legjobb adatbáziskezelő. Az adott feladat dönti el, hogy milyen adatbázist célszerű választani. Csupán megjegyeztük, hogy egy közepes méretű honlaphoz tökéletes az egyszerűsége és gyorsasága miatt.
MySQL adattípusok • Amennyiben adatbázisokban akarunk adatokat tárolni, ugyanúgy figyelembe kell vennünk, hogy milyen adattípusokat használhatunk. A következő táblázatok a különféle típusokat tartalmazzák: • Egész számok
MySQL adattípusok Lebegőpontos számok: Dátum és idő: Sztringek:
Kapcsolódás a kiszolgálóhoz • Miután telepítettük a MySQL-t számítógépünkre, távoli vagy helyi gépek felhasználói bármikor csatlakozhatnak hozzá. A csatlakozáshoz természetesen felhasználónévre és jelszóra van szükség, és miután sikerült a csatlakozás sem biztos, hogy minden adatbázishoz hozzáférhetünk. A MySQL telepítés közben kér egy rendszergazda felhasználónevet és jelszót. • A látogatókat azonban a későbbiekben nem célszerű a rendszergazda felhasználónévvel és jelszóval csatlakoztatni a MySQL-hez, mert a rendszergazdának teljes jogosultsága van. A MySQL sikeres telepítése után javasolt létrehozni egy olyan felhasználót, akinek csak a feltétlenül szükséges jogai vannak meg, majd ezzel csatlakoztatni az összes látogatót.
Kapcsolódás a kiszolgálóhoz • A kapcsolódáshoz a mysql_connect() függvényt használjuk, ami 3 paramétert vár: szervernév, felhasználónév, jelszó. Ha nem adunk meg szervernevet, úgy alapértelmezetten a localhost-ot használja. Az üresen hagyott felhasználónév helyére a webszerverfolyamat tulajdonosának neve kerül, az üresen hagyott jelszó helyére pedig üres sztring. Ily módon el is lehet hagyni mindent, ha a MySQL a gépünkön fut, és a honlap az egyedüli honlap a gépen. Mi az összes példában megadjuk a paramétereket. • $kapcsolat=mysql_connect("localhost","felhasznalo","jelszo"); • if (!$kapcsolat) • die("Nem lehet csatlakozni a MySQL kiszolgálóhoz!"); • A $kapcsolat változóba mentjük a függvény által visszaadott azonosítót, hogy később folytathassuk munkánkat. Ha kapcsolat bontására a mysql_close() függvény szolgál.
Adatbázisok kiválasztása, listázása • Az adatbázis kiválasztásához a mysql_select_db() utasítást használjuk: • mysql_select_db("filmek",$kapcsolat) or die("Nem lehet megnyitni a filmek adatbázist: ".mysql_error()); • A függvény logikai értéket ad vissza, hamis logikai érték esetén ellenőriznünk kell, hogy létezik-e az adatbázis, illetve, hogy van-e jogunk hozzá. A mysql_error() függvény segítségével jeleníthetjük meg a hiba okát (a MySQL által legutoljára jelentett hibát adja vissza). A $kapcsolat paraméter elhagyható a legtöbb függvény esetében, az aktuális kapcsolat automatikusan behelyettesítődik. • Az létező adatbázisok listázásához a mysql_list_dbs() függvényt használjuk, ami egy eredményazonosítóval tér vissza, melyet a mysql_db_name() függvénynek kell átadnunk, hogy az adatbázisok neveit megkapjuk. Az utóbbi függvény vár egy sorszámot is, ami az adatbázis sorszámát jelöli. A példa a létező adatbázisok neveit jeleníti meg:
Adatbázisok kiválasztása, listázása • <?php • $felhasznalo="latogato"; • $jelszo="valami"; • $kapcsolat=mysql_connect("localhost",$felhasznalo,$jelszo); • if (!$kapcsolat) die("Nem lehet kapcsolódni a MySQL kiszolgálóhoz!"); • $adatbazisok=mysql_list_dbs(); • $adatbazisok_szama=mysql_num_rows($adatbazisok); • for ($i=0;$i<$adatbazisok_szama;$i++) • print mysql_db_name($adatbazisok,$i)."<br>"; • mysql_close(); • ?> • A 7. sorban található mysql_num_rows() függvény adja meg az adatbázisok számát az eredményazonosító segítségével. Ez a függvény egy tábla sorainak számát adja meg, így a későbbiekben még használni fogjuk.
Adatbázisok kiválasztása, listázása • Az előbbi feladatot megoldhattuk volna máshogy is. Ha ismerjük az adatbázisok kiíratásához szükséges SQL parancsot (SHOW DATABASES;), akkor ezt sztringként átadva a mysql_query() függvénynek (az SQL utasítások végéről el kell hagynunk a pontosvesszőt), megkapjuk az adatbázisok neveit. A mysql_query() függvény továbbítja az SQL-ben leírt utasításokat a kiszolgálóhoz. • <?php • $felhasznalo="latogato"; • $jelszo="valami"; • $kapcsolat=mysql_connect("localhost",$felhasznalo,$jelszo); • if (!$kapcsolat) die("Nem lehet kapcsolódni a MySQL kiszolgálóhoz!"); • $eredmeny=mysql_query("SHOW DATABASES"); • while ($sor=mysql_fetch_row($eredmeny)) • print $sor[0]."<br>"; • mysql_close(); • ?> • A 6. sorban kiadtuk a parancsot a MySQL kiszolgálónak, a kapott eredmény egy tábla formájában a $eredmeny változóba került. A táblát soronként tudjuk olvasni az első sortól kezdődően. Egy sor kiolvasásához a mysql_fetch_row() függvény szükséges, amely a $sor tömbbe tölti a sorban található adatokat. Mivel minden sor csak egy adatot tartalmaz (az aktuális adatbázis nevét), így azt a $sor[0]-ban érjük el. A while ciklus addig fut, amíg a mysql_fetch_row() tud új sort olvasni, azaz amíg van sora a táblának.
Adatbázisok tábláinak listázása • A táblanevek megjelenítéséhez használhatjuk a mysql_list_tables() PHP utasítást, vagy adhatunk ki SQL parancsot (SHOW TABLES FROM adatbazisnev;), mint ahogy azt az előbb tettük. A példaprogram szerkezete nagyon hasonlít az előzőre: • <?php • $felhasznalo="latogato"; • $jelszo="valami"; • $kapcsolat=mysql_connect("localhost",$felhasznalo,$jelszo); • if (!$kapcsolat) die("Nem lehet kapcsolódni a MySQL kiszolgálóhoz!"); • $adatbazis="stone"; • mysql_select_db($adatbazis,$kapcsolat) or • die("Nem lehet megnyitni a(z) $adatbazis adatbázist: ".mysql_error()); • $tablak=mysql_list_tables($adatbazis,$kapcsolat); • while ($sor=mysql_fetch_row($tablak)) • print $sor[0]."<br>"; • mysql_close(); • ?>
Táblák mezőinek listázása • Az előbb eljutottunk odáig, hogy egy adatbázis tábláinak nevét meg tudtuk jeleníteni, most a táblák mezőinek nevére, és egyéb tulajdonságára vagyunk kíváncsiak. • <?php • $felhasznalo="latogato"; • $jelszo="valami"; • $kapcsolat=mysql_connect("localhost",$felhasznalo,$jelszo); • if (!$kapcsolat) die("Nem lehet kapcsolódni a MySQL kiszolgálóhoz!"); • $adatbazis="stone"; • mysql_select_db($adatbazis,$kapcsolat) or die("Nem lehet megnyitni a(z) $adatbazis adatbázist: ".mysql_error()); • $tabla="hir"; • $mezok=mysql_list_fields($adatbazis,$tabla); • $mezok_szama=mysql_num_fields($mezok); • print "<table border=1><tr><td>Mező</td><td>Típus</td> • <td>Hossz</td><td>Flag-ek</td></tr>"; • for ($i=0;$i<$mezok_szama;$i++) • print "<tr><td>".mysql_field_name($mezok,$i)."</td> • <td>".mysql_field_type($mezok,$i)."</td> • <td>".mysql_field_len($mezok,$i)."</td> • <td>".mysql_field_flags($mezok,$i)."</td></tr>"; • print "<table>"; • mysql_close(); • ?>
Táblák adatainak megjelenítése • Az adatok lekérdezéséhez a SELECT * FROM tablanev; SQL parancsot használjuk a mysql_query() függvényben: • <?php • $felhasznalo="latogato"; • $jelszo="valami"; • $kapcsolat=mysql_connect("localhost",$felhasznalo,$jelszo); • if (!$kapcsolat) die("Nem lehet kapcsolódni a MySQL kiszolgálóhoz!"); • $adatbazis="stone"; • mysql_select_db($adatbazis,$kapcsolat) or die("Nem lehet megnyitni a(z) $adatbazis adatbázist: ".mysql_error());; • $tabla="hir"; • $mezok=mysql_list_fields($adatbazis,$tabla); • $mezok_szama=mysql_num_fields($mezok); • $parancs="SELECT * FROM ".$tabla; • $eredmeny=mysql_query($parancs); • print "<table border=1><tr>"; • for ($i=0;$i<$mezok_szama;$i++) • print "<td>".mysql_field_name($mezok,$i)."</td>"; • print "</tr>"; • while ($sor=mysql_fetch_row($eredmeny)) • { • print "<tr>"; • for ($i=0;$i<$mezok_szama;$i++) • print "<td>".$sor[$i]."</td>"; • print "</tr>"; • } • print "<table>"; • mysql_close(); • ?>
Adatbázis létrehozása és törlése • Adatbázis létrehozásához használhatjuk a PHP mysql_create_db() utasítását, vagy kiadhatjuk a CREATE DATABASE parancsot a kiszolgálónak: • <?php • $felhasznalo="latogato"; • $jelszo="valami"; • $kapcsolat=mysql_connect("localhost",$felhasznalo,$jelszo); • if (!$kapcsolat) die("Nem lehet kapcsolódni a MySQL kiszolgálóhoz!"); • $adatbazis="forum"; • if (mysql_create_db($adatbazis)) • print "A(z) $adatbazis adatbázis sikeresen létrehozva."; • else • print "A(z) $adatbazis adatbázist nem sikerült létrehozni: mysql_error(); • mysql_close(); • ?> • Adatbázis törléséhez a mysql_drop_db() függvényt használhatjuk a fentiekhez hasonló módon, vagy a DROP DATABASE parancsot adhatjuk ki.
Tábla létrehozása • A táblák létrehozásához nincs külön PHP-függvény, itt mindenképpen az CREATE TABLE parancsot kell használnunk, miután kiválasztottuk a megfelelő adatbázist. • <?php • $felhasznalo="latogato"; • $jelszo="valami"; • $kapcsolat=mysql_connect("localhost",$felhasznalo,$jelszo); • if (!$kapcsolat) die("Nem lehet kapcsolódni a MySQL kiszolgálóhoz!"); • $adatbazis="forum"; • mysql_select_db($adatbazis,$kapcsolat) or die("Nem lehet megnyitni a(z) $adatbazis adatbázist: ".mysql_error()); • $tabla="forumuser"; • $parancs="CREATE TABLE ".$tabla."(nev VARCHAR (30),fnev VARCHAR (30) • NOT NULL PRIMARY KEY,jszo VARCHAR(50),email VARCHAR (40))"; • if (mysql_query($parancs)) • print "A(z) $table tábla sikeresen létrehozva."; • else • print "A(z) $table táblát nem sikerült létrehozni: ".mysql_error(); • mysql_close(); • ?>
Tábla törlése • Táblák törléséhez a DROP TABLE utasítást használjuk: • $tabla="forumuser"; • $parancs="DROP TABLE ".$tabla; • if (mysql_query($parancs)) • print "A(z) $table tábla sikeresen törölve. "; • else • print "A(z) $table táblát nem sikerült törölni: ".mysql_error();
Adatok beszúrása • Amennyiben már sikerült létrehoznunk egy adatbázist egy táblával, akkor adatokat helyezhetünk el a táblában. Ahhoz, hogy az adatokat felvegyük, egy újabb SQL parancsra lesz szükségünk, az INSERT-re. A példa az előbb létrehozott forum adatbázis forumuser táblájába szúr be egy sort, azaz egy felhasználó adatait rögzíti: • Egy honlap esetében az adatokat természetesen majd egy űrlap segítségével fogjuk bekérni a felhasználótól. Amikor azonban a felhasználó adja meg az adatokat, elkerülhetetlen az adatok ellenőrzése.