Les 10

In deze les leert u hoe u een teller op je webpagina's plaatst en hoe u een simpel gastenboek aanmaakt.

Een teller op onze webpagina.

Laten we beginnen met het maken van een simpele teller, die bijhoudt hoeveel maal een webpagina werd bezocht. Om te beginnen maken we een file aan teller.txt met als inhoud 1. Open met je teksteditor een file, tik er 1 in en sla hem op als teller.txt. Je moet wel de file opslaan in de directory van waaruit je jouw html-pagina's oproept.

Nu gaan we het script schrijven teller.php

<?php
echo "<P><h3>Deze pagina werd ";
$pointer=fopen("teller.txt","r+");
$teller=fgets($pointer,7);
$teller=trim($teller);
echo "<b>$teller</b> ";
$teller++;
rewind($pointer);
fputs($pointer,$teller);
fclose($pointer);
echo " maal getoond.<h/3></p>";
?>

Als je nu klikt op teller.php zal de waarde 1 getoond worden. Telkens je nu op de reload button van je browser klikt, zal de teller met 1 verhoogd worden. (hier kan de waarde groter dan 1 zijn, aangezien er waarschijnlijk voor jullie iemand dit script reeds heeft uitgevoerd)

En aktie !

We gaan nu even het script van naderbij bekijken.

$pointer=fopen("teller.txt","r+");

Een file openen met fopen()

Met de term file wordt bedoeld : gewone tekstfiles, php pagina's, html pagina's. Dat zijn over het algemeen documenten die enkel platte tekst bevatten zonder enige opmaak.


Om een file te openen heb je de functie fopen() nodig. De syntax is : $variabele=fopen(naam_van_de_file,mode). Hier is de file geen groot misterie, gewoon de file teller.txt dat we eerst hebben aangemaakt met de waarde 1 erin. Met mode specifieer je wat je kunt doen met de file. De modes zijn :
 
ralleen lezen
r+lezen en schrijven
wmaak de file ledig en open deze alleen schrijven
w+maak de file ledig en open deze voor lezen en schrijven
aappend of toevoegen (enkel schrijven)
a+append of toevoegen (lezen schrijven)
xfile aanmaken (enkel schrijven)
x+file aanmaken (lezen en schrijven)

Opgepast met w en w+. Als je deze gebruikt plaatst hij de pointer in het begin van de file en wordt de file blank gemaakt. Als de file niet bestaat, gaat hij die aanmaken.

Met x en x+ kan je gewoon een file aanmaken om naar weg te lezen/schrijven. Deze opties maken de file niet ledig. Als de file die je probeert te openen niet bestaat, gaat hij deze dan gewoon aanmaken.

In ons voorbeeld gaan we de file openen, lezen en dan de waarde verhogen en dan de nieuwe waarde wegschrijven. Dus moet onze file geopend worden voor lezen en schrijven, dus r+. Belangrijke opmerking, in deze mode begint het lezen en schrijven in het begin van de file.

Nu, de variabele $pointer. Je kunt deze variabele om het even welke naam geven, maar gebruik bij voorkeur pointer, want in feite is het een pointer. Als je de functie fopen() gebruikt, positioneert die functie een pointer in de tekstfile. Eenmaal de file geopend, blijven we werken met deze pointer. In de mode r+ wordt de pointer dan geplaatst helemaal linksboven in de file. Je moet je hierbij voorstellen dat je tekstfile in een raster wordt verdeeld. Laten we de X-as met letters aanduiden en de Y-as met cijfers.
 

 

1

2

3

4

5

6

7

8

9

a

m

e

t

 

d

e

 

 

 

b

t

r

e

i

n

 

 

 

 

c

z

o

u

 

j

e

 

e

r

d

a

l

 

z

l

j

n

 

 


Als je nu de functie fopen() toepast op deze file, zal de pointer op a,1 staan of op de letter m. Doe je fopen($pointer,6), dan zal de pointer op de letter e staan. De pointer blijft daar gewoon staan en wacht op verdere instructies. Welke instructies ? Wel, de volgende bijvoorbeeld :-)

De functie fgets()

De functie fgets leest gegevens uit een file. Het lezen wordt beïndigd bij het einde van de lijn of het einde van de file, of nog, als er een aantal bytes wordt opgegeven. Hier gebruiken we in ons voorbeeld $teller=fgets($pointer,7). Als we met fopen() onze file teller.txt openen, dan staat de pointer helemaal links boven in onze file op het cijfer 1. Nu zeggen we aan fgets, dat ie de file moet lezen, maar enkel 7 bytes van die file. Dus begint fgets te lezen en schuift 7 bytes door naar rechts in onze file. Aangezien er thans maar 1 cijfer instaat zijn de rest blanco bytes. Mocht er nu het getal 123456789 instaan, dan zal fgets stoppen met lezen op het getal 7, alles wat erna komt zal genegeerd worden.

