WEBFEJLESZTÉS 2. ADATBÁZIS-KEZELÉS, OSZTÁLYOK Horváth Győző Egyetemi adjunktus 1117 Budapest, Pázmány Péter sétány 1/C, 2.420 Tel: (1) 372-2500/1816
2 Ismétlés
Ismétlés 3 Fájl/Adatbázis 3 4 Szerver 2 CGI 5 PHP 1 HTTP 6 Kliens
Ismétlés 4 Kliens Futtatókörnyezet Fájl (alkalmazásszintű) Változók (memória) PHP Adatbázis (alkalmazásszintű) Munkamenet (kliensszintű)
5 Adatbázisok
Fájl vs adatbázis 6 Fájl bármikor elérhető, nincs szükség plusz szoftverekre könnyen értelmezhető (ember, program) könnyen használható viszonylag kis méretű Adatbázis biztonságos típusos adatok bonyolult adatszerkezetek összetett kereshetőség fejlett konkurenciakezelés
Adatbázis-kezelő rendszerek 7 Adatbázis-kezelők MySQL PostgreSQL MSSQL Oracle SQLite stb. Specifikus függvények PHP-ban SQL utasítások 1 Szerver HTTP Kliens 6 2 CGI 5 Adatbázis 3 4 PHP
SQL utasítások 8 -- Lekérdezés select id, cim from filmek; select id, cim from filmek where id > 10; create table filmek ( id integer primary key, cim varchar(40), rendezo varchar(20), ev integer); -- Beszúrás insert into filmek (cim, rendezo, ev) values ('A hobbit 2', 'Michael Jackson', 2013); -- Módosítás update filmek set cim = 'A hobbit: Smaug Pusztasága', rendezo = 'Peter Jackson' where id = 11; -- Törlés delete from filmek where id = 12;
Feldolgozás lépései 9 kapcsolódás az adatbázis-kezelő rendszerhez az adatbázis kiválasztása SQL utasítások futtatása az adatbázis-kezelő rendszerben az SQL utasítás eredményének lekérdezése (ha van) a kapcsolat bontása
SQLite 10 Átmenet a fájl és adatbázis között adatbázis = fájl Verziók SQLite 2: minden szöveg (kivéve elsődeleges kulcs) SQLite 3: típusok, összetettebb SQL utasítások Kis projekteknél gyakori
SQLite függvények PHP-ban 11 $db = sqlite_open($fájlnév): megnyitja vagy létrehozza az adatbázist sqlite_close($db): adatbázis bezárása $eredmény = sqlite_query($db, $sql): SQL utasítás futtatására szolgál $siker = sqlite_exec($db, $exec): visszatérési érték nélküli SQL utasítások futtatására szolgál $tömb = sqlite_fetch_array($eredmény): eredménysorok lekérdezése $tömb = sqlite_array_query($db, $sql): eredménysorok tömbben sqlite_escape_string($s): érzékeny karakterek kódolása
Segédfüggvények 12 //Adatbázis megnyitása function adatbazis_nyit($fajlnev) { $db = sqlite_open($fajlnev, 0666, $sqliteerror); if (!$db) { die($sqliteerror); return $db; //Adatbázis-kapcsolat bezárása function adatbazis_zar($db) { sqlite_close($db);
Segédfüggvények 13 //Tábla létrehozása, ha még nem létezik function tabla_init($fajlnev, $tablanev, $create_sql) { $db = adatbazis_nyit($fajlnev); $siker = true; $result = sqlite_query($db, "SELECT name FROM sqlite_master WHERE type='table' AND name='{$tablanev'"); if (sqlite_num_rows($result) == 0) { $siker = sqlite_exec($db, $create_sql); //Lekérdezés végrehajtása, eredmény tömbbe adatbazis_zar($db); function lekerdezes_tombbe($sql) { $db = adatbazis_nyit('filmek.sqlite'); return $siker; $ered = sqlite_array_query($db, $sql, SQLITE_ASSOC); adatbazis_zar($db); return $ered;
Feladat 14 Adott filmek listája. Minden filmről tároljuk a címét, rendezőjét és megjelenési évét. Listázzuk ki a nyilvántartásunkban lévő filmeket! Adjunk lehetőséget új film felvételére!
15 Lista oldal <!doctype html> <html> <meta charset="utf-8"> <head> <title></title> </head> <body> <h1>filmlista</h1> <a href="ujfilm.php">új film...</a> <table> <tr> <th>cím</th> <th>rendezo</th> <th>év</th> </tr> <?php foreach ($filmek as $f) :?> <tr> <td><?php echo $f['cim'];?></td> <td><?php echo $f['rendezo'];?></td> <td><?php echo $f['ev'];?></td> </tr> <?php endforeach;?> </table> </body> </html> <?php //Feldolgozó függvények function osszes_film() { //??? //--------- //A "fõprogram" $filmek = osszes_film();?>
Lista oldal lényegi rész 16 //Tábla inicializálása Adatbázis $filmek_create_sql = 'create table filmek ( id integer primary key, cim, rendezo, ev)'; tabla_init('filmek.sqlite', 'filmek', $filmek_create_sql); //Feldolgozó függvények function osszes_film() { return lekerdezes_tombbe('select * from filmek'); //Feldolgozó függvény Fájl function osszes_film() { return fajlbol_betolt('filmek.json');
Új film oldal 17 <!doctype html> <html> <meta charset="utf-8"> <head> <title></title> </head> <body> <h1>új film</h1> <?php if ($hibak) :?> <ul> <?php foreach ($hibak as $hiba) :?> <li><?php echo $hiba;?></li> <?php endforeach;?> </ul> <?php endif;?> <form action="" method="post"> Cím: <br> <input type="text" name="cim" value="<?php echo $cim;?>"> <br> Rendező: <br> <input type="text" name="rendezo" value="<?php echo $rendezo;?>"> <br> Év: <br> <input type="text" name="ev" value="<?php echo $ev;?>"> <br> <input type="submit"> </form> </body> </html>
Új film oldal 18 <?php //Feldolgozó függvények function film_beszur($cim, $rendezo, $ev) { //??? //-------- //A "főprogram" $hibak = array(); $cim = ''; $rendezo = ''; $ev = ''; if ($_POST) { $cim = $_POST['cim']; $rendezo = $_POST['rendezo']; $ev = $_POST['ev']; if ($cim == '') { $hibak[] = 'Cím kötelező!'; if ($rendezo == '') { $hibak[] = 'Rendező kötelező!'; if (!is_numeric($ev) strlen($ev)!= 4) { $hibak[] = 'Rossz évszám!'; if (!$hibak) { if (film_beszur($cim, $rendezo, $ev)) { header('location: lista_fajl.php'); ;?>
Új film oldal lényegi rész //Tábla inicializálása 19 //... //Feldolgozó függvények function film_beszur($cim, $rendezo, $ev) { $cim = sqlite_escape_string($cim); $rendezo = sqlite_escape_string($rendezo); $ev = sqlite_escape_string($ev); Adatbázis $db = adatbazis_nyit('filmek.sqlite'); $result = sqlite_exec($db, "insert into filmek (id, cim, rendezo, ev) values ( null, '{$cim', '{$rendezo', '{$ev' )"); adatbazis_zar($db); return $result; Fájl function film_beszur($cim, $rendezo, $ev) { $filmek = fajlbol_betolt('filmek.json'); $filmek[] = array( 'cim' => $cim, 'rendezo' => $rendezo, 'ev' => $ev, ); return fajlba_ment('filmek.json', $filmek);
20 Osztályok PHP-ban
Kódszervezés objektumokkal 21 Problémák névütközés globális változók egységbe zárás Objektumok Klasszikus OOP Osztályok
Objektum-orientáltság PHP-ban 22 osztályok (class), láthatóság szabályozása (public, protected, private), konstruktorok, destruktorok ( construct, destruct), statikus adattagok és metódusok (static), absztrakt osztályok (abstract), interfészek (interface), öröklés (extends), stb.
Osztályok létrehozása 23 class Gyerek { public $kor; public $nev; public function construct($nev, $kor) { $this->nev = $nev; $this->kor = $kor; public function bemutatkozik() { echo "A nevem: {$this->nev\n"; public function alszik() { echo "Zzzzzzz...\n";
Objektum példányosítása 24 $zsofi = new Gyerek('Zsófia', 7); $matyi = new Gyerek('Mátyás', 2); $zsofi->bemutatkozik(); $matyi->bemutatkozik(); A nevem: Zsófia A nevem: Mátyás A nevem: Zsozsó $zsofi->nev = 'Zsozsó'; $zsofi->bemutatkozik();
Getterek és setterek 25 class Gyerek { private $kor; private $nev; public function construct($nev, $kor) { $this->nev = $nev; $this->kor = $kor; public function getnev() { return $this->nev; public function setnev($value) { $this->nev = $value; public function getkor() { return $this->kor; public function setkor($value) { $this->kor = $value; public function bemutatkozik() { /*...*/ public function alszik() { /*...*/ $sari = new Gyerek('Sári', 7); $sari->bemutatkozik(); $sari->setnev('sarah'); $sari->bemutatkozik(); A nevem: Sári A nevem: Sarah
Öröklés class 26 Ovodas extends Gyerek { private $jel; public function construct($nev, $kor, $jel) { parent:: construct($nev, $kor); $this->jel = $jel; $zsofi = new Gyerek('Zsófia,7); $zsofi->bemutatkozik(); public function getjel() { return $this->jel; public function setjel($value) { $this->jel = $value; $david = new Ovodas('Dávid',4,'perec'); $david->bemutatkozik(); $david->miajeled(); A nevem: Zsófia A nevem: Dávid A jelem: perec public function miajeled() { echo "A jelem: {$this->jel\n";
Példa 27 Filmek listázása Új film beszúrása Osztályokba szervezve
fileio.php 28 class FileIO { public static function fajlbol_betolt($fajlnev, $alap = array()) { $s = @file_get_contents($fajlnev); return ($s === false? $alap : json_decode($s, true)); public static function fajlba_ment($fajlnev, $adat) { $s = json_encode($adat); return file_put_contents($fajlnev, $s, LOCK_EX);
29 class FilmAdat { private $filmek; private $fajlnev; public function construct($fajlnev = '') { if (!$fajlnev) { die('nincs adatfájl!'); $this->fajlnev = $fajlnev; $this->filmek = FileIO::fajlbol_betolt($this->fajlnev); public function destruct() { FileIO::fajlba_ment($this->fajlnev, $this->filmek); public function osszes_film() { return $this->filmek; public function film_beszur($cim, $rendezo, $ev) { $this->filmek[] = array( 'cim' => $cim, 'rendezo' => $rendezo, 'ev' => $ev, ); return true; filmadat.php
lista_fajl.php 30 define('token', 'Védelem'); include('kozos/fileio.php'); include('adat/filmadat.php'); $fajlnev = dirname( FILE ). '/filmek.json'; $filmadat = new FilmAdat($fajlnev); $filmek = $filmadat->osszes_film(); include('kimenet/lista_sablon.php');
31 define('token', 'Védelem'); ujfilm_fajl.php include('kozos/fileio.php'); include('adat/filmadat.php'); //--------- $fajlnev = dirname( FILE ). '/filmek.json'; $hibak = array(); $cim = ''; $rendezo = ''; $ev = ''; if ($_POST) { $cim = $_POST['cim']; $rendezo = $_POST['rendezo']; $ev = $_POST['ev']; if ($cim == '') { $hibak[] = 'Cím kötelező!'; if ($rendezo == '') { $hibak[] = 'Rendező kötelező!'; if (!is_numeric($ev) strlen($ev)!= 4) { $hibak[] = 'Rossz évszám!'; if (!$hibak) { $filmadat = new FilmAdat($fajlnev); if ($filmadat->film_beszur($cim, $rendezo, $ev)) { header('location: lista_fajl.php'); ; include('kimenet/ujfilm_sablon.php');
32 JSON kommunikáció
Feltöltés 33 Tetszőleges adatszerkezet objektum, tömb Sorosítás szöveg sz = JSON.stringify(adat) Felküldés Űrlap AJAX
Felküldés űrlap 34 <form id="formment" action="" method="post"> <input type="hidden" name="adat" id="adat"> <input type="submit" value="mentés"> </form> //Eseménykezelők hozzárendelése function init () { $('formment').addeventlistener('submit', mentes, false); //Elküldéskor function mentes (e) { var adat =...; $('adat').value = JSON.stringify(adat);
Felküldés AJAX 35 //Eseménykezelők hozzárendelése function init () { $('gombment').addeventlistener('click', mentes, false); //Elküldéskor function mentes (e) { var adat =...; var s = JSON.stringify(adat); ajax({ url: 'mentes.php', mod: 'post', postadat: 'adat=' + s, siker: function () { //... );
Fogadás űrlap, AJAX 36 $s = $_POST['adat']; //s feldolgozása, elmentése, pl. $tomb[] = $s; // vagy $adat = json_decode($s, true);
Leküldés AJAX 37 $s = json_encode($adat); echo $s; function leker(e) { ajax({ url: 'leker.php', mod: 'get', getadat: 'azon=12', siker: function (xhr, text) { var json = JSON.parse(text); console.log(json); //JSON feldolgozása );
Leküldés szkript 38 <?php $s = json_encode($adat);?> var adat = <?php echo $s;?> <?php $id = $_GET['id'];?> <!doctype html> <html> <head> <!--... --> <script type="text/javascript" src="adat.php?id=<?php echo $id;?>"></script> <!--... --> </head>
Összefoglalás 39 Adatbázisok kezelése PHP-ban SQLite adatbázisok Osztályok és objektumok PHP-ban AJAX kommunikáció