Informaticasite van het Lauwers College te Buitenpost                 © R.J. van der Beek
 

Hoofdstuk 16: Javascript en PHP

16.8 PHP-Werken met bestanden

  16.8.1. Een tekstbestand opslaan en inlezen m.b.v. PHP

Je kunt met PHP er gemakkelijk voor zorgen dat gegevens, die m.b.v. een formulier zijn ingevoerd, in een tekstbestand worden opgeslagen.
En je kunt er ook voor zorgen dat iedereen die gegevens kan bekijken, zodat ze kunnen zien welke gegevens zijn ingevoerd.

We bespreken hier hoe de gegevens in een tekstbestand kunnen worden opgeslagen.
Je kunt er ook voor zorgen dat de gegevens in een tabel van een database worden opgeslagen, en je kunt de gegevens dan m.b.v. SQL laten zien. Het werken met databases en SQL wordt uitgelegd in paragraaf 19.5 van PHP en MySQL.

Een tekstbestand inlezen
De php-opdrachten om het tekstbestand GEGEVENS.TXT te openen, en de regels die er in staan te lezen, zijn als volgt:

$a = fopen("GEGEVENS.TXT","r");
$b = file("GEGEVENS.TXT");
$aantal = count($b);
for ($i=0;i<$aantal;$i++)
{
      print("$b[$i]<br>");
}
fclose($a);

Wat betekenen deze opdrachten ?

$a=fopen("GEGEVENS.TXT","r");
betekent dat het bestand GEGEVENS.TXT wordt geopend om te lezen ("r" van read)
en $a is de aanwijzer, die bijhoudt tot hoever het bestand is gelezen.
Denk er om dat servers, die onder UNIX draaien hoofdlettergevoelig zijn.
Dat betekent dat als het bestand GEGEVENS.TXT met hoofdletters is geschreven je het in de code ook met hoofdletters moet schrijven.
GEGEVENS.TXT en gegevens.txt zijn onder UNIX verschillende dingen !

$b=file("GEGEVENS.TXT");
heeft tot gevolg dat het hele tekstbestand in één keer wordt gelezen en dat de inhoud ervan in de variabele $b wordt opgeslagen.
$b is een zogenaamd array: een rij variabelen.
De eerste regel wordt opgeslagen in het eerste element van die rij, en die variabele wordt aangegeven met $b[0]
(ze beginnen dus bij 0 te tellen)
De tweede regel wordt opgeslagen in het tweede element van die rij, en dat is $b[1]
De volgende regel wordt opgeslagen in $b[2], daarna in $b[3], enz.
Het aantal regels, dat is hetzelfde als het aantal elementen van de rij $b, kun je opvragen met count($b)

$aantal=count($b);
heeft tot gevolg dat de variabele $aantal het aantal regels bevat.

for ($i=0;i<$aantal;$i++)
{
      print("$b[$i]<br>");
}

heeft tot gevolg dat alle regels worden afgedrukt.

fclose($a);
heeft tot gevolg dat het tekstbestand wordt afgesloten.


In een tekstbestand schrijven
Stel je voor dat er drie regels in het tekstbestand met de naam GEGEVENS.TXT moeten worden opgeslagen.
En stel dat de eerste regel een naam bevat, die m.b.v. de variabele $naam is vastgelegd.
En de tweede regel bevat een adres, dat m.b.v. de variabele $adres is vastgelegd.
En de derde regel een plaats, die m.b.v. de variabele $plaats is vastgelegd.
De opdrachten daarvoor zijn:

$a=fopen("GEGEVENS.TXT","w");
fwrite($a,"$naam");
fwrite($a,"$adres");
fwrite($a,"$plaats");
fclose($a);

Wat betekenen deze opdrachten ?

$a=fopen("GEGEVENS.TXT","w");
betekent dat het bestand GEGEVENS.TXT wordt geopend om er in te schrijven ("w" van write)
en $a is de aanwijzer, die bijhoudt tot hoever er in het bestand is geschreven.

fwrite($a,"$naam");
heeft tot gevolg dat de naam, die m.b.v. de variabele $naam is vastgelegd, in het bestand wordt geschreven.

fwrite($a,"$adres");
heeft tot gevolg dat het adres, dat m.b.v. de variabele $adres is vastgelegd, in het bestand wordt geschreven (achter de naam).

fwrite($a,"$plaats");
heeft tot gevolg dat de plaats in het bestand wordt geschreven (achter het adres).

fclose($a);
heeft tot gevolg dat het tekstbestand wordt afgesloten.

  16.8.2. Gegevens invoeren m.b.v. een formulier

Het invoeren van de gegevens kan gebeuren met behulp van een formulier.
Dat formulier kan er heel eenvoudig uitzien.
Er kan bijvoorbeeld om de naam gevraagd worden, en het adres en de woonplaats.