Vervolgens kennen we de waarde dat fgets retourneert toe aan onze variabele $teller, en verhogen we onze teller met 1 (teller++). Ben je nog mee ? Zoals gezegd heeft fgets nu 7 bytes gelezen van onze file. Dus, onze onzichtbare cursor, de pointer staat nu op het eerste lijntje van onze file, zeven bytes naar rechts.

De functie trim()

De functie trim() gebruiken we om spaties te verwijderen aan het begin en of aan het einde van een string. Als we een tekstfile aanmaken hebben we nogal eens de neiging van op enter te drukken na een invoer. Op enter drukken betekent echter dat er in je tekstfile een onzichtbare einde regel wordt ingevoegd. Nu lezen we een getal in, en als je op enter hebt gedrukt toen je het getal 1 invoerde in de tekstfile, zit je daar dan met een einde regelteken.

 Aangezien we gaan rekenen met dat getal, moeten we enkel de cijfers hebben, want herinner de eerste lessen, als je strings met elkaar gaat optellen kun je onverwachte resultaten krijgen. Om nu die blank spaces of einde regeltekens te verwijderen gebruiken we de trim functie. Met trim kun je allerhande tekens verwijderen, sla er de php-manual op na als je er meer wenst over te weten. Onthou alleen, dat met de functie trim, zonder speciale argumenten, de spaties en einde regeltekens worden verwijderd. Voor ons voorbeeld is dat voldoende.

De functie rewind()

Als we nu gaan schrijven in onze file, moeten we terug aan het begin van onze file zijn. Met rewind($pointer), plaatsen we onze cursor nu terug links boven in onze file. Rewind kan ook het byte argument meekrijgen. rewind($pointer,2), zal onze pointer bijvoorbeeld van op zijn huidige positie twee bytes naar links laten terugkeren. Zonder bijkomend argument wordt de cursor op a,1 geplaatst.

De functie fputs()

Met deze functie gaan we tenslotte schrijven in onze file. fputs($pointer,$teller) vertelt dat hij moet beginnen schrijven op de plaats waar onze onzichtbare cursor staat en dat hij de waarde van $teller moet wegschrijven. Nu, zolang je teller onder de 7 cijfers blijft, zul je geen problemen ondervinden. Mocht je teller nu groter worden, dan zul je het script moeten aanpassen, want zoals gezegd, fgets stopt met lezen op positie 7 in ons geval, en alles wat erna komt wordt genegeerd.

De functie flcose()

Deze functie is klaar en duidelijk me dunkt. Met fclose(teller.txt) sluiten we onze file terug af op een nette manier. Let wel, het is niet verplicht om fclose te gebruiken, zonder fclose zal het ook werken, maar door je files netjes af te sluiten met fclose, laadt je de file uit het geheugen en spaar je alzo systeem resources. Dus, niet vergeten, sluit je files af met fclose.

PERMISSIES !!!!!!

Onder Windows moet je zorgen dat je kunt schrijven naar de file. Klik rechts op de file, kies eigenschappen, en zorg ervoor dat er geen vinkje staat bij enkel lezen.Onder Unix wordt je webserver opgestart als user apache of www-data of misschien onder nog een andere naam. Als je de standaard apache root directory gebruikt, is de eigenaar van de files root, dit wil zeggen dat enkel en alleen root naar een file zal kunnen schrijven en in het ergste geval, enkel root een file kan lezen. Dus, de file moet voor iedereen beschrijfbaar en leesbaar zijn , zoniet, zul je permissions denied krijgen als je wilt schrijven  naar een file. Doe dus een chmod 666 op de file teller.txt om deze fouten te voorkomen.


Als je wenst te schrijven naar een file moet deze file de juiste machtigingen hebben. Onder unix is dat een chmod 666, onder windows, rechts klikken op de file, kiezen voor eigenschappen, en het vinkje weghalen voor alleen lezen.




Om files up te loaden naar je webhoster, maak je gebruik van een ftp programma. In goede ftp programma's kan je instellen dat hij de permissies op de files moet bewaren. Indien dit niet het geval is, heeft een goed ftp programma ook de mogelijkheid om de files remote te voorzien van de nodige permissies. Over het algemeen rechts klikken op de remote file en kiezen voor chmod, waarna je de file van de juiste permissies kan voorzien.


Nu, met onze kennis van het lezen en schrijven naar files, is het moment aangebroken om ons gastenboek online te plaatsen. Wat doet een gastenboek ? Heel eenvoudig, de mensen kunnen iets schrijven erin, dat anderen op hun beurt terug kunnen lezen. Het is van belang, dat de laatste opmerkingen steeds bovenaan staan. Dus, zullen we de file moeten inlezen, de nieuwe tekst bovenaan toevoegen en het geheel terug wegschrijven.

Een eenvoudig gastenboek.

Maak nu eerst een lege file commentaar.txt aan en zet de permissies op lezen en schrijven.

De code voor gastenboek.php

