2020. március 31., kedd

MySQL adatbázis alapok

Mező, rekord és adattábla fogalma
Az alábbi táblázat egy adattábla, melynek 4 mezője van, és fel van töltve 3 rekorddal.
A mezők neve a fejléc sorban látható. Egy mező egy oszlopnak, egy rekord a táblázat egy sorának felel meg:

    1.mező    2.mező    3.mező    4.mező
fejléc    Név    Telefon    Életkor    Szül. idő
1. rekord    Kiss Miska    125-3654    56    1985.04.06
2. rekord    Balogh Heni    589-6589    14    1919.10.25
3. rekord    Magyari Miki    256-6589    19    2002.12.31



Adatbázis és az adattáblák kapcsolata
Az adatbázis nem más, mint olyan adattáblák együttese, amelyek egy alkalmazáshoz tar-toznak. Az adattáblákon kívül az adatbázis tartalmazza az indexfájlokat is, illetve egyéb kiegészítő információkat, melyek a felhasználó számára „láthatatlanok”.

adatbázis
                      
    1.tábla        2.tábla        3.tábla  
    1.mező        1.mező        1.mező  
    2.mező        2.mező        2.mező  
    3.mező        3.mező        3.mező  
    4.mező        4.mező        4.mező  
                      
    index        index        index  
                      




Indexek és az egyedi azonosítók fontossága
Minden adattáblában szükség van egy olyan mezőre, aminek a tartalma minden rekord esetében más lesz, tehát egyértelműen azonosítja a rekordokat. Célszerű ezt a mezőt elő-ször létrehozni, és "id"-nak elnevezni.

Például a következő táblában az "id" mező nélkül a 2. és a 4. rekordot nem lehetne meg-különböztetni:

id    nev    eletkor
1    Miki    24
2    Zoli    15
3    Laci    33
4    Zoli    15


Az index-fájl nem más, mint egy adott mező szerint sorbarendezett tábla, mely az eredeti tábla minden rekordját képviseli. Az index-fájlok segítségével egy adott mező szerinti ke-resést sokkal gyorsabban hajt végre a program, mint index-fájl nélkül. Az index-fájl két mezőt tartalmaz: egyrészt a kiválasztott mezőt, ami szerint sorba van rendezve, másrészt egy azonosító mezőt, amely megadja, hogy az adott rekord az eredeti táblában fizikailag hányadik helyen található (ez utóbbi nem mindig egyezik az id mező értékével!!!).

Példaként vegyünk egy táblát, majd a hozzá tartozó, a "nev" mező szerinti index-táblát:


id    nev    eletkor        #    nev
1    Zolika    6        3    Andráska
3    Petike    8        2    Petike
5    Andráska    12        4    Sanyika
7    Sanyika    7        1    Zolika



A MySQL Control Center telepítése, indítása
Az adatbázisok kezelésére mi a MySQL rendszert választottuk, melyet egy grafikus felületen keresztül fogunk kezelni. Ez a grafikus felület a MySQL Control Center, melynek telepítő programját a következő helyről indíthatjuk el:
X:\4. Adatbazis alapok, MySQL\MySQL CC setup\Setup.exe
A telepítési folyamat egyszerű: a telepítő indítása után kattintsunk a "Next" gombra, válasszuk ki az "I accept the license agreement" rádiógombot és kattintsunk a "Next" gombra, majd még négyszer ugyancsak a "Next" gombra kell kattintanunk, és végül a "Finish"-re.
A MySQL Control Center-t a Start-menüből indíthatjuk: "Start" - "Programs" - "MySQL Control Center" - "MySQL Control Center".

Adatbázis-szerver létrehozása és megnyitása
Ha a "MySQL servers" ablakban még nem látunk egy szervert sem, létre kell hoznunk egyet. Nyomjuk le a Ctrl+N billentyűket, a "Name" mezőbe írjuk be a szerver nevét (pl. "proba"), a "Host Name" mezőbe pedig azt, hogy "localhost". Az "User Name" mezőt nem kötelező kitöltenünk, de mégis inkább írjuk be, hogy "root". Végül jobb oldalt alul kattintsunk az "Add" gombra.
Az újonnan létrehozott szerverünkre duplán kattintva megnyithatjuk azt.

