Hoofdstuk 14: Bestandsbeheer (File I/O)

← Terug naar overzicht

Eenvoudig lezen & schrijven

PHP kan bestanden op de server lezen en schrijven. De twee eenvoudigste functies hiervoor zijn file_put_contents() om te schrijven en file_get_contents() om te lezen. Met de vlag FILE_APPEND kun je tekst toevoegen aan een bestaand bestand in plaats van het te overschrijven.

<?php
// Schrijven (overschrijft het bestand)
file_put_contents("notities.txt", "Eerste regel");

// Toevoegen aan bestand
file_put_contents("notities.txt", "\nTweede regel", FILE_APPEND);

// Lezen
$inhoud = file_get_contents("notities.txt");
echo $inhoud;
?>

Let op: file_put_contents() zonder FILE_APPEND overschrijft het hele bestand! Gebruik FILE_APPEND als je tekst wilt toevoegen. Gebruik PHP_EOL voor een platformonafhankelijke regelovergang.

Let op: In de oefeningen hieronder hoef je GEEN <?php en ?> tags te typen. Het platform regelt dit automatisch. Je typt alleen de PHP-code zelf.

Oefening 1

Gebruik file_put_contents() om de tekst "Hallo wereld" te schrijven naar het bestand "test.txt".

Jouw code:

Oefening 2

Schrijf de tekst "Regel 1" naar "logboek.txt". Voeg daarna op een nieuwe regel "Regel 2" toe met FILE_APPEND. Gebruik PHP_EOL voor de regelovergang.

Jouw code:

Oefening 3

Lees de inhoud van het bestand "bericht.txt" met file_get_contents() en sla het op in een variabele $inhoud. Toon de inhoud met echo.

Jouw code:

Oefening 4

Schrijf een functie schrijfLog($bericht) die een bericht met datum toevoegt aan "log.txt". Gebruik date("Y-m-d H:i") voor de datum, een spatie als scheidingsteken, en FILE_APPEND. Voeg PHP_EOL toe aan het einde. Roep de functie aan met "Server gestart".

Jouw code:

Oefening 5

Maak een variabele $naam met waarde "Jan" en een variabele $score met waarde 95. Schrijf de tekst "Jan;95" naar "scores.txt" (gebruik ; als scheidingsteken). Lees het bestand daarna terug en toon de inhoud.

Jouw code:

Oefening 6

Schrijf een functie voegScoreToe($naam, $score) die een nieuwe regel toevoegt aan "scores.txt" in het formaat "naam;score" gevolgd door PHP_EOL. Gebruik FILE_APPEND. Roep de functie twee keer aan: eerst met "Anna" en 88, dan met "Bas" en 72.

Jouw code:

Oefening 7

Schrijf een functie telRegels($bestandsnaam) die het aantal regels in een bestand telt. Gebruik file_get_contents() om het bestand te lezen, explode() met PHP_EOL om te splitsen in regels, en count() om te tellen. Test met: schrijf eerst "a\nb\nc" naar "test.txt", roep dan de functie aan en toon het resultaat.

Jouw code:

Oefening 8

Schrijf een functie kopieerBestand($bron, $doel) die de inhoud van een bestand leest met file_get_contents() en naar een nieuw bestand schrijft met file_put_contents(). Test door eerst "Hallo wereld!" naar "origineel.txt" te schrijven, dan te kopieren naar "kopie.txt", en tot slot de inhoud van "kopie.txt" te tonen.

Jouw code:

CSV en gestructureerde data

Voor meer controle over bestanden gebruik je fopen(), fwrite() en fclose(). Met fopen() open je een bestand in een bepaalde modus: "w" (schrijven, overschrijft), "r" (lezen), of "a" (toevoegen). Je kunt gestructureerde data opslaan met een scheidingsteken zoals ; en die later weer splitsen met explode().

<?php
// Schrijven met fopen
$bestand = fopen("data.csv", "w");
fwrite($bestand, "naam;leeftijd;stad" . PHP_EOL);
fwrite($bestand, "Jan;25;Amsterdam" . PHP_EOL);
fclose($bestand);

// Regel splitsen met explode
$regel = "Jan;25;Amsterdam";
$velden = explode(";", $regel);
echo $velden[0]; // Jan
echo $velden[1]; // 25
?>

De drie bestandsmodi die je het meest gebruikt: "w" = write (maakt nieuw of overschrijft), "r" = read (alleen lezen), "a" = append (toevoegen aan het einde). Vergeet nooit fclose() aan te roepen als je klaar bent!

Oefening 1

Open het bestand "data.txt" in schrijfmodus ("w"), schrijf de tekst "Hallo" met fwrite(), en sluit het bestand met fclose().

Jouw code:

Oefening 2

Maak een array $product met de waarden "Laptop", "999" en "5". Gebruik implode(";", $product) om de array om te zetten naar een string met ; als scheidingsteken. Toon het resultaat met echo.

Jouw code:

Oefening 3

Gegeven de string $regel = "Appel;3;0.50". Gebruik explode(";", $regel) om de string te splitsen. Toon vervolgens: "Product: Appel, Aantal: 3, Prijs: 0.50".

Jouw code:

Oefening 4

Schrijf een CSV-bestand "producten.csv". Open het met fopen() in modus "w". Schrijf een header-regel "naam;prijs;voorraad" en twee producten: "Muis;25;100" en "Toetsenbord;45;50". Sluit elk regel af met PHP_EOL. Sluit het bestand.

Jouw code:

