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

Hoofdstuk 19. PHP (deel 2) en MySQL

19.1 Werken met tekstbestanden

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

In hoofdstuk 16, paragraaf 5 t/m 8 is de basis van PHP besproken, hier gaan we verder met waar we gebleven waren.
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.

  19.1.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.

  19.1.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>

  19.1.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) een streepjesregel 
// tussengevoegd om duidelijk te laten zien dat de gegevens van een 
// een andere persoon komen.
	if (fmod($i + 1,3) == 0 )
	{
	    print("<br>----------------------------------------<br>");
	}
        print("$b[$i]<br>");
    }	
    fclose($Open);
}
?>
</body></html>

  19.1.5. Het recht om naar een bestand te schrijven

Als je het doet zoals hiervoor beschreven is dan gaat het nog niet goed.
De meeste servers draaien onder Linux, en in Linux wordt van elk bestand vastgelegd wie de "eigenaar" van dat bestand is.
En die eigenaar mag het bestand veranderen, maar een ander niet.
Of je moet er voor zorgen dat anderen wel toestemming krijgen om het te veranderen.
Dat doe je op de volgende manier:
Je hebt een leeg tekstbestand GEGEVENS.TXT aangemaakt op je eigen computer met KLADBLOK en je kopieert het met een ftp-programma naar de server.
Als het op de server in je web-map staat, dan klik je er met de rechtermuisknop op. (als je de bestanden in de web-map met behulp van het ftp-programma in beeld hebt).
Dan krijg je een snelmenu, en daarin kies je chmod (UNIX)
Dan krijg je een venster zoals je hieronder ziet.
Dan zet je een vinkje voor alle vierkantjes met Read en ook voor alle vierkantjes met Write, en dan heeft iedereen het recht om dat bestand te lezen en ernaar te schrijven.


  19.1.6. Andere file-functies

De functie $variabele = fopen(filenaam, mode) , bijvoorbeeld $a=fopen("GEGEVENS.TXT","r"), geeft je een zogenaamde file-handler. Dat is een getal (en $a bevat die waarde in het voorbeeld) dat je in alle andere file-opdrachten moet gebruiken.

Met mode geef je aan wat je wilt doen met het bestand: lezen of schrijven of beide. Voor mode kun je de volgende tekens gebruiken :

ralleen lezen
r+lezen en schrijven
walleen schrijven, maakt de file eerst leeg
w+lezen en schrijven, maakt de file eerst leeg
atoevoegen (alleen schrijven)
a+toevoegen (lezen en schrijven)
xfile aanmaken (alleen schrijven)
x+file aanmaken (lezen en schrijven)

Als je een file geopend hebben met fopen( ), dan kun je op verschillende manieren lezen uit de file.
Er wordt met een zogenaamde aanwijzer of file-pointer bijgehouden tot hoever de file is ingelezen. Bij elke lees-opdracht wordt er vanaf die plaats gelezen.
  • Je kunt teken voor teken lezen uit de file met fgetc(file-handler), bijvoorbeeld $teken = fgetc($a).
    M.b.v. deze opdracht wordt het eerstvolgende teken in de file gelezen, en $teken bevat dan dat teken.

  • Als je meer tekens tegelijk wilt inlezen dan moeten je de opdracht fread(file-handler, size) gebruiken, bijvoorbeeld $tekens = fread($a, 10).
    Er worden in dat geval precies 10 tekens gelezen (of er wordt gestopt aan het einde van de file, als er geen 10 tekens meer over zijn), en $tekens bevat dan de string met die 10 tekens.
    M.b.v. de opdracht $tekst = fread($a,filesize(file-naam)); wordt de volledige inhoud van $tekstfile ingelezen, en $tekst bevat die inhoud.

  • Een andere opdracht waarmee het hele bestand in één keer wordt ingelezen is: readfile(file-naam), bijvoorbeeld $tekst = readfile($bestand);

  • Verder heb je nog de opdracht fpassthru(file-handler), bijvoorbeeld $b = fpassthru($a).
    Als je deze opdracht gebruikt wordt de hele file gelezen, en per regel opgeslagen in de array $b

  • Nog een andere functie: fgets(file-handler, 1024), bijvoorbeeld $regel = fgets($a, 1024).
    Als je deze opdracht gebruikt dan wordt er een hele regel gelezen (tot er een enterteken of het einde van het bestand gevonden wordt), en $regel bevat dan die regel.

  • Als je wilt schrijven naar een file kun je fputs(file-handler, string[, lengte]) gebruiken, bijvoorbeeld fputs($a, $string, 3).
    Er worden in het geval van het voorbeeld drie tekens van de string naar de file geschreven.
    Als er geen lengte gegeven is, dus als in het voorbeeld het getal 3 (en de komma) wordt weggelaten, dan wordt de volledige string naar de file geschreven.

  • In plaats van de vorige functie kun je ook fwrite(file-handler, string[, lengte]) gebruiken.
    Die functie werkt net zo als de vorige.

  • De opdracht rewind(file-handler) zorgt ervoor dat de aanwijzer wordt teruggezet naar het begin van de file.

  • Met de opdracht fseek(file-handler, plaatsnummer) gaat de aanwijzer naar de positie, gegeven door het getal dat plaatsnummer genoemd is.

  • Met de opdracht ftell(file-handler) wordt de huidige positie van de aanwijzer gegeven.

  • De opdracht $boolean = feof(file-handler) zorgt ervoor dat $boolean de waarde TRUE of FALSE krijgt. Als het einde van de file bereikt is krijgt het de waarde TRUE en anders FALSE.
    Deze functie wordt vaak gebruikt in een while-lus om ervoor te zorgen dat er net zolang wordt doorgegaan met lezen tot het einde van het bestand bereikt is.

  • De opdracht fclose(file-handler) gebruik je om de file te sluiten.