Adatbázis és adattábla létrehozása, indexelés
Az adatbázis-szerver megnyitása után kattintsunk duplán a "Databases" mappára, mire láthatóvá válnak a már létrehozott adatbázisok.
A "Databases" mappára a jobb egérgombbal kattintva az előugró menüből válasszuk a "New Database" opciót, adjuk meg a létrehozandó adatbázisunk nevét, és kattintsunk az "OK" gombra.
Az újonnan létrehozott adatbázison duplán kattintva megnyithatjuk azt. Ekkor megjelenik a "Tables" sor, melyen jobb egérgombbal kattintva, és a "New Table" opciót választva elkészíthetjük első adattáblánkat.
Az első oldalon (Field Properties) kell megadnunk az adattábla szerkezetét. Először mindig a mezők neveit adjuk meg, majd az adattípusukat és a hosszukat. Az első mező mindig az "id" legyen! Típusa "bigint", hossza 20 legyen. Alul jelöljük be az "AUTO_INCREMENT" négyzetet, és felül kattintsunk a kis kulcs ikonra. Ezzel az "id" mező automatikusan növekvő számokat fog tartalmazni, és ő lesz az elsődleges kulcsunk (egyedi azonosító).

A többi mezőnél az alábbi adattípusok közül válasszunk:
int: nem túl nagy egész szám
bigint: nagy egész szám
double: tizedes szám
varchar: vegyes szöveges (betűk, számok és írásjelek)
date: dátum
text: nagyon hosszú szöveg
datetime: dátum és időpont egymás után
A következő oldalon (Indexes) a táblához tartozó indexeket tudjuk elkészíteni. A zöld plusz (+) jelre kattintva készíthetünk új indexet, amibe a bal oldalról tudunk mezőket felvenni. Mezőnként is készíthetünk indexeket, de egy index több mezőt is tartalmazhat. A fontosabb mezők szerint érdemes indexelni, de ezen még menet közben is változtathatunk.
A harmadik oldalon (Table Properties) a "Table Name" mezőbe írjuk be adattáblánk nevét, majd felül a mentés ikonra kattintva, vagy a Ctrl+S billentyűket lenyomva tudjuk elmenteni a kész táblát. A sikeres menésről alul kapunk egy értesítést (Table created successfully), ezután bezárhatjuk az ablakot.


Rekordok felvétele, módosítása és törlése
Az újonnan létrehozott adattábla nevére duplán kattintva megnyithatjuk azt. Kezdetben még üres, hiszen nincsenek rekordok felvéve.
A Ctrl+I billentyűket lenyomva, vagy az új rekord felvétele ikonra kattintva vehetünk fel új rekordot. Az "id" mezőt nem kell kitöltenünk, hiszen az automatikusan számozódik. A többi mezőbe az adattípusnak megfelelő adatokat írhatunk. A mezők között a TAB billentyű lenyomásával, vagy a megfelelő mezőre való egérkattintással válthatunk. Az utolsó érték beírása után célszerű lenyomni az ENTER billentyűt.
Rekordok módosításához a módosítani kívánt mezőn kattintsunk duplán, és írjuk felül a régi értéket az újjal.
Rekord törléséhez kattintsunk jobb egérgombbal bármelyik mezőjén, és válasszuk a "Delete Record" opciót. A törlést erősítsük meg a "Yes" gombra kattintva.

Röviden az SQL nyelvről
Az SQL egy rövidítés, jelentése "Structured Query Language", vagyis struktúrált lekérdező nyelv. Ma már szabványnak tekinthető, mégis van egy kis eltérés az egyes változatok között. Az alapvető parancsok és szintaktikájuk azonban minden esetben megegyeznek.
Az SQL parancsokat mi először a MySQL CC-ben fogjuk gyakorolni, majd megnézzük, hogy PHP kódból hogyan tudjuk őket futtatni. A négy alapvető parancs a leválogatás, a felvétel, a módosítás és a törlés.

