8.1. fejezet¶
A fejezet anyaga¶
Fájlkezelés PHP-ban¶
Az előző fejezetben láttunk példát egy regisztrációs űrlapra és annak PHP-ban történő feldolgozására. Természetesen a gyakorlatban szeretnénk azt is elérni, hogy ha egy felhasználó regisztrál a weboldalunkon, akkor eltároljuk az adatait.
A gyakorlati életben az adatok tárolását jellemzően egy adatbázis segítségével oldják meg, viszont mivel az adatbázisok ismerete nem feltétele ennek a kurzusnak, ezért mi egy másik megoldást fogunk használni: egyszerű szöveges fájlokban fogjuk eltárolni az adatokat.
Fájlkezelési módszerek¶
A PHP többféle lehetőséget biztosít a fájlkezelésre. Egy ismerős megoldás lehet a C-szerű fájlkezelés. Néhány fontosabb fájlkezelő függvény:
fopen($path, $mode)
: megnyitja a$path
elérési útvonalú fájlt$mode
módban- ha a fájl megnyitása sikertelen, akkor
FALSE
értéket ad vissza - a
$mode
helyén megadható megnyitási módok:"r"
: megnyitás csak olvasásra"w"
: megnyitás csak írásra (ha létezik a fájl, akkor felülírja a tartalmát; ha nem létezik, akkor létrehozza azt)"a"
: megnyitás a fájl végéhez való hozzáfűzésre (ha létezik a fájl, akkor megőrzi annak a tartalmát; ha nem létezik, akkor létrehozza azt)"x"
: megnyitás kizárólagos létrehozásra (ha már létezik a fájl, akkor hibát kapunk; ha nem létezik, akkor létrehozza azt)"r+"
,"w+"
,"a+"
,"x+"
: megnyitás olvasásra és írásra
- ha a fájl megnyitása sikertelen, akkor
fclose($file_pointer)
: a megnyitott fájl lezárásafeof($file_pointer)
:TRUE
-t ad vissza, ha elértük a fájl végétfgetc($file_pointer)
: egy karakter beolvasása (FALSE
-ot ad vissza, ha elértük a fájl végét)fgets($file_pointer)
: egy sor beolvasása (FALSE
-ot ad vissza, ha elértük a fájl végét)filesize($path)
: visszaadja a$path
elérési útvonalú fájl méretét (bájtokban)fread($file_pointer, $length)
: legfeljebb$length
darab bájt beolvasásafwrite($file_pointer, $text)
: kiírja a$text
szöveget az adott fájlba.
Példa: C-szerű fájlkezelés PHP-ban
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
Ezeken a függvényeken kívül a PHP további beépített eljárásokat is biztosít a fájlkezelésre:
file_get_contents($path)
: a$path
elérési útvonalú fájl tartalmának beolvasása egy stringbefile($path)
: a$path
elérési útvonalú fájl tartalmának beolvasása egy tömbbe- a
FILE_IGNORE_NEW_LINES
flag-gel figyelmen kívül hagyhatjuk a sorvége jeleket
- a
file_put_contents($path, $data)
: kiírja a$path
elérési útvonalú fájlba a$data
adatot.
Példa: A fenti függvények használata
1 2 3 4 5 6 7 |
|
A fenti módszerek mellett van lehetőségünk PHP-ban objektumorientált fájlkezelésre is, viszont ezt a gyakorlaton nem tárgyaljuk.
Szerializálás, deszerializálás JSON formátumban¶
Sokszor nem csak egyszerű szövegeket, hanem összetettebb adatokat (pl. asszociatív tömböket, objektumokat) is el szeretnénk tárolni egy fájlban.
A szerializáció folyamata során az összetett adatunkat valamilyen standardizált formává alakítjuk át. Ez leggyakrabban lehet bájtok sorozata, JSON, illetve XML formátum, aminek köszönhetően már el tudjuk azt tárolni egy fájlban. Mi a JSON alapú szerializációval fogunk megismerkedni.
JSON¶
A JSON (JavaScript Object Notation) egy adatformátum, amelyet gyakran használnak adatok küldésére és fogadására a webes alkalmazások között. Felépítésében hasonló az asszociatív tömbökhöz, azonban van néhány megkötése:
- A kulcsok csak stringek lehetnek.
- Egyetlen gyökérelem lehet, amely egy objektum.
Példa: Egy egyszerű JSON szerkezet.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
A JSON alapvetően 3 elemből épül fel.
- Az értékeket közvetlenül a kulcs után írjuk ("nev": "Cirmó")
- A tömböket szokásosan [] tudjuk megadni
- Az objektumokat pedig a {} jelzi
PHP-ban a JSON szerializáció a json_encode()
függvénnyel valósítható meg.
Példa: A $cats
asszociatív tömb szerializálása és fájlba írása
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
Ennek kimenete az előbb bemutatott JSON lesz.
A json_encode()
függvény viselkedését lehet szabályozni ún. flag-ek használatával. Ebből a két leggyakrabban használt:
JSON_PRETTY_PRINT
: ez arra szolgál, hogy az adat megfelelően indentálva legyen. Ennek elhagyása azt eredményezni, hogy a teljes adat 1 sorba lesz írva.JSON_UNSECAPED_UNICODE
: ez azért kell, hogy az különböző ékezetes karakterek helyesen jelenlenek meg a fájlban. Ha ezt elhagyjuk, a különböző nem ASCII karaktereket a JSON helyettesíteni fogja a hexadecimális kódolásukkal, ami csökkenti az olvashatóságot.
Miután eltároltuk a szerializált adatainkat egy fájlban, természetesen előbb-utóbb vissza is szeretnénk őket alakítani PHP értékekké. Erre szolgál a deszerializálás folyamata, amit PHP-ban az json_decode()
függvénnyel valósíthatunk meg.
Példa: Beolvassuk a cats.json
fájlt, és visszaalakítjuk azt egy asszociatív tömbbé
1 2 3 4 5 6 |
|
A kód kimenete
Array ( [owner] => Márk [cats] => Array ( [0] => Array ( [name] => Cirmó [age] => 3 [favorites] => Array ( [food] => [toy] => madzagos egér ) ) [1] => Array ( [name] => Barack [age] => 1 [favorites] => Array ( [food] => aszpikos whiskas [toy] => hajgumi ) ) ) )
A json_decode()
függvény első paramétere a deszirializálandó JSON. A második paraméterben a true
érték jelzi, hogy
az eredményt egy asszociatív tömbként szeretnénk eltárolni. Ezen paraméter megadása nem kötelező. Ha nem adjuk meg, akkor
az eredmény asszociatív tömb helyett stdClass
típusú lesz.
Megjegyzés
Amennyiben nem szeretnénk JSON fájlokkal dolgozni, akkor PHP-ben lehetőségünk van a serialize()
, illetve unserialize()
függvények
használatára is, de az így kapott szöveg sokkal kevésbé olvasható.
Példa egy ilyen módszerrel szerializált adatra: a:3:{s:4:"név";s:5:"Cirmi";s:3:"kor";i:3;s:5:"szín";s:7:"szürke";}