Les 11

In deze les leert u hoe u cookies plaatst in je webpagina's.

De cookies

"Blij je terug te zien ...... ". Op hoeveel webpaginas heb je dit al gezien of iets dergelijks ? En het ergste van al, het is permanent. Weken nadat je een online shop bezocht hebt bijvoorbeeld, weet die nog steeds wat er in je winkelmandje zat bij je vorig bezoek. Wat of wie verbergt zich daarachter ? Magie ? Big Brother is watching You ? Helemaal niet dus. Het zijn eenvoudige cookies die aan de basis van dit alles liggen.

Wat zijn cookies ?

Cookies zijn één van de meest mysterieuse en onverstaanbare technieken op het web. Sommigen beweren dat cookies kunnen dienen om je harde schijf te controleren of dat cookies een open poort zijn voor virussen. Niets van dit alles is dus waar. Cookies zijn niets anders dan gewone tekstbestanden die een webpagina toelaten gegevens te registreren op jouw computer.

Cookies zijn niet gevaarlijk, zoals gezegd, zijn het gewone tekstbestandjes waarin je webbrowser gegevens kan schrijven. Als je terug naar dezelfde webpagina surft waar het cookie vandaan komt, kan je webbrowser terug dit bestandje inlezen en eventueel de nodige gegevens verstrekken die de webpagina vraagt, zonder dat jij iets hoeft in te tikken.

Normaal gezien weet de exploitant van de webpagina niet dat hij een cookie op jouw computer plaatst. Nu zijn er wel exploitanten van webpaginas die deze cookies gebruiken met eventuele andere informatie die jij verstrekt. Op die manier kunnen ze het surfgedrag van een gebruiker bepalen, en zo de gewenste paginas waarin de surfer interesse bleek te hebben, direkt voorschotelen bij een volgend bezoek. Cookies worden enkel gevaarlijk als je daarin je telefoonnummer, je adres of elektronisch adres in achterlaat. Cookies kunnen dienen om je later te spammen.

Webbrowsers zijn echter goed in staat om bepaalde cookies van een bepaald domein te verbieden. Hoe je dat doet, hangt af van de gebruikte webbrowser. Als je onder Mozilla bjvoorbeeld klikt op edit->preferences->Privacy & Security->cookies en dan klikt op Manage Stored Cookies, krijg je heel wat info te zien over de cookies op jouw systeem. Klik op een cookie om de inhoud ervan te zien.

Cookies plaatsen onder PHP

Cookies onder PHP worden geplaatst door middel van de functie setcookie(). Deze functie kent verschillende argumenten. Verplichte zijn, de naam van de cookie en de waarde wan de cookie. De functie gebruiken we dus als volgt setcookie("naam_cookie","waarde_cookie"). Let er wel op, cookies zijn strings.

Laten we nu even als voobeeld nemen : je stuurt een cookie naar een webbrowser die moet onthouden of de bezoeker als eens langs is geweest of niet. We noemen ons cookie dan ook bezoek en de waarde zetten we op ja. We schrijven dit dan zo :

setcookie("bezoek","ja");

BELANGRIJK !

Je kunt een cookie niet om het even waar plaatsen in je script. Een cookie staat helemaal bovenaan in je webpagina, en voor de tags. Dus, als je cookies wenst te gebruiken, eerst de cookie plaatsen, dan beginnen aan je webpagina.


De eerste tag van een webpagina is <html>. Als je nu een cookie wenst te plaatsen na deze tag, zal dit fouten opleveren in de aard van : Warning: Cannot modify header information - headers already sent by (output started at …..)


Ons eertse cookie.

Code voor cookie.php

<?php
setcookie("bezoek","ja");
echo "<h1>Een bezoeker herkennen</h2>";
if (isset($HTTP_COOKIE_VARS["bezoek"]) && $HTTP_COOKIE_VARS["bezoek"]=="ja") {
    echo "Wij zijn blij om je <strong> terug </strong> te zien !";
}
else {
    echo "Wij zijn blij je hier te mogen zien !";
}
?>

Als je nu dit script runt, wordt je de eerste maal begroet met "Wij zijn blij je hier te mogen zien !". Als je nu op de reload button van je browser klikt moet je dan echter "Wij zijn blij om je terug te zien !" te zien krijgen. Onze cookie werkt dus.

En aktie !

Zoals je kunt merken, recupereer ik de waarde van ons cookie met $HTTP_COOKIE_VARS["naam_van_het_cookie"].