SQL parancs: leválogatás (szelektív lekérdezés)
A legegyszerűbb parancs, melynek legegyszerűbb formája a következő:
SELECT * FROM tablanev
A parancs futtatása után elénk tárul az úgynevezett eredménytábla, melyben az általunk megjeleníteni kívánt rekordokat látjuk.
A SELECT kulcsszóval adjuk az adatbáziskezelő tudtára, hogy egy lekérdezést szeretnénk lefuttatni.
A * (csillag) azt jelenti, hogy az eredménytáblában a rekordoknak az összes mezőjét látni szeretnénk. Ha csak bizonyos mezőkre vagyunk kíváncsiak, akkor a * helyett a mezők neveit kell felsorolnunk, egymástól vesszővel elválasztva. Ha például egy "emberek" nevű táblából szeretnénk az emberek nevét, életkorát és lakcímét megjeleníteni, az alábbi parancsot kell kiadnunk:
SELECT nev,eletkor,lakcim FROM emberek
A mezők nevei (vagy a csillag) után következik a FROM kulcsszó, majd ezt követi a tábla neve, amiből a rekordokat le szeretnénk kérdezni.
A lekérdezés eredménytábláját különböző feltételek megadásával szűkíthetjük. A feltételeket a WHERE kulcsszó után kell megadnunk. Például listázzuk ki azon rekordok összes mezőjét, ahol az életkor értéke kisebb mint 20:
SELECT * FROM emberek WHERE eletkor<20
Ha több feltételt szeretnénk megadni, azokat logikai műveletekkel kapcsolhatjuk össze. Felhasználható logikai művelet az AND (és), az OR (vagy) és a NOT (nem). Válogassuk ki például azokat a férfiakat, akik 20 évnél idősebbek, vagy életkoruk nem több mint 10:
SELECT * FROM emberek
WHERE neme='ferfi' AND (eletkor>20 OR NOT eletkor>10)
Hogy egyértelmű legyen a logikai műveletek sorrendje, a feltételek megadásánál használjunk zárójeleket!
Megadhatjuk azt is, hogy a feltételnek megfelelő rekordokat milyen sorrendben szeretnénk az eredménytáblában látni. Ehhez a parancs végén az ORDER BY záradékot kell használnunk, mely után fel kell sorolnunk azokat a mezőket, amelyek szerint a sorbarendezést végre szeretnénk hajtani. Több mező megadása esetén a mezőneveket vesszővel választjuk el egymástól. Először rendezzük az embereket név szerint növekvő sorrendbe:
SELECT * FROM emberek ORDER BY nev
Majd rendezzük őket név szerint növekvő, azon belül életkor szerint növekvő sorrendbe (ez azt jelenti, hogy ha kettő vagy több embernek ugyanaz a neve, őket életkor szerint fogjuk egymás után rendezni):
SELECT * FROM emberek ORDER BY nev,eletkor

Ha egy mező szerint nem növekvő, hanem csökkenő sorrendben szeretnénk rendezni, a mező neve után illesszük oda a DESC kulcsszót is. Például rendezzünk név szerint csökkenő, azon belül életkor szerint növekvő sorrendbe:
SELECT * FROM emberek ORDER BY nev DESC,eletkor
Az eddig megismert kulcsszavakat és záradékokat együtt is alkalmazhatjuk, ezáltal jó bonyolult lekérdezéseket hozhatunk létre:
SELECT nev,eletkor FROM emberek
WHERE neme='ferfi' AND (eletkor>20 OR NOT eletkor>10)
ORDER BY nev DESC,lakhely,eletkor DESC
A fenti parancsot így foglalhatnánk szavakba:
"Válogassuk ki azokat a férfiakat, akik 20 évnél idősebbek, vagy életkoruk nem több mint 10. A feltételnek megfelelő embereket rendezzük név szerint csökkenő sorrendbe. Ha vannak azonos nevű emberek, akkor rendezzük őket lakóhely szerint növekvő sorrendbe. Előfordulhat, hogy több embernek ugyanaz a neve, és a lakóhelyük is megegyezik. Ezeket az embereket rendezzük életkor szerint csökkenő sorrendbe. Az embereknek csak a nevére és az életkorára vagyunk kíváncsiak, tehát az eredménytáblában csak ezeket a mezőket szeretnénk látni."
Ugye nem is olyan nehéz? :)


