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.
<?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.
<?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.
<?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.
- Koristite __DIR__ i JSON_THROW_ON_ERROR.
- Provjerite da dekodirani korijen jest polje.
- Zapišite lijepo formatiran UTF-8 JSON uz zaključavanje.
Za provjeru i nastavak