Als je nu je browser afsluit en opnieuw opstart en cookie.php opvraagt, dan zul je terug verwelkomd worden door de pagina of je er nog nooit geweest bent. Lijdt je webbrowser aan Altzheimer of heeft hij ergens geheugenverlies ? Niets van dit alles natuurlijk. Cookies zijn beperkt in hun tijd. In ons script hebben wij geen levensduur meegegeven aan onze cookie. Bijgevolg, als je de browser sluit, verwijderd je browser ook de cookie.

De tijdsduur van een cookie

Voor de tijdsduur van een cookie hebben ze het wat ver gezocht volgens mij. Een minuut = 60 seconden, een uur = 3600 seconden en een dag van 24 uur = 86400 seconden. Met die gegevens geven we onze cookie een tijdsduur onder de volgende syntax :

setcookie("naam_cookie","waarde_cookie",vervaldatum)

Wil je nu een cookie plaatsen met een tijdsduur van :

* 1 uur is de syntax setcookie("bezoek","ja",time()+3600)
* 3 uur is de syntax setcookie("bezoek","ja",time()+3600*3)
* 1 dag is de syntax setcookie("bezoek","ja",time()+86400)
* 3 dagen is de syntax setcookie("bezoek","ja",time()+86400*3)

Om nu ons script aan te passen en onze cookie een levensduur van 5 uur te geven doen we dit als volgt :

<?php
setcookie("bezoek","ja",time()+3600*5);  
echo "<h1>Een bezoeker herkennen</h2>";
if (isset($HTTP_COOKIE_VARS["bezoek"]) && $HTTP_COOKIE_VARS["bezoek"]=="ja") {
    echo "Wij zijn blij om je <strong> terug </strong> te zien !";
}
else {
    echo "Wij zijn blij je hier te mogen zien !";
}
?>

Als je nu terug met mozilla je cookies gaat bekijken, zul je nu kunnen vast stellen dat er nu een tijd wordt vermeld bij ons cookie wanneer die vervalt.
Gewapend nu met de kennis van cookies en de tijd, kunnen we nu een poll plaatsen op onze site. We zorgen er met ons cookie voor, dat de bezoeker per dag van 24 uur maar één keer kan stemmen. Als hij terug wil stemmen zal hij dus over 24 uur moeten terug komen. Nu, dit systeem is niet waterdicht, de gebruiker kan de cookies verwijderen, een andere browser gebruiken enz... Dit is allemaal op te vangen, maar dit is kost voor andere lessen. We houden het hier simpel :-)

Een poll op onze site

We gaan nu aan de bezoekers van de site de mogelijkheid geven zich uit te spreken over de moeilijkheidsgraad van de cursus.

1. Zeer eenvoudig
2. Goed verstaanbaar
3. Ik begrijp er niets van

Als de bezoekers hebben gestemd, kunnen zij natuurlijk ook de uitslag van de poll bekijken, die we een gaan voorstellen in de vorm van een diagram.
Maak nu eerst een file result.txt aan met de inhoud 0,0,0, ( file moet voor iedereen lees- en schrijfbaar zijn )
Een poll aanmaken ( poll.php )

<?php
$submit=$_POST["submit"];
$antwoord=$_POST["antwoord"];
$gestemd=$HTTP_COOKIE_VARS["gestemd"];
if (isset($submit)) {
    setcookie("gestemd","ja",time()+86400);
}
echo "<h1> Onze poll </h1>\n";
echo "<h3> Wat vindt je van deze cursus PHP ? </h3>\n";
echo "<form action=\"$_SERVER[PHP_SELF]\" method=\"post\">\n";
echo "<input type=\"radio\" name=\"antwoord\" value=\"0\">\n";
echo "Zeer eenvoudig<br>\n";
echo "<input type=\"radio\" name=\"antwoord\" value=\"1\">\n";
echo "Goed verstaanbaar<br>\n";
echo "<input type=\"radio\" name=\"antwoord\" value=\"2\">\n";
echo "Ik begrijp er niets van<br><br>\n";
if (empty($submit) && empty($gestemd) && empty($antwoord)) {
    echo "<input name=\"submit\" type=\"submit\" value=\"Stem uitbrengen\"\n";
}
else {
    echo "<p> Bedankt voor jouw stem !</p>\n";
        if (isset($submit) && isset($antwoord) && empty($HTTP_COOKIE_VARS["gestemd"])) {
        $result="result.txt";
        $pointer=fopen($result,"r+");
        $poll=fread($pointer,filesize($result));
        $poll=trim($poll);
        $poll=explode(",",$poll);
        $poll[$antwoord]++;
        $poll=$poll[0] . "," . $poll[1] . "," . $poll[2] . ",";
        rewind($pointer);
        fputs($pointer,$poll);
        fclose($pointer);
        }
}
echo "</form>\n";
echo "<p>[ <a href=\"polluitslag.php\" target=\"_blank\">Bekijk de resultaten van de poll</a>]</p><br>\n";
?>