SQL parancsok végrehajtása PHP-ből


Kapcsolódás a MySQL szerverhez és az adatbázis kiválasztása
Ahhoz, hogy PHP-ből SQL parancsokat tudjunk futtatni, először kapcsolódnunk kell a MySQL szerverhez:
$kapcsolat = mysql_connect("localhost","userid","jelszo");
A fenti sorban létrehoztuk a kapcsolatot, melyet a $kapcsolat változóban tárolunk el. Három paramétert adhatunk meg: a szerver nevét, a felhasználónevet és a hozzá tartozó jelszót. Ha a MySQL szerveren létezik a @% nevű felhasználó, akkor ezzel is beléphetünk, ekkor nem kell felhasználónevet és jelszót beírnunk. Ha a felhasználónak nincs jelszava (pl. a root nevű felhasználó), akkor a jelszó paraméter elhagyható.
Miután létrehoztuk a kapcsolatot (amit bárhogyan elnevezhetünk, de mi az egyszerűség kedvéért $kapcsolat-nak fogjuk hívni), ki kell választanunk az adatbázist, amiben dolgozni szeretnénk:
mysql_select_db("adatbazis", $kapcsolat);
A fenti sorban megadtuk, hogy az adatbazis nevű adatbázist szeretnénk használni, mégpedig a $kapcsolat nevű kapcsolaton keresztül.

Az adatbázis-kapcsolat lezárása
Ha már nincs szükségünk az adatbázis-kapcsolatra, le kell zárnunk azt (általában a PHP kód végén, az utolsó sorban):
mysql_close($kapcsolat);

Fájl beillesztése a PHP kódba
Az előzőekneb tárgyalt 2 sort egy külön fájlban is eltárolhatjuk. A fájl neve legyen például dbconn.php (az angol database connect rövidítéséből ered), és tartalma legyen a következő:
<?
$kapcsolat = mysql_connect("localhost","userid","jelszo");
mysql_select_db("adatbazis", $kapcsolat);
?>
Ez akkor lesz hasznos, ha több PHP fájlban is ugyanazt az adatbázis- kapcsolatot szeretnénk használni. Ekkor nem kell minden fájl elejére beírnunk a fenti kódot, elég az úgynevezett include-fájlt beillesztenünk a következő paranccsal:
<? include("dbconn.php") ?>
A fenti parancssor helyére a PHP értelmező program beilleszti a dbconn.php fájl tartalmát, és utána értelmezi a kódot.


SQL parancsok futtatása PHP-ből
Miután elkészült az adatbázis-kapcsolat, és kiválasztottuk a megfelelő adatbázist, a létrehozott kapcsolaton SQL parancsokat futtathatunk.
Először egy szöveges változóban eltároljuk a parancsot:
$parancs = "SELECT * FROM tablanev";
Majd a parancsot lefuttatjuk a megadott kapcsolaton:
mysql_query($parancs);

Eredménytábla eltárolása és vizsgálata
A fenti példában egy lekérdezést futtattunk le, viszont a lekérdezés eredményét nem jelenítettük meg. Ahhoz, hogy a lekérdezés eredményét - az úgynevezett eredménytáblát - fel tudjuk dolgozni, először el kell tárolnunk egy tömbben, a következő módon:
$eredmeny = mysql_query($parancs);
Az eredménytáblát ekkor az $eredmeny nevű tömbben tároljuk el.
Ha arra vagyunk kíváncsiak, hogy az eredménytáblának hány sora van, használjuk a következő függvényt:
mysql_num_rows($eredmeny)
Ha a fenti függvény visszatérési értéke 0 (nulla), akkor az eredménytábla üres, tehát nem találtunk a keresési feltételeknek megfelelő rekordot. Ha tehát a visszatérési érték nagyobb mint nulla, akkor feldolgozhatjuk az eredménytáblát, ellenkező esetben kiírhatunk egy figyelmeztető üzenetet:
if (mysql_num_rows($eredmeny)>0) {
  ... feldolgozó parancsok ...
}
else {
  print "Az eredménytábla üres!!!";
}