<?php
$commentaar=$_POST["commentaar"];
$naam=$_POST["naam"];
$email=$_POST["email"];
echo "<H2>Een eenvoudig gastenboek</H2>\n";
echo "<form action=\"$_SERVER[PHP_SELF]\" method=\"post\">\n";
echo "<p>Uw naam : <input type=\"text\" name=\"naam\"></p>\n";
echo "<p>Uw E-mail : <input type=\"text\" name=\"email\"></p>\n";
echo "<p>Uw commentaar :</p>\n";
echo "<textarea cols=\"55\" rows=\"5\" wrap=\"soft\" name=\"commentaar\"></textarea><br>\n";
echo "<p><input type=\"submit\" value=\"Commentaar verzenden\"></p>\n";
echo "<hr>\n";
echo "<p><h2>Reeds geleverde commentaar</h2></p>\n";

$tekstfile="commentaar.txt";
if (isset($commentaar) && naam != "" && email != "") {
    $pointer=fopen($tekstfile,"r+");
    $oudcommentaar=fread($pointer,filesize($tekstfile));
    $email="<a href=\"mailto:$email\">$email</a>";
    $date=date("j.n.Y");
    $commentaar=htmlspecialchars($commentaar);
    $commentaar=stripslashes(nl2br($commentaar));
    $geschreven="<p><strong>$naam</strong> ($email) heeft geschreven op <i>$date</i> :
    <br><br>$commentaar</p><hr>\n";
    rewind($pointer);
    fputs($pointer,"$geschreven\n$oudcommentaar\n");
}
readfile($tekstfile);
?>

We hebben hier nu nog een paar nieuwe funtkies gebruikt. Ik leg deze hierbij uit.

De functie fread()

fread() doet het tegenovergestelde van fgets(). fgets() werkt lijn voor lijn, fread() leest ineens de inhoud van een ganse file in. fread neemt ook argumenten aan. fread(pointer,bytes). Maar aangezien we op voorhand niet weten hoe groot de file zal zijn, die wordt natuurlijk steeds maar groter naarmate er meer commentaar wordt geleverd, hebben we iets anders bij de hand die dit voor ons oplost.

De functie filesize()

De functie filesize() retourneert het aantal bytes in een file. Hier neemt de variabel $tekstfile de waarde van commentaar.txt aan. Ik moet nu die file inlezen als oud commentaar. Ik doe dit dan als volgt : $oudcommentaar=fread($pointer,filesize($tekstfile));. De filesize in dit geval wordt dan de volledige inhoud van $tekstfile of van onze commentaar.txt file.

$email="<a href=\"mailto:$email\">$email</a>"; Hier maak ik een normale email link aan.

De functie date()

Ik voeg met de functie date de datum in wanneer iemand commentaar levert. Date heeft een massa argumenten die ik hier voor jullie netjes op een rij ga plaatsen.

Wat de datums aangaat :

Argument

Uitleg

Voorbeeld

j

dagen van de maand niet voorafgegaan door een 0

van 1 tot 31

d

dagen van de maand voorafgegaan door een 0

van 01 tot 31

n

maanden niet voorafgegaan door een 0

van 1 tot 12

m

maanden voorafgegaan door een 0

van 01 tot 12

S

Engelse notatie

1st 3rd 5th

y

Jaargetal in 2 cijfers

03

Y

Jaargetal in 4 cijfers

2003

D

Dagen van de week verkort

mon tue

L

Dagen van de week lange schrijfwijze

monday tuesday

M

Maanden van het jaar kort

jan feb mar

F

Maanden van het jaar lang

januari

w

dag van de week (zondag=0)

van 0 tot 6

z

dag van het jaar

van 0 tot 365

t

hoeveel dagen een maand bevat

van 28 tot 31


Wil je nu de datum schrijven als 24.02.2003 dan gebruik je date("j.n.Y") of bijvoorbeeld de 4th of July 2003 dan gebruik je date("jS of F Y").
Wat de uren aangaat :

Argument

Uitleg

Voorbeeld

a

am of pm

am

A

AM of PM

PM

h

uren in 12 uur formaat

van 1 tot 12

H

24 uren formaat

van 0 tot 24

i

minuten

van 0 tot 59

s

seconden

van 0 tot 59

 
Met date("H:i:s") wordt de huidige tijd getoond bij het opvragen van de pagina.

De functie readfile()

Met readfile(file_naam) kun je een ganse file ineens inlezen en laten weergeven in je browser. Je ziet in mijn script dat ik alles wat door de gebruiker geschreven wordt opgenomen wordt in de variabele $geschreven. Als ik mijn file dan wens te schrijven, doe ik een rewind van de $pointer en schrijf ik eerst $geschreven weg, gevolgd door $oudcommentaar, zijnde de inhoud van de file voordat de nieuwe gebruiker zijn woordje heeft gedaan. Zo zal het laatste commentaar steeds bovenaan staan.

Wil jij het liever onderaan ? Geen probleem, schrijf dan eerst oudcommentaar weg gevolgd door geschreven.

En aktie !



Les 1 Les 2 Les 3 Les 4 Les 5 Les 6 Les 7 Les 8 Les 9 Les 10 Les 11 Les 12 Les 13 Home