MySQL SQL nyelv Bevezetés Lekérdezések ▪ ▪ ▪ ▪
SELECT FROM WHERE Egyéb feltételek (GROUP BY, HAVING, ORDER BY… stb.)
Szintaxis Beszúrás Törlés Módosítás
Adatbázis-kezelő (DBMS) Nagymennyiségű adat tárolása ▪ Rendezett formában ▪ Biztonságosan ▪ Könnyen kezelhetően
Szükséges hozzá egy nyelv: SQL
SQL lekérdező nyelv, mely adatdefiníciós és adatmanipulációs nyelv egyben! A MySQL egy kezelőfelület hozzá, de SQL-el működik pl az Office-ban megtalálható Microsoft Access is!
Hogyan is képzeljünk el egy kezelőfelületet illetve egy adatbázist?
Mintha egy táblázatban tárolnánk soronként az összetartozó adatokat! Például itt egy-egy sor egy-egy hírnek felel meg. Oszlopok (mezők): id – egyedi szám, azonosító (nem lehet két sornak azonos) cím – a hír címe lead – a hír bevezető szövege szoveg – a hír tartalma datum – keletkezés dátuma fooldalra – főoldalon kint legyen vagy csak az archívumban (igen/nem) hely – ha a főoldalon kint van, akkor sorrendben hanyadik legyen típus – megjelenési típusa (csak címe, vagy kis bevezető is)
A táblázat sorait rekordoknak, oszlopait mezőknek hívjuk, így rekord: összetartozó mezők összessége mező: azonos típusú adatok összessége mezőnek van típusa
Egyes mezők típusa a példában: id cím lead szoveg datum fooldalra hely típus
– szám = bigint (20 jegy hosszú max.) – extra oszlopban auto_increment = minden új sor egyel nagyobb azonosítót kap, mint az előzőleg felvett soré – karakterlánc (szöveg) = varchar (250 karakter hosszú max.) – szöveg = text (nincs korlátozva) – szöveg = text (nincs korlátozva) – dátum és idő típus = datetime (alakja: 0000-00-00 00:00:00) – megadott értékekből kerülhet ki = enum (itt lehet: ‘igen’,’nem’,’archiv’) – szám = bigint (20 jegy hosszú max.) – megadott értékekből kerülhet ki = enum (itt lehet: ‘normal’, ‘link’)
Egész számokhoz TINYINT SMALLINT MEDIUMINT INT BIGINT Lebegőpontos számok DECIMAL FLOAT DOUBLE REAL Egyéb szám BIT BOOL SERIAL
Dátum és idő DATE (0000-00-00) DATETIME (0000-00-00 00:00:00) TIME (00:00:00) TIMESTAMP (0000-00-00 00:00:00) YEAR (0000) Rövidebb szöveg (255 karakterig) CHAR (fix hossz) VARCHAR (változó hossz) Nagy szöveg TINYTEXT TEXT MEDIUMTEXT LONGTEXT Egyszeres / többszörös választás ENUM SET
Mindig optimálisan válasszunk Magyar irányítószám mezőhöz elég egy SMALLINT (külföldihez
nem biztos!) ▪ ▪ ▪ ▪ ▪
TINYINT: SMALLINT: MEDIUMINT: INT: BIGINT
1byte 2byte 3byte 4byte 8byte
-128…127 -32768…32767
vagy vagy
0…256 0…65535
Előjel nélküli használathoz: UNSIGNED
CHAR – VARCHAR
CHAR: fix hosszú, ha nem tölti ki a szöveg, akkor is ugyanannyit
foglal
▪ Szóközökkel egészíti ki lekérdezésnél problémás
VARCHAR: változó hosszú, a tartalmához igazodik
Amit tennünk kell: • Létrehozni egy új táblázatot az adatbázisban (MySQL felületen, megadva az oszlopok nevét és típusát) • Jó, ha minden táblába elhelyezünk egy egyedi azonosítót (ID mező, extra legyen auto_increment)
• Ha megvan a tábla szerkezete (ezt nevezzük relációs sémának), akkor kitöltjük adatokkal (reláció) SQL adatmanipulációs és adatdefiníciós nyelv: Az adatokkal való feltöltést fogjuk mi végezni egy-egy oldalról (pl fórum üzenetet elküldünk) manipulálás Természetesen lehet olyan eset is, hogy egy oldalról létre kell hozni egy új táblázatot és nincs lehetőség arra, hogy a MySQL felületen készítsük el, ez is megtehető az SQL-el definiálás, erre itt nem térek ki. (lásd: SQL referencia pl. „create table” parancs)
SQL lekérdezés (kiolvassuk a táblázat valahány sorát) – előző példán: SELECT id,cim,datum - ezt a három oszlopot választjuk ki FROM news - a news táblából olvassuk ki az adatokat WHERE datum > ‘2006-12-31’ - azokat a sorokat, ahol teljesük a feltétel
SELECT id, cím, datum
WHERE datum > ‘2006-12-31’
Tehát a lekérdezésnél megadjuk: mit szeretnénk látni az eredményben (SELECT) honnan szedjük az adatot (FROM) SELECT-ben csak olyan mező lehet, ami az itt megadott táblákban van feltétel, hogy melyik sorokat lássuk (WHERE) SELECT után: mezőnevek lehetnek (csak a megadott oszlopokat adja vissza eredményül) * jel lehet = a megadott táblák összes oszlopát visszaadja aggregátum: pl. min(datum) – legkisebb dátumot adja vissza (van max() is) avg(mezo1) – adott típusú mező átlagértékét adja vissza sum(mezo1) – a valami oszlop összes elemének összegét adja vissza first(mezo1) – első értéket adja vissza (van last() is) count(*) – sorok számát adja vissza (amire teljesül a feltétel) egyéb: ucase(), lcase(), mid(), len(), round(), now(), format() FROM után: táblanevek vagy táblák összekapcsolása
gyerekek tábla
emberek tábla
pl.: f1 INNER JOIN f2 ON f1.id = f2.kod akkor használjuk, ha összetartozó adatokat pl két táblában tárolunk az egyik tábla azonosítóinak (id) egy része megtalálható a másik táblázat egyik oszlopában akár több sorban is (ez legyen most ‘kod’), akkor ezen a két mezőn össze tudjuk kapcsolni a két táblát f1 és f2 táblákat kapcsoljuk össze, ahol id = kod eredményben csak olyan id-jű, ami a másikban is van
eredmény
WHERE után: feltétel (mező >, <, <=, >=, =, <> mint egy adott érték) mező tartalmaz-e egy szövegrészletet – nev LIKE ‘zsuzs’ eredmény: semmi – nev LIKE ‘zsuzs%’ eredmény: zsuzsi % jel azt jelenti, hogy bármilyen karakterekkel (többel is) helyettesíthető az első példában viszont pontos ‘zsuzs’ egyezés kellett volna
több feltétel egymás után: pl.: foglalkozas=‘pék’ AND nev LIKE ‘*él*’ eredmény „béla” sor allekérdezés – pl.: WHERE nev IN (SELECT…FROM…WHERE…) az eredeti WHERE akkor teljesül, ha a név = a zárójeles rész eredményével használható még a BETWEEN operátor (vmilyen értékek közt – lehet szöveg is, ABC szerint) pl.: WHERE mezo BETWEEN érték1 AND érték2
Egyéb kifejezések: GROUP BY mezo1 – azokat a mezőket adjuk meg, amiket nem aggregátumokkal (min,sum,avg…) használunk – ha van aggregátum HAVING max(mezo1) > 3 – WHERE-hez hasonlóan feltételt tudunk vele meadni, de ezt aggregátumnál használjuk – Aggregátum: sum(),max(),min(),avg(),count()…stb. ORDER BY mezo1,mezo2 asc – eredmény rendezése mezo1, majd azon belül mezo2 alapján, növekvő sorrendben – növekvő sorrend = asc (ascending) | csökkenő sorrend = desc (decreasing) LIMIT start,count – eredményhalmaz szűkítése – start: az első elem – count: start után ennyi darab elemet adjon vissza – pl: LIMIT 5,10 6-15.sorok (hasznos lehet, ha pl. legjobb 5-öt kell kiválasztani: LIMIT 0,5)
Példa: SELECT foglalkozas FROM emberek Ekkor minden foglalkozást kilistázunk. A „pék” 2x szerepel, így 2x lesz az eredményben is. Ha azt szeretnénk, hogy azonos eredménysorok esetén csak 1x írja ki, használjunk SELECT DISTINCT-et: SELECT DISTINCT foglalkozas FROM emberek
Ha egy érték szám, akkor egyszerűen megadhatjuk – pl. id=3 Ha egy érték szöveg, akkor aposztrófok között adjuk meg – pl. nev=‘béla’ Ha valami bonyolultabb kifejezés, azt is aposztrófok közt adjuk meg – pl. datum < ‘2007-01-05 17:00:00’ Kis és nagybetűérzéketlen, tehát lehet SELECT, Select, select és akár SeLeCt is Az SQL nyelv szavait írjuk nagy betűkkel – pl.: ORDER BY
Táblába új sor beszúrása: INSERT INTO tablanev (mezo1,mezo2,mezo3) values (‘alma’,5,’igen’) Bezúrunk egy új sort a „tablanev” táblába Felsoroljuk azokat a mezőket, amikbe a values szó utáni értékeket írjuk. A két felsorolás sorrendje legyen ugyanaz! Tehát itt ‘alma’ kerül a mezo1-be, 5 a mezo2-be és ‘igen’ a mezo3-ba. Nem kell egy tábla összes mezőjét megadni a mezőlistában, a kihagyottakba az alapértelmezett érték kerül. Pl. az előzőhöz INSERT INTO emberek (nev,foglalkozas) values (‘gábor’,’közalkalmazott’) INSERT INTO gyerekek (kod,gyereke_neve) values (?????,’adorján’) A példában látjuk, hogy fel szeretnénk vinni gábor gyerekeit is a másik táblába, de nem tudjuk, hiszen az emberek tábla azonosítóját (id) nem mi adtuk meg, hanem auto_increment generálódik. Ekkor előbb le kell kérdezni, hogy mit kapott gábor id-nek, így a következő a helyes: INSERT INTO emberek (nev,foglalkozas) values (‘gábor’,’közalkalmazott’) SELECT max(id) FROM emberek INSERT INTO gyerekek (kod,gyereke_neve) values (???,’adorján’)
Még mindig nem vagyunk meg, hiszen tudjuk az id-t de el kell egy változóba menteni ahhoz, hogy meg lehessen utána adni ez majd PHP… visszatérünk rá!
Tábla sorainak törlése DELETE * FROM tablanev WHERE ___feltétel___ Szinte olyan, mint a lekérdezés, csak SELECT helyett DELETE Általában egy törlésnél egy egész sort törlünk, így az összes mezőt kiválasztjuk (*). A fenti lekérdezéssel a táblánk minden olyan sora törlődik, amire teljesül a megadott feltétel. Pl: DELETE * FROM emberek WHERE foglalkozas=‘pék’ Ekkor 2 sor törlődik ki: bélá-é és gáboré.
Tábla sorainak módosítása UPDATE tablanev SET mezo1=‘újérték1’, mezo2=‘újérték2’ Adott táblában a megadott mezők értékeit lecseréli arra, amit új értékként megadunk. Pl: UPDATE emberek SET foglalkozas=‘rocksztár’ Ez a kifejezés minden ember foglalkozását megváltoztatja rocksztárra. Ha azt szeretnénk, hogy csak bizonyos sorokban változzon a mezők értéke, akkor használjuk a WHERE feltételt itt is. Pl: UPDATE emberek SET foglalkozas=‘pék’ WHERE nev=‘mari’ Ekkor csak mari foglalkozása változik meg titkárról pék-re. • Természetesen sokmindenről nem esett szó, csak a legfontosabb dolgokat vettük át • Ajánlott tutorial: http://www.w3schools.com/sql/default.asp
Paksy Patrik
HTML XHTML PHP
Kód kerete Változók Operátorok Típusok Tömbök Apróságok ▪ Komment, aposztrófok, utasítások, kiíratás, külső állományok
Vezérlési szerkezetek ▪ If ▪ for ▪ while
HTML Statikus, nem változó dolgok Egyszerű leírónyelv
- HTML tag attribútummal (tulajdonság), és annak adott értékkel A tag-ek nagy részét le kell zárni: 5-ös méretű szöveg Legfőbb kivétel: sortörtés
HTML jól formált, szabványosabb változata A tag-eket a megnyitásuk szerint fordított sorrendben
zárjuk le
▪ Nem XHTML: félkövérfélkövér dőltdőlt ▪ XHTML: félkövérfélkövér dőltdőlt
Minden elemet le kell zárni ▪ Önlezáró elemeket is ▪ Nem XHTML: ▪ XHTML:
Mindent kisbetűsen írjunk ▪ Nem XHTML: / / ▪ XHTML:
A tulajdonságok értékeit aposztrófok közé tegyük ▪ XHTML: Kék szöveg
Hypertext Preprocesszor Scriptnyelv Szerveroldalon dolgozódik fel
Kliens (böngésző) kérést indít egy oldal letöltésére A szerver futtatja saját magán a PHP kódot Tiszta HTML kimenetet állít elő Ezt küldi vissza a kliens számára
Nézzük meg, pl:
http://www.berzsenyi.hu Ez is egy PHP fájl (index.php – alapértelmezett) Böngészőben keressük az „Oldal forrása”-t (Ctrl+U)
Fájltípus A fájl kiterjesztése nem *.html, hanem *.php PHP fájl futtat HTML-t, de a HTML nem futtat PHP-t
Helye a HTML oldalon belül: Bárhol, pl:
Mint a matematikai egyenleteknél, itt is vannak változók Tetszőleges név ▪ De számmal nem kezdődhet ▪ Alfanumerikus karakterek (0-9, a-z) és alulvonás (_) Jelölése ▪ $ jel, vagyis dollárjel (Ctrl + É) ▪ Példul: $valtozo
// az „a”nevű változó értékét 5-re állítja // az „a” változó értékét 96-ra állítja // az „a” változó értékét 1-re állítja // összehasonlítás, „a” legalább 3 // ez és az összefűzése egy szöveggé (ezaz) // a változó értékét egyel növeljük
Példák
A változóknak van típusuk is A PHP lazán típusos nyelv közvetlenül nem kell megadni, hogy egy változóban
mit tárolunk (pl szöveget vagy számot)
Típusok
Szöveg (aposztrófok között, pl: ”próba szöveg”) Szám ▪ Egész (pl.: 50) ▪ Lebegőpontos (pl.: 50.345)
Logikai érték (igaz / hamis azaz TRUE / FALSE) Tömb ▪ Több érték halmaza
Egy változóban több érték eltárolása rendezett formában Nagy mennyiségű adat eltárolása nem célszerű sok külön változóban Létrehozás: $auto = array(); Egy elem belepakolása: $auto[0] = ”audi”;
A nulla az index, ahol megtaláljuk majd később az elemet Úgy képzeljük el, mintha lenne egymás mellett sorban végtelen
ládánk, és egy adott ládába szeretnénk belepakolni egy dolgot ▪ Ha számokkal indexelünk ▪ Könnyű végigmenni a tömbön illetve végigkeresni adott érték után ▪ Általában 0-tól szokták kezdeni az indexelést
Megjegyzés írása a kódba ez nem kerül feldolgozásra ▪ // egy soros megjegyzés ▪ /* több soros is lehet ez a megjegyzés */ ▪ /* * Így illik a többsoros megjegyzést formázni */
Aposztrófok ▪ Sima ‘valami $a más’ ▪ Tiszta szövegként értelmezi minden esetben ▪ Példa: ha $a = 5, akkor az eredménye ‘valami $a más’ lesz ▪ Ha nincs a kifejezésben változó, akkor ezt érdemes használni Példa: $auto[‘elsoautom’] | ‘sima szöveg’
▪ Dupla ”valami $a más” ▪ A változókat feldolgozza benne ▪ Példa: ha $a = 5, akkor az eredménye ”valami 5 más” lesz
Utasítások Egy utasítást mindig le kell zárni lezárás jele: ”; ”
(pontosvessző) Példa: $a = 5;
Talán leggyakrabban használt függvény a kiíratás: echo ”ezt írjuk ki”; print ”ezt írjuk ki”;
Külső állományok elérése require(‘masikfajl.php’); Include(‘masikfajl.php’);
Feltételek megadása if ($a >= 5) {
// akkor hajtódik ez végre, ha $a értéke legalább 5 // ha ide belép, a többi ágat nem is vizsgálja
} else if ($a > 0) { // akkor hajtódik ez végre, ha 0-nál nagyobb $a } else if ($a == 0) { // akkor hajtódik végre, ha $a pontosan nulla // figyelem! Dupla egyenlőség jel, hiszen összehasonlítás } else { // minden egyéb esetben ide érünk, és ez hajtódik végre }
If Else if Else
mindig van nem mindig kell, de tetszőleges számú ág lehet nem mindig kell, max. egy lehet belőle, a legvégén
For ciklus Feladat: írjuk ki a számokat 1-től 100-ig for ($i = 0; $i <= 100; $i++) {
Tagadás: ! !kisebb10($r) ua, mint kisebb10($r) != true avagy kisebb10($r) == false
Objektum: változók és műveletek egységbe zárása Alapegység: osztály (class) Tagváltozó: osztály változói Tagfüggvény: osztály függvényei (metódus) Láthatóság 3 féle lehet ▪ Public – alapértelmezett, az osztályon kívülről is elérhető ▪ Private – csak az osztályon belül érhető el ▪ Protected – csak az adott osztályból, és annak leszármazottjaiból érhető el (öröklés, lásd később)
Láthatóság legláthatóbbtól a legkevésbé látható felé ▪ Public, protected, private
class Person { private $name; private $age; public __construct() { $name = ”ismeretlen”; $age = 0; } private setName($name) { $this->name = $name; } public getName() { return $this->name; }
$myClass = new Person(); // osztály példányosítása // Person() __construct() fut le $myClass->setAll(”Net Elek”, 35); $myName = $myClass->getName(); echo $myName; $myClass->setName(”Gipsz Jakab”); // nem megy, mert private a setName
KIS VÁLTOZTATÁS class Person { private $name; private $age; public __construct() { $name = ”ismeretlen”; $age = 0; }
A szülő osztály (Device) minden változóját és függvényét örökli a leszármazott avagy gyermek osztály (Computer, Printer) Öröklés: extends kulcsszó Ahhoz, hogy használni tudjuk a szülőben lévő dolgokat legalább protected láthatóságúnak kell lennie Struktúrálást tesz lehetővé Nem kell mindent többször megírni
Részletesebben nem foglalkozunk az Objektum Orientációval, lásd: php.net
Készítsünk egy egyszerű vendégkönyvet 1. Találjuk ki, hogy milyen adatokat szeretnénk benne tárolni
1. Feladó 2. Feladó e-mail címe 3. Feladási dátum 4. Üzenet 5. (+ jó lenne egy egyedi azonosító oszlop – ID)
Készítsünk egy egyszerű vendégkönyvet 1. Találjuk ki, hogy milyen adatokat szeretnénk benne tárolni 2. Hozzuk létre a szükséges táblát az adatbázisban
Készítsünk egy egyszerű vendégkönyvet 1. Találjuk ki, hogy milyen adatokat szeretnénk benne tárolni 2. Hozzuk létre a szükséges táblát az adatbázisban 3. Készítsük el az űrlapot (ez még csak HTML)
1. Űrlapelemek „name” attribútuma fontos,
használjunk jó elnevezéseket!
Készítsünk egy egyszerű vendégkönyvet 1. Találjuk ki, hogy milyen adatokat szeretnénk benne tárolni 2. Hozzuk létre a szükséges táblát az adatbázisban 3. Készítsük el az űrlapot (ez még csak HTML) 4. Készítsük el az elküldést feldolgozó kódot (PHP)
1.
Kapcsolat létrehozása az adatbázissal 1. Ehhez van két segédfájl 1. Nézzük át őket – PDO kapcsolatkezelő 2. Ez egy absztrakció – több DBMS-hez jó 3. http://php.net/manual/en/book.pdo.php 4. sqlconn.php és sql_config.php
2. Használatukhoz e két fájl függvényeit kell
hívogatni
Kapcsolat létrehozása az adatbázissal
1.
Ehhez van két segédfájl Használatukhoz e két fájl függvényeit kell hívogatni
1. 2. 1. 2.
require_once('sqlconn.php'); $sc = new SqlConn();
3. 4.
// példányosítjuk az SqlConn osztályt Ekkor már van kapcsolatunk Készítsünk egy lekérdezést:
// külső fájl betöltés
$sql = ”INSERT INTO guestbook (user,email,date,message) VALUES (?,?,NOW(),?)”; 1. NOW() az aktuális dátumot, időt állítja be 2. A kérdőjelek helyőrzők, értéküket később adhatjuk meg
5.
A kérdőjelek helyett PHP változó is állhat, de ez biztonságosabb, bizonyos fokig véd az Sql Injection támadások ellen Adjuk meg, hogy ezt a lekérdezést használnánk, és a behelyettesítenő változókat
Kapcsolat létrehozása az adatbázissal 1. Ehhez van két segédfájl 2. Használatukhoz e két fájl függvényeit kell
hívogatni 3. Valamit kihagytunk! 1. A változók értékeit honnan kapjuk? 2. Az űrlapküldés eredménye, dolgozzuk fel őket 1.
Űrlapok által küldött adatok a PHP $_POST illetve $_REQUEST szuperglobális változóiban
require_once('sqlconn.php'); $sc = new SqlConn(); /*$_POST egy globális változó, mely tartalmazza az összes elküldött adatot az űrlapról (a küldés gombot létezését is). Asszociatív tömbként érhetőek el az űrlapelemek értékei, indexként az űrlapmező nevét megadva (name attribútum). isset() – létezés vizsgálata*/ if (isset($_POST[’gbsubmit’])) { $myUser = $_POST["user"]; $myEmail = $_POST["email"]; $myMsg = $_POST["msg"];
//KÖVETKEZŐ SLIDE-on VAN AMI IDE JÖN MÉG! }
// ha el lett küldve
/* leellenőrizzük, hogy minden szükséges űrlapmező ki lett-e töltve, ha nem jelezzük (else). Pl. $nev<>”” = a nev változó nem üres (tehát valami meg lett-e adva az űrlapmezőben) ellenőrizzük, hogy az email címnek megadott szöveg email cím formátumú-e ([email protected]). Ezt az úgynevezett reguláris kifejezéssel tesszük */ if (isset($_POST["gbsubmit"]) && $myUser<>"" && $myMsg<>""){ if($_POST["email"]<>"" && $myEmail == (!eregi("^[_\.0-9a-z-]+ @([0-9a-z][0-9a-z-]+\.)+[a-z]{2,6}$", $myEmail))){ print "Hibás e-mail cím formátum!"; } else { $sql = "INSERT INTO guestbook (user,email,date,message) VALUES (?,?,NOW(),?)"; $stmt = $sc->PDOprepare($sql); //ha sikertelen a lekérdezés (FELKIÁLTÓJEL tagadást jelent) if(!$stmt->executeBind(array($myUser, $myEmail, $myMsg))){ print "HIBA!"; } //ha pedig sikeres akkor ezt: else print "SIKER!"; } } /*ha nincs kitöltve minden szükséges, de el lett küldve az űrlap. Ha ez nincs itt, akkor még űrlapküldés előtt is kiírja */ else if(isset($_POST["gbsubmit"])) { print "Nincs minden mező kitöltve!"; }
Feltölteni már lehet, de szeretnénk megjeleníteni is az eredményeket Ehhez fontosabb funkciók:
$sql = ” SELECT * FROM guestbook ORDER BY date desc ”; $stmt = $sc->PDOprepare($sql); $res = $stmt->execute(); while ($row = $stmt->fetchAssoc($res)) { echo $row[”user”]; printf(” Email: %s Dátum: %s Üzenet: %s ”, $row[”email”], $row[”date”], $row[”message”]); }