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

Hoofdstuk 19. PHP en MySQL

19.6. Arrays, require, sessies, datum/tijd, functies, enz.

  19.6.1. Een array maken

Een array is een geindexeerde rij getallen of strings.
Als je een array $b hebt, dan is $b[0] het eerste element van de rij, $b[1] is de tweede van de rij, enz.
Met count($b) wordt in dat geval bedoeld: het aantal elementen van die rij.

Je kunt op verschillende manieren waarden toekennen aan een array:
  • De eerste manier:
    $b[0] = "Jan";
    $b[1] = "Piet";
    $b[2] = "Klaas";

  • De tweede manier:
    $b = array ("Jan" , "Piet" , "Klaas");

    Nog steeds geldt dan $b[0] = "Jan" enz.

  • De derde manier:
    $b[ ] = "Jan";
    $b[ ] = "Piet";
    $b[ ] = "Klaas";

    Ook nu geldt $b[0] = "Jan" enz.
    Als je een nieuw element, zonder index, toevoegt aan de rij, dan wordt het achteraan de rij toegevoegd.

  • De vierde manier:
    $b = array ("5"=>"Jan" ,"6"=> "Piet" ,"7"=> "Klaas");

    Dan geldt $b["5"] = "Jan" enz.

  • De vijfde manier:
    $namen = "Jan,Piet,Klaas"; $b = explode("," , $namen);

    Dan geldt $b[0] = "Jan" enz.
    Je moet bij explode aangeven wat het scheidingsteken is (het eerste argument tussen de haakjes, achter explode). Dat is meestal een komma of een spatie.
    Explode wordt vaak gebruikt als de elementen van de rij al achterelkaar in een variabele zijn opgeslagen.
    (het omgekeerde kan ook: array-waarden achterelkaar zetten gescheiden door een bepaald teken, en dat opslaan in een variabele. Dat kan m.b.v. implode)

    Hashes
    Een array met strings als sleutelwaarden

  • Je hoeft voor de index (of sleutelwaarden) niet beslist getallen te gebruiken, het kan ook met strings als sleutelwaarden (of hashes), bijv:

    $cijfers["Jaap"] = "76";
    $cijfers["Petra"] = "81";
    $cijfers["Karin"] = "65";

  • Dit kan ook zo:

    $cijfers = array ("Jaap"=>"76" ,"Petra"=> "81" ,"Karin"=> "65");

    Nog steeds geldt dan $cijfers["Jaap"] = "76" enz.

    Formulier
    Een array gemaakt m.b.v. het verwerken van een formulier

  • Als je een formulier in een html-document hebt, waarin gegevens worden opgevraagd, dan worden die gegevens na verwerking door een php-script automatisch in een array gezet, en die array heeft de naam $_POST (tenminste als de POST-methode werd gebruikt)
    Als je bijv. het formulier met de volgende code maakt (zie hoofdstuk 16.7):

    Voornaam:    <input type="text" name="voornaam" size="20" > <br>
    Achternaam: <input type="text" name="achternaam" size="20" ><br>
    Wachtwoord: <input type="password" name="wachtwoord" size="20" ><br>
    <input type="checkbox" name="lcleerling" value="Ja"> Ik ben een leerling van het Lauwers College <br>
    <input type="checkbox" name="hobby" value="computer"> Mijn hobby is computeren <br>
    <input type="radio" name= "geslacht" value checked="man."> man <br>
    <input type="radio" name= "geslacht" value= "vrouw."> vrouw <br>
    Wat is je leeftijd <br>
    <option value="16min">16-</option>
    <option value="16">16</option>
    <option value="17">17</option>
    <option value="18">18</option>
    <option value="18plus">18+</option>
    </select> <br>
    Opmerkingen:<br>
    <textarea name="commentaar" rows=5 cols=30 > Dit staat er al </textarea> <br>
    <input type="submit" value="Verstuur dit formulier" > <br>

    </form>

    • Als in het tekstvenster voor de voornaam Piet wordt ingevuld dan krijgt na verwerking $_POST['voornaam'] de waarde "Piet"
    • Als het aankruisvak (checkbox) voor hobby wordt aangevinkt krijgt $_POST['hobby'] de waarde "computer" , en als het niet is aangevinkt krijgt $_POST['hobby'] geen waarde.
    • Als de radiobutton voor vrouw is aangevinkt dan krijgt $_POST['geslacht'] de waarde "vrouw" en anders de waarde "man"
    • Als in het pulldownmenu voor de leeftijd bijvoorbeeld 17 is uitgekozen dan krijgt $_POST['leeftijd'] de waarde "17"
    • Als er test is ingetypt in het opmerkingen-venster dan krijgt $_POST['commentaar'] de waarde "test"
    • Als er geklikt is op de verstuur_knop dan krijgt $_POST['submit'] de boolean-waarde true

  19.6.2. Meer array-commando's

