Kihagyás

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
  • fclose($file_pointer): a megnyitott fájl lezárása
  • feof($file_pointer): TRUE-t ad vissza, ha elértük a fájl végét
  • fgetc($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ása
  • fwrite($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
<?php
  // a be.txt tartalmának beolvasása soronként és a tartalom kiíratása a képernyőre

  $file = fopen("be.txt", "r");                       // fájl megnyitása olvasásra
  if ($file === FALSE)                                // hibakezelés
    die("HIBA: A fájl megnyitása nem sikerült!");

  $i = 1;
  while (($line = fgets($file)) !== FALSE) {
    // mindaddig, amíg van még sor a fájlban, addig beolvasunk egy újabb sort
    // a $line itt egy segédváltozó, amely az aktuális sor tartalmát tárolja
    echo "A(z) $i. sor tartalma: $line <br/>";
    $i++;
  }

  fclose($file);                                      // a megnyitott fájl lezárása

  // a be.txt tartalmának beolvasása egyetlen szövegként

  $file = fopen("be.txt", "r");
  $content_text = fread($file, filesize("be.txt"));
  fclose($file);

  // szöveges adat kiírása a ki.txt fájlba

  $file = fopen("ki.txt", "w");                       // fájl megnyitása írásra
  fwrite($file, "Szeretem a kiscicákat!\n");
  fclose($file);
?>

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 stringbe
  • file($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
  • 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
<?php
  $content_text = file_get_contents("be.txt");              // a teljes fájl tartalmának beolvasása egy stringbe
  $content_array = file("be.txt", FILE_IGNORE_NEW_LINES);   // a teljes fájl tartalmának beolvasása egy tömbbe

  file_put_contents("ki.txt", "Valami szöveges tartalom\n");    // egyszerű szöveges adat kiíratása
  file_put_contents("ki.txt", ["Első sor\n", "Második sor\n"]); // stringeket tároló tömb elemeinek kiíratása
?>

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:

  1. A kulcsok csak stringek lehetnek.
  2. 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
{
  "owner": "Márk",
  "cats": [
    {
      "name": "Cirmó",
      "age": 3,
      "favorits": {
        "food": null,
        "toy": "madzagos egér"
      }
    },
    {
      "name": "Barack",
      "age": 1,
      "favorites": {
        "food": "aszpikos whiskas",
        "toy": "hajgumi" 
      } 
    }
  ]
}

A JSON alapvetően 3 elemből épül fel.

  1. Az értékeket közvetlenül a kulcs után írjuk ("nev": "Cirmó")
  2. A tömböket szokásosan [] tudjuk megadni
  3. 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
<?php
  $cats = [
    "owner" => "Márk",
    "cats" => [
      [
        "name" => "Cirmó",
        "age" => 3,
        "favorites" => [
          "food" => null,
          "toy" => "madzagos egér"
        ],
      ],
      [
        "name" => "Barack",
        "age" => 1,
        "favorites" => [
          "food" => "aszpikos whiskas",
          "toy" => "hajgumi"
        ]
      ]
    ]
  ];

  $json_data = json_encode($cats, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);

  file_put_contents("cats.json", $json_data);
?>

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:

  1. 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.
  2. 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
<?php
  $content = file_get_contents("cats.json");
  $cats = json_decode($content, true);

  print_r($cats);
?>

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";}


Utolsó frissítés: 2024-02-10 17:56:22