Uitleg over het script :

De eerste lijn : we gaan nu enkel en alleen een cookie plaatsen als de gebruiker op de submit knop geklikt heeft. We noemen de cookie "gestemd" en geven hem de waarde "ja" van zodra de gebruiker op de submit knop heeft gedrukt om zijn stem uit te brengen.

Het formulier : zijn gewone radio buttons die we de naam antwoord geven. De waarden zijn respectievelijk 0,1 en 2.

De empty variabele : we kijken of de gebruiker al op de submit knop heeft gedrukt en we kijken of er al een cookie bestaat dat ie al gestemd heeft en dat er geen enkel radiobutton is aangevinkt. Indien aan al die voorwaarden voldaan wordt (&&) tonen we de submit knop.
Indien één van die variabelen niet leeg is, betekent dit dat de gebruiker al gestemd heeft, en dan tonen we gewoon de tekst dat hij bedankt wordt voor zijn uitgebrachte stem.

Dan gaan we gewoon de aangemaakte file result.txt inlezen.

De functie explode()

Hier zien we nu een nieuwe en heel handige functie van PHP. We hebben nu de file result.txt ingelezen en die waarde toegekend aan $poll. De variabele $poll bevat dus de waarde "0,0,0". Met de functie explode, gaan we nu die gegevens inlezen in een hash. Je ziet dat de getallen worden gescheiden door een komma. Explode neem als argument aan, het scheidingsteken en de variabele. In ons geval dus een komma. explode(",",$poll). Hadden we nu de file result.txt geschreven als 0%0%0 dan hadden we explode gebruikt als $poll=explode("%",$poll).

De functie explode leest dus de variabele $poll in, van zodra hij een komma tegenkomt, plaats hij de waarde in $poll[0], leest terug verder tot hij terug een komma tegenkomt, plaats dan de waarde in $poll[1] enz... Als hij aan het einde van de file komt plaats hij dan de laatste waarde in $poll[2].
$poll[$antwoord]++ : als de gebruiker een radiobutton heeft aangevinkt wordt de waarde die aan de radiobutton werd toegekend met 1 verhoogd in de hash. Zoals gezegd, maakt PHP auto hashes van je formulier. Dus voor de eerste optie is dat antwoord[0] dan antwoord[1] enz..

Als de waarde verhoogd werd naargelang de uitgebrachte stem, moeten we de gegevens terug wegschrijven naar result.txt. We gebruiken hier terug de concatenation operator om onze gegevens weg te schrijven. $poll[0] . ",". We vergeten dus niet om ook de kommas terug op de goede plaats weg te schrijven. Na het wegschrijven als de gebruiker bijvoorbeeld voor optie 1 had gekozen, zal onze file result.txt er dan als "1,0,0" uitzien.
We hebben onze cookie een levensduurte gegeven van 24 uur, dus, als je nu terug de pagina herlaadt, zul je geen submit button meer te zien krijgen en kun je bijgevolg ook niet meer stemmen. Na 24 uur zal de cookie vervallen, en kun je dan opnieuw stemmen :-)

De uitslag van de poll.

Code voor polluitslag.php

