DBM file-ok használata php-ben


A relációs adatbázisok használata mára általánossá vált a programfejlesztés során, annak ellenére, hogy a szekvenciális file-októl kezdve az egyéb módszerekig rengeteg fajta adattárolási lehetőséget alkalmazhatunk.
Mégis, az SQL nyelv által nyújtott lehetőségek miatt ma nagyrészt a relációs adatbázisok az elterjedtek.Adatbázis, tábla, kulcs, normálforma, lekérdezés fogalma mind ehhez kapcsolódik. Naná hogy itt is léteznek azonban alternatívák, amik gyakran kevésbé ismertek, egyszerűen azért, mert keveset hallunk róluk.

Adatbázist nyilván akkor érdemes használnunk, ha azt szeretnénk, adataink védve legyenek mind olvasás, mind írás szempontjából, anélkül, hogy nekünk ezzel részletesen foglalkoznunk kéne (gondoljuk meg, milyen egyszerűen érhetünk el php-ben egy adatbázis-szervert).
Ezenfelül elvárás, hogy az adatok elérése (kiolvasása) és módosítása is egyszerű legyen. Ha php-t használunk, 90% az esélye, hogy sql-el dolgozunk, főleg mysql alatt. Ez persze nem baj, de ne fejeltsük el, léteznek alternatív módszerek, és nem muszáj megkötni a saját kezünket, amennyiben egyedileg szeretnénk megoldani az adattárolást.

Ha saját oldalunk van, ma már a felhasználók elvárják, hogy az személyre szabott és mindig aktuális legyen. Amennyiben oldalunkon lehetőséget adunk felhasználóinknak, hogy saját beállításokat alkalmazzanak, el kell azon gondolkodnunk, hogyan is tároljuk az adatainkat. Sütik, munkamenetek itt nem igazán kerülhetnek szóba, hiszen nem csak ideiglenes beállításokról van szó. Egy “szokásos” adatbázis nem elég hatékony, és kicsit túlméretezett a feladathoz. Megpróbálhatunk “sima” szövegfileokat alkalmazni, azonban a kezelésük bonyolult, és csak szekvenciális elérést nyújtanak.

Ha elegánsan szeretnénk megoldani, használjunk adatbázis-szerű file-okat. Sok programozási nyelvben megtalálhatóak az ehhez szükséges kezelők, a php-ben is elérhetjük a dbm stílusu file-ok kezeléséhez szükséges függvényeket. A dbm függvények lényegében lehetővé teszik, hogy egy változó-érték párost file-ban tároljunk, majd onnan kiolvasva ugyanígy visszakapjunk. Egy egyszerű példa (márha php verziónkban elérhető):

1
2
3
4
5
6
7
8
<?php
// File megnyitása írásra (n="új (new)")
$dbm = dbmopen('data.dbm','n');
// Adat beszúrása
dbminsert($dbm,"valtozo","ertek");
// File bezárása
dbmclose($dbm);
?>

Az egész hasonló egy sima file megnyitásához, azonban nagy különbség, hogy maga a kezelés a relációs adatbázisokhoz hasonlóan egyszerű. Itt ugyan nincsenek táblák, és lekérdezések, azonban nagyon gyakran ezekre nincs is szükségünk.
Ha megnézzük a létrehozott data.dbm-et, láthatjuk, hogy a felépítése nagyon egyszerű:

szám-újsor-változónév-szám-újsor-változóérték

Ahol a szám az azt követő adat hosszát jelenti.
Ez az eredeti Berkeley-féle adatbázis rendszer php-beli megvalósítása, info itt:
www.sleepycat.com

Az adatok elérése szintén nagyon egyszerű:

1
2
3
4
5
6
7
8
9
10
<?php
// File megnyitása olvasásra (r="olvasás (read)")
$dbm = dbmopen("data.dbm","r");
// $data változó megkapja az $valtozo kulcshoz(!) tartozó adatot
$data = dbmfetch($dbm,"valtozo");
// kiírás (eredmény: "ertek")
print $data;
// File bezárása
dbmclose($dbm);
?>