Stel dat je een array op de volgende manier hebt gemaakt:
$b = array ("0"=>"Jan" ,"1"=> "Piet" ,"2"=> "Klaas");

  • Met count($b) wordt het aantal elementen van de rij $b bedoeld, dus count($b) krijgt in dit geval de waarde 3.

  • Na de opdracht sort($b); zijn de waarden van de rij gesorteerd, er geldt daarna dus:
    $b[0]="Jan", $b[1]="Klaas" en $b[2]="Piet"

  • Na de opdracht rsort($b); zijn de waarden van de rij in omgekeerde volgorde gesorteerd, er geldt daarna dus:
    $b[0]="Piet", $b[1]="Klaas" en $b[2]="Jan"

Stel dat je een array op de volgende manier hebt gemaakt:
$cijfers = array ("Jaap"=>"76" ,"Petra"=> "81" ,"Karin"=> "65");
Dan geldt: $cijfers["Jaap"] = "76", $cijfers["Petra"] = "81"', en $cijfers["Karin"] = "65"

  • Na de opdracht asort($b); zijn de waarden van de rij gesorteerd en blijven de waarden bij de juiste sleutelwaarden horen.
    De volgorde waarin ze dan in het geheugen staan is als volgt:
    (en als je ze afdrukt m.b.v. each zullen ze in de volgorde zoals hieronder worden afgedrukt)
    $cijfers["Karin"] = "65", $cijfers["Jaap"] = "76", $cijfers["Petra"] = "81"

  • Na de opdracht arsort($b); zijn de waarden van de rij in omgekeerde volgorde gesorteerd en blijven de waarden bij de juiste sleutelwaarden horen. De volgorde waarin ze dan in het geheugen staan is als volgt:
    $cijfers["Petra"] = "81", $cijfers["Jaap"] = "76", $cijfers["Karin"] = "65"

  • Na de opdracht ksort($b); zijn de sleutelwaarden van de rij gesorteerd en blijven de waarden bij de juiste sleutelwaarden horen. De volgorde waarin ze dan in het geheugen staan is als volgt:
    $cijfers["Jaap"] = "76", $cijfers["Karin"] = "65", $cijfers["Petra"] = "81"

  • Na de opdracht krsort($b); zijn de sleutelwaarden van de rij in omgekeerde volgorde gesorteerd en blijven de waarden bij de juiste sleutelwaarden horen. De volgorde waarin ze dan in het geheugen staan is als volgt:
    $cijfers["Petra"] = "81", $cijfers["Karin"] = "65", $cijfers["Jaap"] = "76"
Na de opdracht reset($b); wordt de aanwijzer teruggezet op het eerste element van de rij.
Elke keer als er een lus is doorlopen (bijv. bij een sorteeropdracht, of een foreach-opdracht, of een each-opdracht) moet dat gebeuren omdat de aanwijzer na een lus op het laatste element van de rij staat.

Met de opdracht $array3 = array_merge ($array1, $array2); worden de twee arrays $array1 en $array2 samengevoegd tot een nieuwe array.

Met de opdracht $t = implode ("," , $cijfers); worden de waarden van de array $cijfer aan elkaar vastgeplakt, gescheiden door een komma, en in de variabele $t vastgelegd (dat wordt dus een string).
Wat het scheidingsteken wordt kun je zelf bepalen, dat is het eerste argument tussen de haakjes achter implode.
Als $cijfers de array is van de cijfers hierboven, dan krijgt $t de inhoud 76,81,65

  19.6.3. Alle elementen van een rij afdrukken

Stel dat je een array op de volgende manier hebt gemaakt:
$b = array ("0"=>"Jan" ,"1"=> "Piet" ,"2"=> "Klaas");

Dan kun je ze op de volgende manier allemaal afdrukken:

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

Als je een array op de volgende manier hebt gemaakt:
$cijfers = array ("Jaap"=>"76" ,"Petra"=> "81" ,"Karin"=> "65");

dan kun je bovenstaande manier niet gebruiken voor het afdrukken, omdat de index nu niet uit getallen bestaat.
Er zijn verschillende manieren waarop je ze dan toch m.b.v. een herhalingslus kunt afdrukken:
  • Als je een array met strings als sleutelwaarden gebruikt, dan kun je handig gebruik maken van each
    Als de array in $cijfers is opgeslagen, dan geeft each($cijfers) de eerste keer dat die opdracht wordt uitgevoerd het eerste element van de array, de tweede keer het tweede element, enz.
    En daarbij kun je de sleutel opvragen, en de waarde.
    Als $t = each($cijfers) dan geeft $t[key] de sleutelwaarde, en $t[value] de waarde, dus $t is dan een array dat uit twee elementen bestaat, nl. $t[key] $t[value]

    Je kunt de waarden van de rij dus laten afdrukken m.b.v. de volgende PHP-code:

    for ($n = 0; $n < count($b); $n++)
    {
          $t = each($cijfers);
          print ("De waarde die bij de sleutel $t[key] hoort is $t[value] <br> ");
    }

  • M.b.v. het commando list kun je ook de sleutel en de waarde van het element van een array opvragen.
    Als je het volgende commando geeft: list ($sleutel, $waarde) = each($cijfers) dan geeft $sleutel de sleutelwaarde, en $waarde de waarde. Je mag de namen van de variabelen, die hier $sleutel en $waarde zijn genoemd, zelf bedenken. Maar de eerste is steeds de naam van de variabele voor de sleutel, en de tweede die voor de waarde.

    Je kunt de waarden van de rij dus ook laten afdrukken m.b.v. de volgende PHP-code:

    for ($n = 0; $n < count($b); $n++)
    {
          list ($sleutel, $waarde) = each($cijfers);
          print ("De waarde die bij de sleutel $sleutel hoort is $waarde <br> ");
    }

  • Je kunt ook gebruik maken van foreach
    Dan worden alle waarden van de array doorlopen.
    Er zijn twee versies van foreach, een lange versie en een korte versie.
    In de lange versie foreach ($cijfers as $s => $w), worden de sleutel en de waarde van het element van de rij $cijfers, dat aan de beurt is, beide in een variabele opgeslagen, in dit geval in de variabelen $s en $w. De namen van die variabelen mag je zelf bedenken, maar de eerste (na as ) is steeds de naam van de variabele voor de sleutel, en de tweede (na => ) die voor de waarde.

    Als je de volgende PHP-code hebt:

    foreach ($cijfers as $sleutel => $waarde) { print ("\$cijfers[$sleutel] = $waarde<br>\n");}

    dan worden de waarden m.b.v. de bijbehorende sleutel afgedrukt.

    En in de korte versie foreach ($cijfers as $w), wordt alleen de waarde van het element van de rij in een variabele opgeslagen, in dit geval in de variabele $w.

    Met de volgende code:

    foreach ($cijfers as $waarde) { print ("$waarde<br>\n");}

    worden dus alleen de waarden afgedrukt (i.p.v. $waarde mag je ook een andere naam voor de variabele bedenken).
Formulier
Alle ingevulde waarden van een formulier afdrukken m.b.v. een herhalingslus

Als het formulier van paragraaf 1 hierboven is verwerkt dan kun je alle ingevulde waarden op de volgende manier afdrukken.

if (isset($submit))
{
  foreach($_POST as $sleutel => $waarde)
     { print ("$sleutel=$waarde <br>\n");}
}

In plaats van foreach($_POST as $sleutel => $waarde) kun je ook gebruik maken van list ($sleutel, $waarde) = each($_POST)
De functie each( ) haalt de sleutelwaarde en de waarde, die aan de beurt is, uit de array, en de functie list( ) plaatst die sleutelwaarde en die waarde vervolgens in de PHP-variabelen $sleutel en $waarde.
M.b.v. de opdracht while (list ($sleutel, $waarde) = each($_POST)) wordt de lus doorlopen totdat alle elementen van de array $_POST aan de beurt zijn geweest:

while (list ($naamveld, $waarde) = each($_POST))
{ print("$naamveld $waarde <br> \n"); }

SQL-tabel
Alle rijen van een tabel, die de uitkomst is van een sql-query, afdrukken m.b.v. een herhalingslus

Als je gegevens uit een database wilt tonen (zie hoofdstuk 9 van PHP) dan kun je de resultaat-tabel, die het resultaat is van een SQL-query, op de volgende manier afdrukken.
$result = mysql_db_query($dbnaam,$sql,$verbinding);
print ("<table border=1 ><tr>\n");

while ($row=mysql_fetch_row($result))
{
        print ("<tr>");
        foreach($row as $veldnaam => $kolomwaarde)
        { print ("<td>$kolomwaarde</td>"); }
        print ("</tr>\n");
}
print ("</table>");

  19.6.4. De funkties require( ) en include( )

Met de funktie require( ) kun je code uit een aparte file invoegen in een php-document. Dat is handig voor code die je steeds gebruikt en die steeds hetzelfde is.
Als je in elk php-document hetzelfde menu wilt hebben, dan kan dat m.b.v. require( ) worden ingevoegd. Of de kop van je document kun je op de volgende manier invoegen.
De kop van een php-document is bijvoorbeeld steeds (tenminste als je steeds dezelfde titel gebruikt, en het stylesheet met de naam style.css):

<html>
<head>
<title> Cursus PHP </title>
<link REL="stylesheet" type="text/css" HREF="style.css">
</head>
<body> Hier begint de inhoud

Als je deze code opslaat in een bestand met de naam kop.php dan kun je in alle andere documenten require("kop.php") gebruiken, dan wordt op de plaats waar je het commando gebruikt bovenstaande code ingevoegd.
Je kunt dan dus je php-documenten als volgt beginnen:

<?php         require("kop.php");         ?>
Hier begint de inhoud

Je kunt ook include(filenaam) gebruiken, maar dat wordt meestal in een if-opdracht gebruikt.
Bij het gebruik van require(filenaam) zal altijd de code van de file worden ingevoegd, maar bij het gebruik van include(filenaam) zal de code van de file alleen worden ingevoegd als aan de voorwaarde voldaan is (we gaan er dus vanuit dat include(filenaam) door een if-constructie wordt voorafgegaan).
Dat kan dus als volgt (denk er om dat na een include-file php altijd afgesloten moet worden, en opnieuw gestart) :

if   (voorwaarde)
      { include($file); }
else
      {
      ....................
      }
?>

  19.6.5. Sessies

M.b.v. de array $_POST kan de inhoud van variabelen worden doorgegeven vanuit een formulier naar een PHP-script.
Maar zodra je daarna een andere webpagina opvraagt, is de inhoud van de variabelen weg (het HTTP-protocol voor webservers is "connectionless").

Wanneer je wilt dat de webserver de waarden van de doorgegeven variabelen 'onthoudt' dan moet je gebruik maken van sessies (of 'sessions').
De waarden van variabelen worden binnen een sessie 'onthouden' in de array $_SESSION.
Stel je voor dat een gebruikersnaam en een wachtwoord zijn ingevoerd, en dat die in het script dat het formulier verwerkt worden vastgelegd in de variabelen $_POST['naam'] en $_POST['wachtwoord']
Dan moeten de waarden daarvan worden overgezet naar de array $_SESSION, en dat kan m.b.v. de volgende opdrachten:

$_SESSION['naam'] = $_POST['naam'];
$_SESSION['wachtwoord'] = $_POST['wachtwoord'];

Verder is het zo dat een php-script, waarin variabelen uit een sessie worden gebruikt, moet beginnen met de volgende regels:

<?php
session_start();

Als een gebruiker heeft ingelogd met zijn gebruikersnaam en wachtwoord, en de naam en het wachtwoord zijn vastgelegd m.b.v. de array $_SESSION, dan hoeft diegene niet steeds weer in te loggen als hij een andere pagina van de site bezoekt waarvoor ook de gebruikersnaam en het wachtwoord vereist is.
Als het script van zo'n pagina dan begint met de volgende code, dan wordt er dus niet opnieuw naar de inloggevens gevraagd als die al zijn ingevoerd:

<?php
session_start();
require("kop.php");
if ($_SESSION['naam'] and $_SESSION['wachtwoord'])
{
      $naam = $_SESSION['naam'];
      $wachtwoord = $_SESSION['wachtwoord'];
      .........................
      .........................
}
else
{
      print ("Je bent nog niet ingelogd. Klik op <a href='inlogpagina.htm'>Inloggen</a> om in te loggen.");
?>
</body> </html>

Alle informatie over een sessie wordt standaard bewaard in de map C:\tmp (Dat kun je eventueel veranderen in het ini-bestand van PHP)
Om te kunnen werken met sessies moet je die map dus eerst aanmaken.
De sessiegegevens worden standaard 24 minuten bewaard, daarna worden ze vernietigd.
Je kunt er ook m.b.v. php-code voor zorgen dat die gegevens worden vernietigd, de opdrachten daarvoor zijn:

session_unset();
session_destroy();

  19.6.6. Datum en tijd

De functie date(   ) levert gegevens over de datum en de tijd, afhankelijk van wat er tussen de haakjes staat.
Als het bijvoorbeeld 4 februari 2007 is, dan zorgt de opdracht $datum = date("j-n-Y"); ervoor dat er geldt: $datum = "4-2-2006"
De j achter date zorgt ervoor dat de dag (in cijfers) wordt afgedrukt, dus 4 (had je een d i.p.v. een j gebruikt dan kwam er 04)
De n achter date zorgt ervoor dat de maand (in cijfers) wordt afgedrukt, dus 2 (had je een m i.p.v. een n gebruikt dan kwam er 02)
De Y achter date zorgt ervoor dat het jaar wordt afgedrukt, dus 2007 (had je een y i.p.v. een Y gebruikt dan kwam er 07)
De streepjes tussen de letters achter date hebben tot gevolg dat er een streepje tussen de dag en de maand komt, en ook tussen de maand en het jaar.

De opdracht $datum = date("jS of F Y"); heeft tot gevolg dat er geldt: $datum = "4th of Febuary 2006"
De j achter date zorgt ervoor dat de dag (in cijfers) wordt afgedrukt en de S achter de j heeft tot gevolg dat de engelse notatie wordt gebruikt, dus , dus 4th
De F achter date zorgt ervoor dat de maand (in letters, altijd in het engels) wordt afgedrukt, dus Febuary
Verder komt het woordje of tussen de dag en de maand, omdat dat ook tussen de j en de F (tuusen de haakjes achter date) staat

De opdracht $tijd = date("H:i:s"); heeft 's avonds 20 voor 8 tot gevolg dat er geldt: $tijd = 19 : 40 : 00

  19.6.7. Email m.b.v. PHP

Met behulp van PHP kun je, zonder een email-programma te gebruiken, een emailtje versturen. Dit gaat m.b.v. de functie mail().
De syntax van mail ( ) is als volgt:
$verzonden = mail("begunstigde", "onderwerp", "bericht", "headers");

Het laatste argument, de headers, kan van alles bevatten, maar je mag het ook weglaten.
Een voorbeeld wat er in de string $headers kan staan:
$headers = "From: misterX@domein.nl\r\n"."Cc: persoon@domein.nl\r\n"."BCc: persoon2@domein.nl\r\n"; Als de verzending van het emailtje goed gaat dan krijgt $verzonden de waarde true, en anders false.

Als je dit uitprobeert op je eigen computer (als je bijv. WAMP hebt geïnstalleerd) dan moet je zelf ook een mailserver installeren. Of je maakt gebruik van de mailserver van je provider (de smtp-server), maar dan moet je wel php.ini aanpassen.
Dat doe je door op het wampserver icoontje te klikken, voor Config files te kiezen en dan op php.ini te klikken.
In het bestand php.ini zoek je naar :
[mail function]
; For Win32 only.
SMTP = localhost

Plaats een puntkomma ( ; ) voor de regel SMTP = localhost. (Daardoor wordt deze regel als commentaar beschouwd)
En voeg een nieuwe regel, eronder, toe met daarop zoiets als: SMTP = smtp.hetnet.nl (de smtp-server van je provider)
Sla het op, en start wampserver opnieuw.

Je kunt dan een emailtje versturen m.b.v. het volgende script:
(natuurlijk kun je ook een formulier maken waarmee het emailtje ingevoerd kan worden, en een script maken (zoals hieronder) dat het formulier verwerkt en er voor zorgt dat het emailtje wordt verstuurd)

$mailadres = "rjvdbeek@hotmail.com";
$subject = "testbericht";
$bericht = "Dit is een testbericht om te kijken of emailen m.b.v. PHP wel werkt";
$afzender = "From: Mister X@hetnet.nl\r\n";
if (mail("$mailadres", "$subject", "$bericht", "$afzender"))
{ print ("Het emailtje is verstuurd"); }
else
{ print ("Het bericht kon niet worden verzonden"); }

  19.6.8. Cookies

Cookies zijn gewone tekstbestandjes waarin vanuit een website m.b.v. PHP gegevens geschreven kunnen worden.
Als je later diezelfde website nog eens bezoekt kan dit bestandje m.b.v. PHP worden ingelezen, en aan de hand daarvan kan er op een bepaalde manier gereageerd worden.

Cookies worden geplaatst door middel van de functie setcookie().
Tussen de haakjes komen de zogenaamde argumenten. Je kunt maximaal zes argumenten tussen de haakjes zetten, maar de laatste drie worden meestal weggelaten.

De syntax is:
setcookie("naam","waarde","verlooptijd","pad","domein","secure");

  • Naam
    Elke cookie moet een naam hebben waaraan hij te herkennen is, het eerste argument is dus de naam.
  • Waarde
    De waarde die je wilt opslaan in je cookie, daar gaat het eigenlijk om.
    Als je dit weglaat, als je maar één argument gebruikt (dus de naam) dan wordt de cookie met die naam gewist.
  • Verlooptijd
    De tijd waarop de cookie verloopt. Dat is altijd de huidige tijd plus een aantal seconden, en dat wordt altijd op de volgende manier aangegeven: time() + aantalseconden.
    Als je als derde argument bijvoorbeeld time( ) + 3600*24*365 zet, dan blijft de cookie een jaar geldig en daarna is hij verlopen.
    Geef je cookies altijd een verlooptijd mee, anders ziet PHP het als een session-cookie en dan wordt de cookie gewist als de browser wordt afgesloten.
  • Pad
    Het pad van de plaats van de cookie, wordt meestal leeggelaten.
  • Domein
    Meestal leeg, in dat geval moet de domeinopgave overeenkomen met het domein waaronder de webserver valt.
  • Secure
    Dit kan alleen 0 of 1 zijn. Standaard is het 0, bij een beveiligde verbinding (HTTPS) moet het de waarde 1 krijgen.
Denk er goed om dat als je de opdracht setcookie( ) gebruikt, dat de eerste opdracht in het php-document moet zijn.
Als er output op het scherm verschijnt voor de cookie( )-opdracht moet worden uitgevoerd dan krijg je de volgende foutmelding:
Cannot send headers, headers already sent...

Een cookie verwijder je door alleen de naam als argument te gebruiken, dus m.b.v. de opdracht setcookie("cookienaam");

Cookies lezen
Cookies lezen gebeurt door middel van de variabele $HTTP_COOKIE_VARS.
Dat is een array met alle cookies erin.

Stel dat bij een bezoek aan een site een cookie geplaatst is met de naam Leeftijd, en met de waarde 25.
Dan kunnen die gegevens op de volgende manier worden opgehaald:
$l = $HTTP_COOKIE_VARS["Leeftijd"] ;
De variabele $l krijgt dan de inhoud 25, dus de waarde die is opgeslagen in de cookie.

Kijken of een cookie bestaat doen we met de functie isset( ) (zie het volgende voorbeeld).

Voorbeeld:
Stel dat de bezoekers van je site moeten inloggen, en dat ze daarbij zelf een gebruikersnaam en wachtwoord mogen bedenken.
Dan kun je er voor zorgen dat de computer die gebruikersnaam en wachtwoord opslaat in een cookie, en dan hoeven die bij een volgend bezoek niet te worden ingevoerd.

De gebruikersnaam en het wachtwoord worden m.bv. een formulier opgevraagd, en de eerste regels van het verwerkende script zijn dan bijvoorbeeld als volgt:

<?php
$gebruiker = $_POST['naam'];
setcookie ("naam","$gebruiker",time( ) + 3600*24*7);
$ww = $_POST['wachtwoord'];
setcookie("wachtwoord","$ww",time( ) + 3600*24*7);
?>

Hierbij worden twee cookies opgeslagen: de cookies naam en wachtwoord, met de variabelen $gebruiker en $ww erin.

M.b.v. het volgende script worden de gebruikersnaam en het wachtwoord ingelezen:

if (isset($HTTP_COOKIE_VARS["naam"]) && isset($HTTP_COOKIE_VARS["wachtwoord"]))
{
        $gebruiker = $HTTP_COOKIE_VARS["naam"];
        $ww = $HTTP_COOKIE_VARS["wachtwoord"];
        print ("Je gebruikersnaam is $gebruiker");
        print ("en je wachtwoord is $ww");
}
else
{
        echo "De gegevens kunnen niet in de cookies gevonden worden!";
}
?>

Hij kijkt eerst of de cookie 'naam' en de cookie 'wachtwoord' wel bestaan.
Als ze bestaan worden de gebruikersnaam en het wachtwoord afgedrukt.

  19.6.9. Functies

Als je vaak hetzelfde stukje programma-code gebruikt is het handig er een functie van te maken.
Je kunt dat stukje code dan een naam geven, en je kunt het ook alleen met die naam "aanroepen".
De syntax voor het maken van een functie is als volgt:
function functienaam( )
{
        opdrachten
}

We maken een functie voor het maken van een wachtwoord.

<?php
function maakwachtwoord()
{
        $startwoord = "test";
        $gecodeerdetekst = md5($startwoord);
        $begin = rand (0, 32-9);
        $wachtwoord = substr($gecodeerdetekst, $begin, 8);
        print ("De gecodeerde tekst is: $gecodeerdetekst <br>");
        print ("Er wordt begonnen met teken nummer: $begin<br>");
        print ("Het wachtwoord is: $wachtwoord<br>");
}

maakwachtwoord();
?>

Toelichting:
Eerst wordt de functie maakwachtwoord gemaakt.
De opdracht $gecodeerdetekst = md5($startwoord); heeft tot gevolg dat de inhoud van $startwoord (dat is hier "test") gecodeerd wordt, dat levert altijd een string op van 32 tekens.
De opdracht $begin = rand (0, 32-9); heeft tot gevolg dat $begin de waarde van een willekeurig getal tussen 0 en 23 krijgt.
De opdracht $wachtwoord = substr($gecodeerdetekst, $begin, 8); heeft tot gevolg dat $wachtwoord de inhoud krijgt van een substring met lengte 8 uit de gecodeerde string, en wel het gedeelte dat begint bij teken nummer $begin.
Dus als $begin de waarde 18 heeft bestaat $wachtwoord uit het 18de t/m het 25ste teken.
Daarna worden de waarden van de variabelen nog afgedrukt.

In de laatste regel voor ?> wordt de functie aangeroepen, en dan zie je dat het wachtwoord (en ook de gecodeerde tekst en get startnummer) wordt afgedrukt.

Functies met parameters en een terugkeerwaarde.
We kunnen de wachtwoord-functie ook anders schrijven.
We kunnen de functie parameters meegeven. Die moet je dan tussen de haakjes, achter de functienaam zetten.
En je kunt er voor zorgen dat de functie een waarde oplevert, die je na het aanroepen van de functie kunt gebruiken.

Bij de vorige functie was het startwoord steeds test, en het wachtwoord bestond steeds uit 8 tekens.
Als je de functie op de volgende manier programmeert kun je het startwoord en de lengte van het wachtwoord zelf bepalen.


<?php
function maakwachtwoord($startwoord, $lengte)
{
        $gecodeerdetekst = md5($startwoord);
        $begin = rand (0, 32- $lengte - 1);
        $wachtwoord = substr($gecodeerdetekst, $begin, $lengte);
        return $wachtwoord;
}

$ww = maakwachtwoord("nieuwetest", 10);
print ("$ww<br>");
print ("***".$wachtwoord."xxx");
?>

Toelichting:
De functie wordt nu op een andere manier aangeroepen, het gaat nu met: $ww = maakwachtwoord("nieuwetest", 10);
$ww krijgt hierdoor de inhoud van de variabele die in de functiedefinitie achter return staat, dus het gemaakte wachtwoord.

Verder staan er twee dingen tussen de haakjes achter maakwachtwoord, namelijk "nieuwetest" en 10
Dat heeft tot gevolg dat, als de functie wordt uitgevoerd, de variabele $startwoord als inhoud "nieuwetest" krijgt, en de variabele $begin krijgt als waarde 10
Het startwoord, en het beginnummer kun je dus nu buiten de functie bepalen.

Verder kun je het wachtwoord nu ook buiten de functie om gebruiken, omdat het m.b.v. return doorgegeven wordt.
De andere variabelen, die in de functie gebruikt worden, worden niet doorgegeven.
Dat merk je aan de laatste regels:
De opdracht print ("$ww<br>"); heeft wel tot gevolg dat het nieuwe wachtwoord wordt afgedrukt.
Maar bij de opdracht print ("***".$wachtwoord."xxx"); wordt alleen ***xxx afgedrukt, en geen wachtwoord, de variabele wachtwoord is buiten de functie zijn waarde weer kwijt!

Als je dat niet wilt, dan kun je dat voorkomen door voor de definitie van de functie de opdracht global $wachtwoord; te zetten. In dat geval heeft de variabele $wachtwoord in de functie en erbuiten dezelfde inhoud.