Az eredménytábla feldolgozása sorról sorra
Miután meggyőződtünk róla, hogy az eredménytábla nem üres, sorról sorra feldolgozhatjuk azt. Ehhez egy ciklust fogunk használni, aminek minden fordulójában egy $sor nevű tömbbe olvassuk ki az aktuális rekord mezőinek nevét és értékét:
while ($sor = mysql_fetch_array($eredmeny)) {
  ... az aktuális rekord feldolgozása ...
}

Ha már birtokunkban van egy adott rekord, akkor egyszerűen kiolvashatjuk bármelyik mezőjének értékét, amivel azt csinálunk, amit csak akarunk (például kiíratjuk):
while ($sor = mysql_fetch_array($eredmeny)) {
  print $sor["mező1"] . "<br>";
  print $sor["mező2"] . "<br>";
  print $sor["mező3"] . "<br>";
  print $sor["mező4"] . "<br><br>";
}
A fenti kódrészlettel végiglépkedünk az eredménytábla sorain, és minden rekordnál kiírjuk az összes mező tartalmát (amennyiben 4 mezője van, amiket mező1...mező4-nek hívnak). A mezők értékeit mindig új sorba írjuk, a rekordok között egy üres sort hagyunk.

SQL parancs: új rekord felvétele
Új rekordot a következő paranccsal tudunk felvenni egy adattáblába:
INSERT INTO táblanév (mező1,mező2) VALUES (érték1,érték2)
A parancs formája tehát a következő: az INSERT INTO parancsot követi a táblanév, majd zárójelben azoknak a mezőknek a nevei, amiket ki szeretnénk tölteni. Ezután a VALUES parancs következik, ami után zárójelben, a megadott mezőnevek sorrendjében fel kell tüntetnünk a mezőkbe írandó értékeket. Ha egy érték típusa szöveges vagy dátum típusú, az értéket aposztrófok közé ('....') kell tennünk!
Vegyünk fel például egy új rekordot az emberek táblába, töltsük ki a nev és eletkor mezőket a következő adatokkal: Kiss János, 23:
INSERT INTO emberek (nev,eletkor) VALUES ('Kiss János',23)
A fenti SQL parancsot PHP-ből is kiadhatjuk (feltételezve, hogy előzőleg már létrehoztuk a kapcsolatot és kiválasztottuk az adatbázist):
$parancs = "INSERT INTO emberek (nev,eletkor) VALUES ('Kiss János',23)";
mysql_query($parancs);

SQL parancs: megadott rekord(ok) törlése
Egy bizonyos feltételnek megfelelő rekordot (rekordokat) a következő paranccsal törölhetünk az adattáblából
DELETE FROM táblanév WHERE feltétel
FONTOS!!! Ha nem adunk meg feltételt, az összes rekordot törölni fogjuk a táblából! A MySQL Command Center rá fog ugyan kérdezni, hogy biztosan törölni akarunk-e minden rekordot, viszont ha PHP-ből adjuk ki a parancsot, akkor az összes rekordunk menthetetlenül elvész!!!

A WHERE kulcsszó után hasonló feltételeket írhatunk, mint a SELECT parancs esetében! (Lásd a 4. leckét)
Ha például az emberek táblából törölni szeretnénk mindenkit, aki 20 évnél fiatalabb, akkor a következő parancsot kell futtatnunk:
DELETE FROM emberek WHERE eletkor<20
A fenti SQL parancsot PHP-ből is kiadhatjuk (feltételezve, hogy előzőleg már létrehoztuk a kapcsolatot és kiválasztottuk az adatbázist):
$parancs = "DELETE FROM emberek WHERE eletkor<20";
mysql_query($parancs);