<?php
echo "<h2>Uitslag van de poll</h2>\n";
$result="result.txt";
$pointer=fopen($result,"r");
$poll=fread($pointer,filesize($result));
fclose($pointer);
$poll=explode(",",$poll);
$totaal=$poll[0]+$poll[1]+$poll[2];
$barlengte=400;
$barlengte0=$poll[0]*$barlengte/$totaal;
$barlengte1=$poll[1]*$barlengte/$totaal;
$barlengte2=$poll[2]*$barlengte/$totaal;
$barlengte0=round($barlengte0);
$barlengte1=round($barlengte1);
$barlengte2=round($barlengte2);
## test # echo "$barlengte0 $barlengte1 $barlengte2 de verschillende lengten<br>\n";
echo "<h2><i>$totaal personen hebben reeds gestemd</i></h2>";
echo "<br>\n";
echo "<table>\n";
echo "<tr><td>Optie 1 = </td><td> Zeer eenvoudig</td></tr>\n";
echo "<tr><td>Optie 2 = </td><td> Goed verstaanbaar</td></tr>\n";
echo "<tr><td>Optie 3 = </td><td> Ik begrijp er niets van</td></tr>\n";
echo "</table><br><br>\n";
echo "<table border=\"0\">\n";
echo "<tr>";
echo "<td><strong>Optie 1</strong></td>\n";
echo "<td> </td><td width=\"$barlengte0\" bgcolor=\"red\"> </td><td> <i>$poll[0]</td></tr>\n";
echo "</table>\n";
echo "<table border=\"0\">\n";
echo "<tr>";
echo "<td><strong>Optie 2</strong></td>\n";
echo "<td> </td><td width=\"$barlengte1\" bgcolor=\"green\"> </td><td> <i>$poll[1]</td></tr>\n";
echo "</table>\n";
echo "<table border=\"0\">\n";
echo "<tr>";
echo "<td><strong>Optie 3</strong></td>\n";
echo "<td> </td><td width=\"$barlengte2\" bgcolor=\"blue\"> </td><td> <i>$poll[2]</td></tr>\n";
echo "</table>\n";
echo "<br><div align=\"center\"><h3>Je kunt nu dit venster sluiten</h3></div>\n";
?>

We moeten hier niet schrijven naar de file, dus openen met "r" volstaat hier. Met explode halen we terug onze waarden uit de file result.txt en kennen die toe aan $poll. We tellen nu de waarden tesamen zodat we het totaal krijgen van de mensen die al hebben gestemd, en plaatsen dit in de variabele $totaal.

Dan de diagram. We zorgen ervoor dat de diagrammen geen afmetingen aannemen dat de gebruiker moet scrollen met zijn browser naar rechts om alles te zien te krijgen. Ik definieer hier de maximumlengte op 400 pixels ($barlengte=400). Nu moeten we die lengten nog proportioneel weergeven. We doen dit door middel van onzichtbare tabellen. Om te voorkomen dat een staaf te lang wordt, delen we de barlengte(400) door het aantal uitgebrachte stemmen per categorie. We ronden de waarden af naar gehele waarden.

De waarden dat we hier verkrijgen gebruiken we om de breedte van de tabel te bepalen en vullen die met een lege spatie en geven we een achtergrondkleurtje mee. Na de staaf shrijven we dan nog eens het aantal stemmen in cijfers. Dit is dus een vrij simpel script, je kunt dat eventueel zelf uitbreiden en aanpassen.

En aktie !

Zoals gezegd in de vorige lessen, nu we de functie explode hebben leren kennen, kunnen we nu ook op heel eenvoudige wijze paswoorden uit een file lezen.

Maak nu een file pass.txt aan met volgende inhoud :

conny,7891,
serge,linux,
jan,debian,
dirk,3456,
ann,4567,
joni,5678,
bram,6789,

Onze passfile.php

<?php
echo "<h2>Paswoorden uit een bestand lezen</h2>\n";
echo "<form action=\"pascontrole.php\" method=\"post\"\n>";
echo "<p>Tik uw naam in : <input type=\"text\" name=\"naam\"></p>\n";
echo "<p>Tik uw paswoord in : <input type=\"password\" name=\"pas\"></p>\n";
echo "<p><input type=\"submit\" value=\"Paswoord versturen\"></p>\n";
echo "</form><br><hr>";
?>

Dit is dus een gewoon formulier om een paswoord in te geven. Na op Paswoorden versturen te hebben geklikt kom je op passcontrole.php terecht.

Code pascontrole.php

<?php
$file="pass.txt";
$naam=$_POST["naam"];
$pas=$_POST["pas"];
if (isset($naam) && $naam != "" && $pas != "") {
    $pointer=fopen($file,"r+");
    $paswoorden=fread($pointer,filesize($file));
    $paswoorden=explode(",",$paswoorden);
    $tel=count($paswoorden);
    for ($i=0;$i<$tel;$i++) {
        $filenaam=$paswoorden[$i];
        $filenaam=trim($filenaam);
        $i++;
        $filepass=$paswoorden[$i];
        $filepass=trim($filepass);
        if (($filenaam == $naam) && ($filepass == $pas)) {
                echo "<h2>correct paswoord !</h2><br>\n";
                $wachtwoord="oke";
        }
    }
    fclose($pointer);
}
if (isset($wachtwoord) && $wachtwoord == "oke") {
    }
else {
    echo "<h2>Jammer, maar helaas ... zonder paswoord geen toegang</h2><br>\n";
    }
?>

Het script spreekt voor zichzelf. Als het paswoord correct is, kun je dan onder "if (isset($wachtwoord) && $wachtwoord == "oke") { " toelaten wat je wilt.

En aktie !

Dit is hier als voorbeeld bedoeld. Het is niet aangeraden om paswoorden op te slaan in een tekstfile in klare taal op je server.
Je hebt al eens op een site gezien dat je kan in- en uitloggen. Met een cookie is dat rap voor elkaar te krijgen. Als je ingelogd bent zal de waarde van het cookie login zijn. Indien je uitgelogd bent, passen we die waarde dan ook aan, en geven we het cookie de waarde logout.

Het script cockie.php

1. <?php
2. koekje=$HTTP_COOKIE_VARS["inloggen"];
3. if(isset($_POST[inloggen])) {
4.    $situatie=$_POST[inloggen];
5.    switch ($situatie) {
6.        case "Inloggen":
7.            setcookie("inloggen","login",time()+3600);
8.            $koekje="login";
9.        break;
10.        case "Uitloggen":
11.            setcookie("inloggen","logout",time()+3600);
12.            $koekje="logout";
13.    }
14. }
15. ?>
16. <form action="<?php echo $_SERVER[PHP_SELF];?>" method="post">
17. <input type="submit" name="inloggen" value="Inloggen"><br><br>
18. <input type="submit" name="inloggen" value="Uitloggen"><br><br>
19. </form>
20. <?php
21. switch($koekje) {
22.    case "login" :
23.        echo "Je bent nu ingelogd<br>\n";
24.    break;
25.    default:
26.        echo "Je bent momenteel niet ingelogd<br>\n";
27. }
28. ?>

Op regel 2 vragen we de waarde van het cookie op.
Van regel 16 tot 19 maken we gewoon een formulier aan waarop we op een submit button kunnen klikken met de naam inloggen, en waarvan de waarde zal verschillen naargelang welke knop je indrukt.
Op regel 3 gaan we nu na of er op een knop werd gedrukt of niet.
Indien er op een knop werd gedrukt, gaan we de waarde van die submit knop opslaan in de variabele $situatie (regel 4).
Op regel 5 maken we nu gebruik van een nieuwe functie van php, namelijk de  switch() functie. Tussen de haakjes plaatsen we de variabele $situatie. Deze variabele kan nu in ons voorbeeld 2 waarden bevatten, namelijk Inloggen of Uitloggen. Die waarden worden een case genoemd.  Je mag al dan niet een default sectie instellen, dat wil zeggen, als er geen enkele case voldoet aan de voorwaarden, wordt de default waarde aangenomen die je zelf specifieert in de default sectie.

Aangezien we hier maar 2 waarden hebben, zal als de waarde niet Inloggen is, de variabele $situatie de waarde Uitloggen bevatten.
Als de case Inloggen is, dan gaan we een cookie plaatsen met de waarde login , in ieder ander geval plaatsen we een cookie met de waarde logout.
Per sectie geven we dan nog eens de variabele $koekje de waarde van login of logout. Waarom ? Cookies werken enkel indien je de pagina vernieuwd.
Op regel 2 hebben we de inhoud van ons cookie opgevraagd, vanaf  regel 22 gaan we de waarde van het cookie na. Die code wordt dus steeds getoond. Als de waarde van het cookie login is, gaat deze switch je vertellen dat je ingelogd bent. Als je nu op de knop Uitloggen klikt, wordt de pagina herladen, ons cookie heeft nu nog steeds de waarde van login. Deze wordt slechts veranderd in onze isset() functie. Daarom geven we onze variabele $koekje ook de waarde van onze case.

Probeer maar eens om regel 8 en 12 in commentaar te plaatsen en run het script dan eens opnieuw. Je gaat dan merken dat je tweemaal op de knop Inloggen of Uitloggen moet klikken vooraleer je de juiste melding krijgt.

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