Oefening 5

Open "producten.csv" in append-modus ("a") en voeg het product "Monitor;299;20" toe gevolgd door PHP_EOL. Sluit het bestand.

Jouw code:

Oefening 6

Schrijf een functie schrijfCSVRegel($bestandsnaam, $velden) die een array $velden samenvoegt met implode(";") en toevoegt aan het bestand met FILE_APPEND. Voeg PHP_EOL toe. Test door twee keer aan te roepen: met "rapport.csv" en ["Jan", "90", "Voldoende"], daarna met "rapport.csv" en ["Sara", "75", "Voldoende"].

Jouw code:

Oefening 7

Schrijf een functie leesCSV($regel) die een CSV-regel met ; scheidingsteken ontvangt en een associatieve array teruggeeft met de sleutels "naam", "prijs" en "voorraad". Test met de regel "Laptop;999;15" en toon: "Laptop kost 999 euro (15 op voorraad)".

Jouw code:

Oefening 8

Schrijf een functie updateCSV($bestandsnaam, $zoekNaam, $nieuwePrijs) die een CSV-bestand leest (formaat: naam;prijs;voorraad), de prijs van het product met de opgegeven naam wijzigt, en het bestand opnieuw opslaat. Maak eerst een bestand met "Laptop;999;5\nMuis;25;100\n". Update de prijs van "Muis" naar 30. Lees het bestand terug en toon de inhoud.

Jouw code:

Gastenboek bouwen

Met de functie file() kun je een bestand direct inlezen als array, waarbij elke regel een element wordt. Gecombineerd met array_reverse() kun je berichten in omgekeerde volgorde tonen (nieuwste eerst). Dit is ideaal voor een gastenboek: berichten opslaan met file_put_contents() en FILE_APPEND, en uitlezen met file().

<?php
// Bericht opslaan
$bericht = "Jan|2024-01-15|Leuke website!";
file_put_contents("berichten.txt", $bericht . PHP_EOL, FILE_APPEND);

// Berichten lezen (nieuwste eerst)
$regels = file("berichten.txt", FILE_IGNORE_NEW_LINES);
$regels = array_reverse($regels);
foreach ($regels as $regel) {
    $velden = explode("|", $regel);
    echo $velden[0] . " (" . $velden[1] . "): " . $velden[2] . "<br>";
}
?>

De functie file() leest een bestand in als array van regels. De vlag FILE_IGNORE_NEW_LINES zorgt ervoor dat de regelovergangen niet worden meegenomen. Gebruik trim() als extra beveiliging tegen spaties en onzichtbare tekens.

Oefening 1

Schrijf drie regels naar "namen.txt": "Jan", "Piet" en "Sara" (elk op een eigen regel met PHP_EOL). Lees het bestand vervolgens in met file() en de vlag FILE_IGNORE_NEW_LINES. Toon het aantal namen met echo.

Jouw code:

Oefening 2

Schrijf drie namen naar "namen.txt": "Anna", "Bas", "Clara". Lees het bestand in met file() en FILE_IGNORE_NEW_LINES. Gebruik array_reverse() om de volgorde om te draaien. Toon elke naam met een foreach-loop gevolgd door "<br>".

Jouw code:

Oefening 3

Schrijf een functie voegBerichtToe($naam, $tekst) die een regel toevoegt aan "berichten.txt" in het formaat "naam|tekst" gevolgd door PHP_EOL, met FILE_APPEND. Voeg twee berichten toe: "Jan" met "Leuke site!" en "Sara" met "Goed gemaakt".

Jouw code:

Oefening 4

Schrijf een functie toonBerichten($bestandsnaam) die het bestand inleest met file(), de regels omdraait met array_reverse(), en elke regel splitst op "|". Toon elk bericht als "[naam]: [tekst]<br>". Maak eerst het bestand aan met twee berichten "Jan|Hoi" en "Sara|Dag" (elk op eigen regel). Roep dan de functie aan.

Jouw code:

Oefening 5

Schrijf een functie voegBerichtToe($naam, $tekst) die de naam en tekst valideert (niet leeg na trim()). Als beide geldig zijn, sla het bericht op in "gastenboek.txt" in het formaat "naam|datum|tekst" (gebruik date("Y-m-d") voor de datum) en return true. Als een veld leeg is, return false. Test met voegBerichtToe("Jan", "Hallo!") en toon "Opgeslagen" als het lukt.

Jouw code:

Oefening 6

Bouw een voorraadsysteem. Schrijf een functie schrijfVoorraad($producten) die een array van arrays ontvangt (bijv. [["Appel", 50], ["Banaan", 30]]) en elk product als CSV-regel naar "voorraad.csv" schrijft (naam;aantal, elk gevolgd door PHP_EOL). Overschrijf het bestand. Schrijf ook een functie leesVoorraad() die "voorraad.csv" inleest en elke regel toont als "[naam]: [aantal] stuks<br>". Test beide functies.

Jouw code:

Oefening 7

Bouw een compleet gastenboek. Schrijf de functies bewaarBericht($naam, $tekst) (valideert, slaat op met datum en | scheidingsteken in "gastenboek.txt") en toonGastenboek() (leest berichten, toont nieuwste eerst als "[naam] ([datum]): [tekst]<br>"). Maak eerst het bestand met file_put_contents("gastenboek.txt", "") om leeg te beginnen. Voeg twee berichten toe en toon het gastenboek.

Jouw code:

Samenvatting

In dit hoofdstuk heb je geleerd: