<?> PHP NOVA invictum.hr
Izdanje 2026.
Poglavlje 15

Datoteke i formati podataka

Čitamo i zapisujemo datoteke uz provjeru pogrešaka te sigurno razmjenjujemo JSON i CSV podatke.

23 min čitanja Početno razina PHP 8.5 ciljna verzija

Nakon ovog poglavlja

Što ćete znati napraviti

  • Sigurno sastaviti putanju i pročitati manju datoteku.
  • Kodirati i dekodirati JSON uz iznimke.
  • Prepoznati ograničenja CSV-a i zaključavanja zapisa.

Datotečni sustav

Putanja mora ostati pod našom kontrolom

__DIR__ daje apsolutnu mapu trenutačne PHP datoteke i stabilniji je od oslanjanja na radni direktorij. Korisnički unos ne spajamo izravno u putanju jer kombinacije poput ../ mogu izaći iz dopuštene mape.

file_get_contents je praktičan za male datoteke. Za velike datoteke koristite tokove i čitajte dio po dio kako memorija ne bi rasla s veličinom datoteke.

Kontrolirana putanja
<?php

$path = __DIR__ . '/data/settings.json';

if (!is_file($path) || !is_readable($path)) {
    throw new RuntimeException('Postavke nisu dostupne.');
}

$json = file_get_contents($path);

Strojna razmjena

JSON uz eksplicitne pogreške

json_decode može vratiti null i za valjanu JSON null vrijednost i za pogrešku. Opcija JSON_THROW_ON_ERROR pretvara problem u JsonException. Pri kodiranju hrvatskog teksta JSON_UNESCAPED_UNICODE daje čitljiviji rezultat.

JSON obrada
<?php

try {
    $data = json_decode($json, true, 512, JSON_THROW_ON_ERROR);
    $output = json_encode(
        $data,
        JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT
    );
} catch (JsonException $exception) {
    throw new RuntimeException('Neispravan JSON.', 0, $exception);
}

Jednostavno nije trivijalno

CSV, atomarni zapis i zaključavanje

CSV nema jednu univerzalnu kombinaciju razdjelnika, kodiranja i decimalnog formata. Ugovorite format i koristite fgetcsv/fputcsv umjesto ručnog explodea. Ako više procesa piše u istu datoteku, potreban je lock; za kritične podatke baza je bolji izbor.

CSV izvoz
<?php

$handle = fopen(__DIR__ . '/exports/articles.csv', 'wb');

if ($handle === false) {
    throw new RuntimeException('Izvoz nije moguće otvoriti.');
}

fputcsv($handle, ['id', 'naslov'], ';');
fputcsv($handle, [42, 'Moderni PHP'], ';');
fclose($handle);

Primijenite naučeno

Vježba: JSON spremište za bilješke

Napravite skriptu koja čita polje bilješki iz JSON-a i dodaje novu bilješku.

  1. Koristite __DIR__ i JSON_THROW_ON_ERROR.
  2. Provjerite da dekodirani korijen jest polje.
  3. Zapišite lijepo formatiran UTF-8 JSON uz zaključavanje.

Za provjeru i nastavak

Službeni izvori