De code ziet er dan zo uit:

<form ACTION="verwerkgegevens.php" METHOD="post" >
Naam:  <input type="text" name="naam" size="40" > <br>
Adres:  <input type="text" name="adres" size="40" ><br>
Woonplaats: <input type="text" name="plaats" size="40" > <br>
<input type="submit" value="Verzenden" > <br>
</form>

Het formulier ziet er dan als volgt uit:

Naam:
Adres:
Woonplaats:
 

Zodra je op de knop met de tekst Verzenden klikt wordt het PHP-bestand verwerkgegevens.php gestart.
Dat zorgt er voor dat de naam, het adres en de plaats worden opgeslagen.
En daarna worden de gegevens getoond.
De code van verwerkgegevens.php zie je hier onder.

  16.8.3. De code voor de verwerking van het formulier voor de gegevens

De rode tekst is de code, de blauwe tekst bestaat uit opmerkingen.

<HTML><HEAD><TITLE>Formuliergegevens verwerken PHP</TITLE></head>
<body>
<H1>Verwerking van gegevens met PHP</H1><hr>
<!--
- Eerst worden spaties, slashes en tags verwijderd uit de invoer.
- Wat er bijvoorbeeld in het tekstveld voor de naam (waarin staat: name="naam") staat wordt opgeslagen in de variabele $naam, enz.
- trim($naam) heeft tot gevolg dat eventuele spaties aan het begin van de naam en aan het einde worden weggehaald.
- stripslashes($naam) heeft tot gevolg dat eventuele ontsnappingstekens, die tijdens de overdracht zijn toegevoegd, worden weggehaald.
- strip_tags($naam) heeft tot gevolg dat eventuele tags, die zijn ingevoerd, worden weggehaald.
-->

<?php
      $naam=strip_tags(stripslashes(trim($_POST['naam'])));
      $adres=strip_tags(stripslashes(trim($_POST['adres'])));
      $plaats=strip_tags(stripslashes(trim($_POST['plaats'])));

// Vervolgens wordt op het scherm getoond wat er is ingevuld.

      print ("Je hebt de volgende dingen ingevuld: <br>");
      print ("Naam: $naam<br>\n");
      print ("Adres: $adres<br>\n");
      print ("Woonplaats: $plaats<br>\n");
      print (" <br>\n");
      print (" <br>\n");
      $doorgaan=true;

// Nu wordt gecontroleerd of overal wel iets is ingevuld.
// Als dat niet het geval is krijgt $doorgaan de waarde false
// Dat heeft tot gevolg dat het niet wordt opgeslagen (want er wordt alleen iets opgeslagen
// als $doorgaan de waarde true heeft (zie een paar regels verderop)


if ($naam=="" or $adres=="" or $plaats=="")
{
      print("Je hebt niet alles ingevuld. Dit wordt niet opgenomen.<br>\n");
      $doorgaan=false;
}

// Als alles is goed gegaan dan wordt het bestand gegevens.txt geopend
//om er iets aan toe te voegen (de a is van append=toevoegen).
//En dan wordt de naam en het adres en de plaats opgeslagen


if ($doorgaan==true)
{
      $bn="gegevens.txt";
      $Open=fopen($bn,"a");
      if ($Open)
      {
            fwrite($Open,"$naam\n");
            fwrite($Open,"$adres\n");
            fwrite($Open,"$plaats\n");
            fclose($Open);
      }
}
?>
</body></html>

  16.8.4. De code voor het inlezen en bekijken van de gegevens.

Als de gegevens op het scherm getoond moeten worden moeten ze eerst worden ingelezen.
Als bovenstaand formulier is gebruikt om de gegevens in te voeren en te bewaren, dan kunnen er een heel stel namen met adressen en plaatsen in het bestand zitten.

<HTML><HEAD><TITLE>Formuliergegevens verwerken PHP</TITLE></head>
<body>
<h2>De gegevens:</h2>
<?php
$bnaam="gegevens.txt";

//Het bestand met de naam gegevens.txt wordt geopend
//om er uit te lezen (de r is van read)

$Open=fopen($bnaam,"r");
if ($Open)
{
    $b=file($bnaam);

//$b is een array die alle regels van de gegevens bevat
//$b[0] bevat de eerste regel, $b[1] de tweede regel, enz

    for ($i=0;$i<count($b);$i++)
    {
//Er worden steeds na drie regels (dus als een naam en
// het bijbehorende adres en de plaats is afgedrukt) twee lege regels 
// tussengevoegd om duidelijk te laten zien dat de gegevens van een 
// een andere persoon komen.
	if ( ($i + 1) mod 3 == 0 )
	{
	    print("<br><br>");
	}
        print("$b[$i]<br>");
    }	
    fclose($Open);
}
?>
</body></html>