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.
Gebruik file_put_contents() om de tekst "Hallo wereld" te schrijven naar het bestand "test.txt".
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.
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.
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".
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.
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.
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.
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.
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!
Open het bestand "data.txt" in schrijfmodus ("w"), schrijf de tekst "Hallo" met fwrite(), en sluit het bestand met fclose().
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.
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".
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.
Open "producten.csv" in append-modus ("a") en voeg het product "Monitor;299;20" toe gevolgd door PHP_EOL. Sluit het bestand.
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"].
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)".
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.
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.
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.
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>".
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".
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.
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.
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.
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.
In dit hoofdstuk heb je geleerd:
file_get_contents() en file()file_put_contents() en de FILE_APPEND vlagfopen(), fwrite() en fclose() voor meer controle"r" (lezen), "w" (schrijven), "a" (toevoegen)implode() om arrays samen te voegen en explode() om strings te splitsenfile() om een bestand als array van regels in te lezenarray_reverse() om berichten in omgekeerde volgorde te tonen