Míg egy relációs adatbázisban nem célszerű ilyen egyszerű adatokat tárolni (változó-érték), dbm-stílusu rendszereket mi magunk is írhatunk. a phpinfo() fv-el ellenőrizhejük emellett, milyen gyárilag támogatott kezelőket használhatunk, ezek leggyakrabban dbm, ill. dba lesznek. Mivel tömböket nem tudunk tárolni, érdemes egyéni módszert választani ennek a megoldására (pl. sztringgé át- és visszaalakítás).

És hogy mire is használhatjuk? Pl. egyéni beállítások tárolására (ahol legtöbbször változónév-érték párok fordulnak elő), akár form-ok adatainak, statisztikákhoz, cache-eléshez, tulajdonképpen bármire, ami csak eszünkbe jut. Arra is létezik szép megoldás, ha nem tudjuk, hány kulcs-érték párunk van egy dbm fileban. Mivel nincsenek lekérdezéseink, ezért így tudjuk ezt megoldani:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
// File megnyitása olvasásra (r="olvasás (read)")
$dbm = dbmopen("filenevem.dat","r");
$return_array = array()
$key = dbmfirstkey($dbm);
$return_array[$key]=dbmfetch($dbm,$key);
while ($key) {
	$key = dbmnextkey($dbm,$key);
	$return_array[$key]=dbmfetch($dbm,$key)
}
dbmclose($dbm);
//$return_array tartalmazza a kulcs-érték párokat
print_r($return_array);
?>

A “dbmfirstkey(file-leíró)” függvény a dbm file első kulcsát adja vissza. A függvény addig tér vissza valamilyen értékkel, amíg még van kulcs a file-ban, ellenkező esetben false-hoz jutunk, így egy ciklussal könnyen feldolgozhatunk egy egész file-t. Ha gyakran használunk hasonló file-okat érdemes osztályt létrehozni a kezeléshez, pl. a következő funkciókkal: tömbök tárolása, titkosítás használata (visszafejthető is), több adatbázis-rendszer kezelése (absztrakt módon), stb..

Információk:

http://hu2.php.net/manual/hu/ref.dba.php
http://hu2.php.net/manual/hu/ref.dbm.php

http://hu2.php.net/manual/hu/ref.dbplus.php

BL

Kapcsolódó bejegyzések:
  • A PHP nyelvről szóló sorozatunknak ebben a részében a tömböket fogom bemutatni. A PHP tömb vagy eredeti nevén array egy úgynevezett összetett változó típus. Az ö …

  • Ez a leírás igyekszik bemutatni a PHP és a MySQL viszonyát a kapcsolódástól egészen az első lekérdezésig. A leírás készítésekor úgy veszem, hogy van egy webszer …

  • Személy szerint már sokszor jártam úgy, hogy egy eredményt, ami várhatóan egy tömb volt be kellett járja. Ilyen esetekben általában meg szoktuk vizsgálni, hogy a …

  • A HTTP specifikáció szerint a kliens feltölthet tetszőleges fileokat a szerverre, viszont ezt egy szerver-oldali programmal – jelen esetben egy PHP szkript – fel …

  • Weblap tervezésénél az egyik legfontosabb dolog az átláthatóság. Ennek egyik alapeleme az, hogy a különböző dolgokat ABC sorrendben írjuk ki… Én ma belefutott …

A cikket beküldte: BL (http://webinform.hu)

Szólj hozzá
a DBM file-ok használata php-ben c. bejegyzéshez

- Engedélyezett HTML elemek: <a> <em> <strong> <ul> <ol> <li>
- Forráskód beküldéséhez tedd a kódot ezek közé: <pre lang="php" line="1">Kódrészlet helye itt</pre>