SQL parancs: megadott rekord(ok) adatainak módosítása
Egy bizonyos feltételnek megfelelő rekord(ok) bizonyos mezőinek értékét az alábbi paranccsal írhatjuk felül új értékekkel.
UPDATE táblanév SET mező1=érték, mező2=érték WHERE feltétel
Ha az új érték szöveges vagy dátum típusú, az értéket itt is aposztrófok közé ('....') kell tennünk!
Ha több mező értékét is módosítani szeretnénk, akkor a mezőnév/érték párosokat vesszővel választjuk el egymástól. A parancs formátuma abban különbözik az új rekord felvételétől, hogy míg felvételnél előbb felsoroltuk a mezőket, majd utána az értékeket, addig módosításnál a mezőneveket és értékeket párosával kell megadnunk!
FONTOS!!! Ha nem adunk meg feltételt, az összes rekordot módosítani fogjuk a táblában! A MySQL Command Center rá fog ugyan kérdezni, hogy biztosan módosítani akarunk-e minden rekordot, viszont ha PHP-ből adjuk ki a parancsot, akkor az összes rekordunk visszavonhatatlanul átesik a módosításon!!!
Ha például az emberek táblában minden 90 év feletti ember megjegyzes mezőjét át szeretnénk írni arra, hogy "aggastyán", akkor a következő parancsot kell kiadnunk:
UPDATE emberek SET megjegyzes='aggastyán' WHERE eletkor>90
A fenti SQL parancsot PHP-ből is kiadhatjuk (feltételezve, hogy előzőleg már létrehoztuk a kapcsolatot és kiválasztottuk az adatbázist):
$parancs = "UPDATE emberek SET megjegyzes='aggastyán' WHERE eletkor>90";
mysql_query($parancs);

A böngésző átirányítása PHP paranccsal
Előfordulhat, hogy egy PHP kód futtatása közben a felhasználó böngészőjét egy új címre szeretnénk irányítani. Ezt a következő paranccsal tehetjük meg:
header("Location: http://www.ujoldal.hu");
Ha például a jelenleg futó PHP fájllal azonos könyvtárban lévő ujoldal.php fájlt szeretnénk megnyitni, a következő parancsot kell kiadnunk:
header("Location: ujoldal.php");
FONTOS!!! Igaz, hogy a fenti kóddal böngészőt átirányítottuk, de a jelenleg futó PHP kód értelmezése folytatódik egészen az utolsó sorig! Ha a böngészőben egy másik PHP oldalt nyitunk meg, annak az értelmezése egy új szálon indul el, és nem befolyásolja a jelenleg futó PHP kód értelmezését! Ha tehát egy ilyen átirányítás után zárjuk le az adatbázis-kapcsolatot, a parancs ugyanúgy le fog futni.

A PHP kód eredmény HTML oldalának bufferelése
Ha a böngészőt egy PHP kódon belül a fenti paranccsal átirányítjuk, a PHP kód legelejére a következő kódot kell írnunk:
<? ob_start() ?>
FONTOS!!! A fenti kód előtt még egy szóközt sem szabad írnunk, tehát abszolút a kód elejére kell beillesztenünk!
A fenti parancs kiadása után az eredményoldal nem futásidőben kerül át a böngészőhöz, így ha a böngészőt menet közben egy új oldalra irányítjuk, nem kapunk hibaüzenetet.
Az eredményoldalt csak a következő parancs kiadása után küldjk el a böngészőnek:
<? ob_end_flush() ?>
A fenti parancs jelentése a következő: zárjuk le az eredményoldal bufferelését, és az eddig felgyülemlett HTML kódot küldjük ez a felhasználó böngészőjének.
Ezt a parancsot mindeig a PHP kód legvégére írjuk, az esetleges adatbázis-kapcsolat lezárás után!


Nincsenek megjegyzések:

Megjegyzés küldése