Adatbázis Rendszerek II. 5. Ea: MySQL - PHP B I v: T 2014.02.15 M A N 1/82
Témakörök PHP, HTML alapok (gyorstalpaló) Melós (miniprogram) PHP előkészületek PHP adatbázis alapok A kategória tábla PHP programja Tárolt rutinok hívása PHP-ből Tranzakció kezelés PHP-ből 2/82
A cél: Webes kliensről manipulálni az adatbázist. 3/82
A megoldás: PHP alkalmazása Kliens-oldal Szerver-oldal HTTP <?php $connect SQL HTML <HTML> <HEAD> <TITLE> PHP </TITLE> </HEAD> Piros Kék Zöld Piros, Kék, Zöld 4/82
PHP 1995: Rasmus Lerdorf, Personal Home Page Tools 1997: PHP 3.0, Hypertext Preprocessor Szerver oldali programozási nyelv, Dinamikus HTML oldalak készítésére, Nyílt forráskódú, Hordozható: UNIX, Linux, Windows változatok, Apache és IIS alatt egyaránt működik. 5/82
Tudattágítók Rasmus Lerdorf, Andi Gutmans, Zeev Suraski 6/82
Dinamikus HTML oldal PHP-vel <HTML> <HEAD><TITLE>HTML PHP-vel!</TITLE></HEAD> <BODY> Kakukk! <br> A mai dátum: <?php echo date("y.m.d");?> <br> Az aktuális időpont : <?php echo date("h");?> óra, <?php echo date("i");?> perc, <?php echo date("s");?> másodperc. </BODY> </HTML> Mitől dinamikus? 7/82 F5
PHP 2 perc alatt 1. perc A PHP kód kezdete: <?php... vége:?> Szintaxis: Változók: Gyengén típusos nyelv! 8/82 $szoveg = "Kakukk"; $egész = 123; $tört = 18.39; $napok = array("hétfő", "kedd",); $napok[ ] = "szerda"; $szam = array("egy"=> 55, "ketto"=>37); $szam["három"]=26; Automatikus típuskonverzió! Operátorok: $a, $b, $c = 3; $sz1, $sz2 = "retek"; ++$a; --$a; $a *= $b; $a = $b / $c; $a = $b % $c; $sz = $sz1.$sz2; retekretek $sz1.= $sz2 If ($a == 7) then, If ($a === $b) then, If ($a!== $b) then!, &&,, xor,
PHP 2 perc alatt 2. perc A PHP kód kezdete: <?php... vége:?> Szintaxis: If (feltétel) { utasítások; } elsif { ; } else { ; } Switch (változó) case címke: utasítás; break; default: While (feltétel) { utasítások; } Do { utasítások; } while (feltétel); For (kezdőérték; kilépési feltétel; növekmény){ utasítások; } Pl.: for ($s=0, $i=1; $i<=10; ++$i) { $s += $i; } Kommentek: /* */, vagy sor elején //, # 9/82
HTML űrlap Beviteli elemek <input type= xxx > text password checkbox radio select submit reset 10/82
HTML űrlap PHP kezeléssel <html> <head> <title> Bejelentkezés </title> </head> <body> <form action="belep.php" method=post> <p>kérem a nevet: <br> <input type=text name="nev" size=20> <p>kérem a jelszót: <br> <input type=password name="psw" size=20> <p><input type=submit name="kuldes" value="belépek"></p> </form> </body> </html> 11/82
belep.php <?php $conn = oci_connect('suser','spswd','localhost/xe'); $stmt = oci_parse($conn, "Select count(*) DB from melos where nev= :nev and jelszo= :psw"); oci_bind_by_name( $stmt," :nev",$_post['nev']); oci_bind_by_name( $stmt," :psw",$_post['psw']); oci_execute( $stmt); oci_fetch( $stmt); $db = oci_result( $stmt, "DB"); if ( $db == 1) { echo "Üdv a fedélzeten!"; } else { echo "Ússz csak tovább!"; } oci_free_statement( $stmt); oci_close( $conn);?> 12/82
Témakörök PHP, HTML alapok (gyorstalpaló) Melós (miniprogram) PHP előkészületek PHP adatbázis alapok A kategória tábla PHP programja Tárolt rutinok hívása PHP-ből Tranzakció kezelés PHP-ből 13/82
A feladat alapja: A Melos tábla: Azon Nev Melos Fizetes Create table Melos( Azon char(3) primary key, Nev char(20), Fizetes number(6)); 14/82
abkezel.php (1. rész) <html><head><title> ab kezelő </title> </head><body> <p><b>adatfelvitel</b></p> <form action="insert.php" method=post> <p>kérem az azonosítót: <br> <input type=text name="az" size=4> <p>kérem az új nevet: <br> <input type=text name="tm" size=20> <p>kérem a fizetést: <br> <input type=text name="tm2" size=12> <p><input type=submit name="küldés" value="beszúr"> <input type="reset" value="ürít"></p> </form><br> 15/82
abkezel.php (2. rész) <p><b>adatmódosítás</b></p> <form action="updatefiz.php" method=post> <p>kérem az azonosítót: <br> <input type=text name="az" size=4> <p>kérem az új fizetést: <br> <input type=text name="fiz" size=6> <p><input type=submit name="küldés2" value="módosítás"></p> </form><br> 16/82
abkezel.php (3. rész) <p><b>adattörlés</b></p> <form action="delete.php" method=post> <p>kérem a törlendő azonosítót: <br> <input type=text name="dr" size=4> <p><input type=submit name="küldés4" value="rekord törlése"></p> </form><br> <p><b>lista</b></p> <form action="kiirciklus.php" method=post> <p><input type=submit name="küldés3" value="kiíratás"></p> </form> </body> </html> 17/82
PHP MySQL kapcsolat Mysql csomag Függvények, eljárások gyűjteménye, melyekkel megvalósítható az adatbázis-kezelés PHP-ből. Helye: a PHP csomagban a php_mysql.dll Engedélyezése: php.ini fájlban kivenni a ;-t: ; extension=php_mysql.dll A PHP kódok futtatásához szükséges egy webszerver, ami alá telepítve van a PHP. Otthonra: XAMPP (Apache, MySQL, PHP, ) Letöltés: xampp.fs.net 18/82
PHP MySQL kapcsolat 19/82
PHP MySQL insert.php <?php $c = mysql_connect("hostnév","user","jelszó"); $mdb = mysql_select_db("dbnév",$c); $sql = "insert into t1 values('$az','$tm',$tm2)"; if (mysql_query($sql,$c)){ echo "Rekord hozzáadva!"; } else { echo "Gond van!"; } mysql_close($c);?> 20/82
PHP MySQL updatefiz.php <?php $c = mysql_connect("hostnév","user","jelszó"); $mdb = mysql_select_db("dbnév",$c); $sql = "update t1 set fizetes=$fiz where azon='$az'"; $fut = mysql_query($sql,$c); print $fut; mysql_close($c);?> 21/82
PHP MySQL delete.php <?php $c = mysql_connect("hostnév","user","jelszó"); $mdb = mysql_select_db("dbnév",$c); $sql = "delete from t1 where azon='$dr'"; $fut = mysql_query($sql,$c); print $fut; mysql_close($c);?> 22/82
PHP MySQL kiirciklus.php <?php $c = mysql_connect("hostnév","user","jelszó"); $mdb = mysql_select_db("dbnév",$c); $eredmeny = mysql_query("select * from t1"); while($adat = mysql_fetch_assoc($eredmeny)) { print ("Azon: ".$adat["azon"]." Név: ".$adat["nev"]." Fizetés: ".$adat["fizetes"]); } print("<br>");?> 23/82
Témakörök PHP, HTML alapok (gyorstalpaló) Melós (miniprogram) PHP előkészületek PHP adatbázis alapok A kategória tábla PHP programja Tárolt rutinok hívása PHP-ből Tranzakció kezelés PHP-ből 24/82
Előkészületek (1) 25/82
Előkészületek (2) 1 2 extension=php_mysql.dll 26/82
Előkészületek (3) 2 1 3 27/82
Hello.php 28/82
Témakörök PHP, HTML alapok (gyorstalpaló) Melós (miniprogram) PHP előkészületek PHP adatbázis alapok A kategória tábla PHP programja Tárolt rutinok hívása PHP-ből Tranzakció kezelés PHP-ből 29/82
Kategóriák lekérdezése 30/82
Kapcsolódás Vizsgálat Nincs ilyen ismert állomás. Access denied for user 'roott'@'localhost' (using password: YES) 31/82
PHP Elegáns megoldás Kapcsolódási metódusok elhelyezése fájlban. 32/82
HTML Elegáns megoldás Táblázatos formátumú kiíratás 33/82
PHP - Védelem.htaccess (Apache webszerver egyik fájlja) A.htaccess a fájl teljes neve, és nem a kiterjesztése. A.htaccess fájl mindig azt a könyvtárat illetve a benne lévő alkönyvtárakat védi, melyben elhelyezésre kerül. A segítségével megoldható feladatok: egyéni hibalapok (404-es hiba), jelszavas védelem, látogatók tiltása IP alapján, alapértelmezett fájl megváltoztatása (pl. index.html alma.php), átirányítások, könyvtárlistázás tiltása, adott fájlok elérésének letiltása. 34/82
Példa (1) 1 2 3 4 35/82
Példa (2) 6 5 36/82
Példa (3) 8 7 37/82
Témakörök PHP, HTML alapok (gyorstalpaló) Melós (miniprogram) PHP előkészületek PHP adatbázis alapok A kategória tábla PHP programja Tárolt rutinok hívása PHP-ből Tranzakció kezelés PHP-ből 38/82
Bolt adatbázis Kkód Név Tkód Név Ár Kategória K-T Termék Leírás Sorszám Vásárlás Időpont Név Darab Fkód Leírás Vásárló V-F Fizetés VID Cím 39/82
Bolt Struktúra Kategória Kkód Név Termék Kategória Tkód Név Ár Leírás Vásárlás Tkód Sorszám Időpont Darab VID Vásárló Fizetés VID Név Cím Fizmód Fkód Leírás 40/82
A Kategória tábla kezelő felülete KategoriaKezelo.php 1 2 3 41/82 4
KategoriaKezelo.php (1) <html><head><title> Kategória Kezelő </title></head> <body> <p><b>kategória lista</b></p> <form action="katlista.php" method=post> <input type=submit name="lista" value="listázás"> </form> 1 42/82
KategoriaKezelo.php (2) <p><b>kategória kereső</b></p> <form action="katnev.php" method=post> <select name="kkodok"> <?php include "seged.php"; MakeCon(); $eredmeny = mysql_query("select Kkód from kategória order by Kkód"); while($adat = mysql_fetch_assoc($eredmeny)){ print '<option value="'.$adat['kkód'].'">.$adat['kkód'].'</option>'; } CloseCon();?> 43/82 2/1
KategoriaKezelo.php (3) </select> <input type=submit name="keres" value="keresés"> </form> 2/2 44/82
KategoriaKezelo.php (4) <p><b>új kategória</b></p> <form action="ujkat.php" method=post> Kód: <input type=text name="ujkod" size=6><br><br> Név: <input type=text name="ujnev" size=20><br><br> <input type=submit name="ujkat" value="létrehozás"> </form> 3 45/82
KategoriaKezelo.php (5) <p><b>kategória törlés</b></p> <form action="kattorol.php" method=post> <select name="ktkod"> <?php MakeCon(); $eredmeny = mysql_query("select Kkód from kategória order by Kkód"); while($adat = mysql_fetch_assoc($eredmeny)){ print '<option value="'.$adat['kkód'].'">.$adat['kkód'].'</option>'; } CloseCon();?> </select> <input type=submit name="torol" value="törlés"> </form> 46/82 4
KategoriaKezelo.php (6) 4 47/82
katlista.php (1) <table width="200" border="1"> <tr> <th width="50"> <div align="center">kód </div></th> <th width="150"> <div align="center">név </div></th> </tr> 1 <?php include "seged.php"; MakeCon(); 48/82
katlista.php (2) $eredmeny = mysql_query("select * from kategória order 1 by Kkód"); while($adat = mysql_fetch_assoc($eredmeny)){ print '<tr><td>'.$adat["kkód"].'</td><td>'.$adat["név"].'</td></t r>'; } CloseCon();?> </table> <br> <form action="kategoriakezelo.php" method=post> <input type=submit name="vissza" value="vissza"> </form> 49/82
katlista.php (3) 1 50/82
katlista.php (4) 1 51/82
katnev.php (1) <?php include "seged.php"; MakeCon(); $kk = $_REQUEST['kkodok']; $eredmeny = mysql_query("select Név from kategória where Kkód='$kk'"); $adat = mysql_fetch_array($eredmeny); echo 'A '.$kk.' kategória neve: '.$adat["név"]; CloseCon();?> <form action="kategoriakezelo.php" method=post> <input type=submit name="vissza" value="vissza"> </form> 2 52/82
katnev.php (2) 2 53/82
Kategória keresés B-verzió (1) A KategoriKezelo.php ablakában íródik ki az eredmény 54/82
Kategória keresés B-verzió (2) <p><b>kategória kereső</b></p> 2B <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post"> <select name="kkodok"> <?php include "seged.php"; MakeCon(); $eredmeny = mysql_query("select Kkód from kategória order by Kkód"); print '<option value="null">kkód</option>'; 55/82
Kategória keresés B-verzió (3) while($adat = mysql_fetch_assoc($eredmeny)){ 2B if($adat['kkód']!= ' ') { print '<option value="'.$adat['kkód'].'">'.$adat['kkód'].'</option>'; } } CloseCon();?> </select> <input type=submit name="keres" value="keresés"/> </form> 56/82
Kategória keresés B-verzió (4) <?php if($_post) { if(isset($_post['kkodok'])) { if($_post['kkodok'] == 'NULL') { } echo '<p>válassz ki egy Kategóriakódot, aztán <strong>keresés</strong>.</p>'; else { 2B 57/82
Kategória keresés B-verzió (5) MakeCon(); $kk = $_POST['kkodok']; $eredmeny = mysql_query("select Név from kategória where Kkód='$kk'"); $adat = mysql_fetch_array($eredmeny); echo 'A <strong>'.$kk.' </strong>kategória neve: <strong>'.$adat["név"]; CloseCon(); } #else } #if(isset } # if($_post) {?> 2B 58/82
Kategória keresés B-verzió (6) 2B 59/82
ujkat.php (1) <?php include "seged.php"; MakeCon(); $sql="insert INTO Kategória VALUES ('$_POST[ujkod]','$_POST[ujnev]')"; if (mysql_query($sql,$con)){ echo "Rekord hozzáadva!"; } else { echo "Gond van:".mysql_error(); } CloseCon();?> <form action="kategoriakezelo.php" method=post> <input type=submit name="vissza" value="vissza"> </form> 60/82 3
ujkat.php (2) 3 61/82
kattorol.php (1) <?php include "seged.php"; MakeCon(); $kk = $_REQUEST['ktkod']; $sql="delete FROM Kategória Where Kkód='$kk'"; $dd = mysql_query($sql,$con); if ($dd){ echo "Rekord törölve!"; } else { echo "Gond van: ".mysql_error(); } CloseCon();?> <form action="kategoriakezelo.php" method=post> <input type=submit name="vissza" value="vissza"> </form> 62/82 4
kattorol.php (2) 4 63/82
64/82
Témakörök PHP alapok, HTML (gyorstalpaló) Melós (miniprogram) PHP előkészületek PHP adatbázis alapok A kategória tábla PHP programja Tárolt rutinok hívása PHP-ből Tranzakció kezelés PHP-ből 65/82
Bolt KatNév tárolt eljárás KatNév nevű tárolt eljárás, mely kiírja a képernyőre egy paraméterként megadott kódú kategória nevét. DELIMITER // CREATE PROCEDURE KatNév (in kk char(3)) BEGIN Select Név from Kategória where Kkód = kk; END; // DELIMITER ; CALL KatNév( k01 ); 66/82
katnev.php <?php include "seged.php"; MakeCon(); $kk = $_REQUEST['kkodok']; $eredmeny = mysql_query("call KatNév('$kk')"); $adat = mysql_fetch_array($eredmeny); echo 'A '.$kk.' kategória neve: '.$adat["név"]; CloseCon();?> <form action="kategoriakezelo.php" method=post> <input type=submit name="vissza" value="vissza"> </form> 67/82
Bolt UjKat tárolt eljárás UjKat nevű tárolt eljárás, mely létrehoz egy új kategóriát. DELIMITER // CREATE PROCEDURE UjKat (in kk char(3), in kn varchar(20)) BEGIN Insert Kategória values (kk, kn); END; // DELIMITER ; CALL UjKat( k10, Szerszámok ); 68/82
ujkat.php <?php include "seged.php"; MakeCon(); $sql="call UjKat ('$_POST[ujkod]','$_POST[ujnev]')"; if (mysql_query($sql,$con)){ echo "Rekord hozzáadva!"; } else { echo "Gond van:".mysql_error(); } CloseCon();?> <form action="kategoriakezelo.php" method=post> <input type=submit name="vissza" value="vissza"> </form> 69/82
Bolt Bevétel tárolt függvény Bevetel nevű tárolt függvény, mely megadott nap bevételét adja vissza. DELIMITER // CREATE FUNCTION Bevetel (ip varchar(15)) returns int BEGIN DECLARE bev int default 0; set ip = Concat(ip, % ); select sum(ár*darab) into bev from Termék T inner join Vásárlás V ON T.Tkód=V.Tkód where időpont like ip; RETURN bev; END; // DELIMITER ; SELECT Bevetel( 2013-03-21 ); 70/82
bevet.php <?php include "seged.php"; MakeCon(); $dd = $_REQUEST['bedat']; $eredmeny = mysql_query("select Bevetel('$dd')"); $adat = mysql_fetch_array($eredmeny); echo 'A '.$dd.' napi bevétel: '.$adat[0]; CloseCon();?> <form action="kategoriakezelo4.php" method=post> <input type=submit name="vissza" value="vissza"> </form> 71/82
Témakörök PHP, HTML alapok (gyorstalpaló) Melós (miniprogram) PHP előkészületek PHP adatbázis alapok A kategória tábla PHP programja Tárolt rutinok hívása PHP-ből Tranzakció kezelés PHP-ből 72/82
Autocommit mód SELECT @@autocommit; SET autocommit=0; 73/82
Tranzakció kezelés PHP-ből mysql_query("set AUTOCOMMIT=0"); mysql_query("start TRANSACTION"); $a1 = mysql_query("insert INTO... "); $a2 = mysql_query("update... "); if ($a1 and $a2) { mysql_query("commit"); } else { mysql_query("rollback"); } 74/82
Izolációs szint beállítása SELECT @@tx_isolation; SET [GLOBAL SESSION] TRANSACTION ISOLATION LEVEL REPEATABLE READ READ COMMITTED READ UNCOMMITTED SERIALIZABLE SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 75/82
Izolációs szintek Isolation level Elkülönítési szint Phantom read Fantom olvasás Nem lehetséges Non repeatable read Nem megismételhető olvasás Dirty read Piszkos olvasás Serializable Sorba rendezhető Nem lehetséges Nem lehetséges Repeatable read Lehetséges Nem lehetséges Nem lehetséges Ismételhető olvasású Read Committed Olvasás biztos Lehetséges Lehetséges Nem lehetséges Read Uncommitted Nem olvasás biztos Lehetséges Lehetséges Lehetséges 76/82
Adatbázis Rendszerek II. Ellenőrző kérdések 77/82
Ellenőrző kérdések 1. 1. Milyen sorrendben jelennek meg az alábbi HTML kódelemek? Kezdje a számozást a legkorábbival. </HEAD> </HTML> <BODY> </TITLE> 2. Melyik a sortörés kódja HTML-ben? A: <lb> B: <br> C: <rb> D: <div> 78/82
Ellenőrző kérdések 2. 3. Írja be a hiányzó kifejezéseket (kapcsolódás, kiolvasás, lezárás)! $con= connect 1. $mdb = seldb 2. $eredmeny = query 3. ("localhost","root","root"); ("bolt",$con); $adat = fetch_array 4. ($eredmeny); close 5. ($con); ("call KatNév('$kk')"); 79/82
Ellenőrző kérdések 3. 4. Mi a neve annak a fájlnak, melyben megadhatók az Apache webszerver védelmi beállításai: 5. Milyen típus(ok) állhat(nak) a kipontozott helyen? <form> <p>kérem a nevemet: <br> <input type=.......... name="tm" size=17> </p> A: text B: password C: checkbox D: submit 80/82
Felhasznált irodalom php.net MySQL Manual www.w3school.com PHP MySQL Tutorial www.w3school.com HTML Reference www.tizag.com MySQL Tutorial www.tutorialspoint.com MySQL Tutorial 81/82
VÉGE V É G E 82/82