Op internet zijn er al erg veel tutorials te vinden over het verkrijgen van je eigen gastenboek.
Waarom moet ik er dan zonodig nog een extra maken?
Omdat het de bedoeling is dat deze tut heel anders gaat worden dan de meeste tuts.
Vaak bestaat een tut gewoon uit het kopiëren en plakken van de code, hier en daar nog een paar dingen aanpassen en je hebt je eigen gastenboek.
Het grote nadeel hiervan is echter dat je dan geen idee hebt wat voor code je hebt gebruikt, en hoe de code werkt.
Ik ga in deze tut dus duidelijk uitleggen waar iedere functie voor is, zo zul je begrijpen waarom het werkt zoals het werkt.
Schrik niet af door de lengte van de tut, er zijn ook redelijk veel dingen steeds hetzelfde, en het zal op een bepaald moment dan ook redelijk snel gaan;)
De functies die ik gebruik zijn klikbaar, dan krijg je uitleg over die bepaalde functie via de site PHP.net
Ik zal het in meerdere delen gaan beschrijven. Ik deel het zo in dat ieder deel één bestand is en nog een deel voor het maken van de tabel waar de gegevens in moeten komen. De volgende delen zul je tegenkomen:
Je kunt dit het makkelijkste doen via phpMyAdmin, DirectAdmin, of wat je dan ook hebt.
CREATE TABLE `gastenboek` (
Het maken van een tabel die gastenboek heet.
`id` INT( 3 ) NOT NULL AUTO_INCREMENT ,
AUTO_INCREMENT is hier erg belangrijk, dit betekent dat hij iedere keer 1 erbij optelt. Met een maximum van 3 cijfers (dus tot de 999).
`naam` VARCHAR( 30 ) NOT NULL ,
`tijd` VARCHAR( 10 ) NOT NULL ,
`datum` VARCHAR( 10) NOT NULL ,
`bericht` TEXT NOT NULL ,
PRIMARY KEY ( `id` )
) TYPE = MYISAM ;
PRIMARY KEY ( `id` ) is ook belangrijk, dit geeft aan dat id uniek moet zijn. Ik wil me niet echt toespitsen op het maken van een tabel, dus je kunt het beste hier kijken om te weten te komen wat de rest betekent.
CREATE TABLE `gastenboek` (
`id` INT( 3 ) NOT NULL AUTO_INCREMENT ,
`naam` VARCHAR( 30 ) NOT NULL ,
`tijd` VARCHAR( 10 ) NOT NULL ,
`datum` VARCHAR( 10) NOT NULL ,
`bericht` TEXT NOT NULL ,
PRIMARY KEY ( `id` )
) TYPE = MYISAM ;
Dit kun je dus via phpMyAdmin met een SQL opdracht doen. Maar het kan ook op andere manieren.
We werken veel met variabelen. En veel van deze variabelen komen in meerdere bestanden terug. Daarom kies ik ervoor om veel variabelen in dit bestand te definiëren, zo blijft het overzichtelijk en kun je ook gemakkelijk dingen veranderen. Ik zal tijdens het maken van andere bestanden hier steeds iets aan toevoegen.
Iedere keer als we informatie opvragen uit de database, of als we nieuwe informatie toe willen voegen, moeten we ervoor zorgen dat we een verbinding hebben met de database. Dit moeten we vaak doen, daarom zet ik dit in een apart bestand.
<?php
// connect.php
// verbinding maken met de database
Even het begin van het bestand, en ook een korte uitleg waar het bestand voor dient.
include("db.php");
In db.php worden enkele variabelen als $host en $user bepaald, we moeten de functie include() gebruiken. Deze variabelen moeten we er nog wel in gaan zetten
$connection = mysql_connect($host, $user, $wachtwoord)
or die ("Kan geen verbinding met de server maken, omdat:" . mysql_error());
Hier gebruiken we dus de functie mysql_connect() om een verbinding te maken met de database. Als het, om wat voor reden dan ook, niet lukt, dan krijg je een error te zien.
$database = mysql_select_db($database, $connection)
or die ("Kan de database niet selecteren.");
En hier selecteren we de database met mysql_select_db() en we krijgen ook hier weer een foutmelding als het niet lukt.
?>
En niet vergeten php ook af te sluiten;)
Nu hebben we dus de volgende code gekregen:
<?php
// connect.php
// verbinding maken met de database
include("db.php"); // In dit bestand definiëren we de variabelen
$connection = mysql_connect($host, $user, $wachtwoord) // Hier maken we een verbinding met de server
or die ("Kan geen verbinding met de server maken, omdat:" . mysql_error()); // Als er geen verbinding gemaakt kan worden, krijg je deze foutmelding
$database = mysql_select_db($database, $connection) // Hier selecteren we de goede database
or die ("Kan de database niet selecteren."); // En weer een foutmelding als het selecteren niet lukt.
?>
Dat was al het eerste bestand, maar we moeten niet vergeten om de variabelen die we hier hebben gebruikt in het bestand db.php te zetten.
We hebben net verschillende variabelen gezien welke we nog geen waarde hebben gegeven. Dat zijn $host, $user, $wachtwoord en $database.
<?php
//db.php
//bestand waarin aan allerlei variabelen een waarde wordt toegekend.
Weer het begin van het bestand
$host="****";
Op de plaats van de sterretjes vul je je host in, dit zal zeer waarschijnlijk localhost zijn.
$user="****";
Hier moet je op de plaats van de sterretjes je gebruikersnaam zetten waarmee je toegang krijgt tot je database, als je deze niet weet kun je die opvragen bij de persoon/instantie die voor je database zorgt.
$wachtwoord="****";
Hier het bijbehorende wachtwoord (ook op te vragen).
$database="****";
En tot slot dan nog de naam van de database (ook op te vragen).
?>
En weer niet vergeten af te sluiten.
En het bestand dat we hebben...
<?php
//db.php
//bestand waarin aan allerlei variabelen een waarde wordt toegekend.
$host="****";
$user="****";
$wachtwoord="****";
$database="****";
?>
Okee, we kunnen nu dus een verbinding maken met de database. Dan wordt het nu tijd om met het gastenboek zélf te gaan beginnen.
Dit bestand gaat een stuk gecompliceerder worden dan de vorigen, maar toch is het zeker te doen.
<?php
//gastenboek.php
//geeft alle berichten weer, en bevat een link naar het schrijven van een bericht.
Weer het begin van het bestand, spreekt voor zich intussen.
echo"<a href=\"sgastenboek.php\">Schrijf een bericht</a>";
Als eerst maar eens beginnen met een link naar het schrijven van een bericht...
include("connect.php");
Door deze ene regel in te voeren, maken we dus een verbinding met de database, omdat we de functie include() gebruiken en het bestand includen waarin de informatie staat om een verbinding te maken.
We moeten nu wat gegevens uit de database gaan halen, hier gaan we namelijk enkele berekeningen mee uitvoeren.
$sql = "SELECT * FROM gastenboek";
We definieren hier dus de variabele $sql. ie moet alle (*) gegevens ophalen die in de tabel 'gastenboek' staan.
$uitvoer = mysql_query($sql);
Hier voeren we het pas echt uit, mysql_query() stuurt de opdracht echt naar de database. Je ziet dat we hier ook weer een variabele van hebben gemaakt. Deze variabele bevat dus alle gegevens uit de database die we net hebben opgehaald
$aantal = mysql_num_rows($uitvoer)
Zoals je ziet blijven we maar met allerlei variabelen verder gaan. mysql_num_rows or die(mysql_error);() geeft het aantal rijen weer die $uitvoer bevat. Deze bevatte alles uit de tabel 'gastenboek', dus we weten nu hoeveel berichten er in totaal geplaatst zijn. En hier komt ook weer een foutmelding te staan als er iets niet goed gaat.
$perpage = 10;
Hier geven we een variabele een bepaalde waarde. Deze variabele gaan we gebruiken om het maximum aantal berichten per pagina in te stellen, in dit geval dus 10.
page_count = ceil($aantal/$perpage);
We berekenen nu het totale aantal pagina's.
Dit doen we door het totale aantal berichten te delen door het aantal berichten per pagina.
ceil() zorgt ervoor dat er naar boven wordt afgerond, anders zijn niet alle berichten zichtbaar...
En, hoe gaat het tot nu toe?
Snap je het nog allemaal? Nee?
Misschien dat je dan toch beter deze tut nog een keer opnieuw kan lezen, of anders eerst wat basiskennis van PHP en MySQL op kan doen.
Deze site kan je dan misschien wel goed helpen.
Snap je het nog wel allemaal? Mooi! Dan kunnen we namelijk weer verder, want we zijn nog niet klaar...
$page = (isset($_GET['page'])) ? $_GET['page'] : 1;
De variabele $page wordt vergeleken met (isset($_GET['page'])), als deze overeenkomen, dan geldt $page = $_GET['page'], anders geldt $page = 1. isset() controleert of een variabele bestaat, en in dit geval is dat dan page. Dus hij kijkt of er in de adresbalk ....gastenboek.php?page=<<paginanummer hier>> staat. Als dat erachter staat dan bestaat de variabele dus, en is $page gelijk aan de waarde van het paginanummer dat op dat moment in de adresbalk staat.
$start = ($page * $perpage) - $perpage;
$start dat is de beginwaarde van het eerste bericht op een bepaalde pagina. De berekening hiervoor is eigenlijk ook erg logisch. Het aantal berichten per pagina maal het paginanummer. Dan zit je echter op het laatste bericht, dus moet je er ook nog het aantal berichten per pagina vanaf halen.
$sql = "SELECT * FROM gastenboek ORDER BY id DESC LIMIT ".$start.",".$perpage."";
Deze opdracht lijkt veel op eentje die we al eerder hebben gebruikt, maar hier zit nog wat meer bij. Het sorteert(ORDER BY) de berichten namelijk ook op aflopende (DESC) volgorde. En hij laat niet alle berichten zien, maar een selectie(LIMIT). Die selectie begint vanaf de waarde van $start en neemt dan de volgende aantal berichten, welk aantal $perpage aanduidt. Dus als er 15 berichten staan, dan is $start 15 en $perpage 10. Je ziet dan dus de berichten 15-5.
$uitvoer = mysql_query($sql) or die(mysql_error());
Nog even bovenstaande opdracht uitvoeren door middel van mysql_query().
Allemaal heel leuk, maar we kunnen nu nog steeds geen berichten zien.
Inderdaad, maar daar gaan we nu voor zorgen.
while($data = mysql_fetch_array($uitvoer))
We hebben hier nu een loop dmv while().
Als voorstaande waar is, dan blijft hij de komende opdrachten eindeloos lang uitvoeren.
De volgende opdrachten zullen betrekking hebben op de berichten in de database, dat kun je zien aan mysql_fetch_array().
En dan gaan we nu dus verder met de opdrachten die hij dan moet uitvoeren.
In de loop gaan we dus weergeven hoe een bericht er uit moet komen te zien.
{
Dit geeft het begin van de loop aan.
echo "Bericht geschreven door <b>".$data['naam']."</b>";
Hier maken we gebruik van echo(), maar nu iets ingewikkelder dan hoe we het eerder hebben gedaan. Wat tussen " " staat, wordt letterlijk uitgevoerd. Bericht geschreven door <b> wordt dus gewoon letterlijk doorgegeven, hier wordt verder niets mee gedaan. De variabele moet ook nog verwerkt worden en zetten we daarom beter niet tussen haakjes. We vragen hier om de uitvoer van de naam die in de database is opgeslagen. Je kunt je ook nog afvragen, wat doet die punt daar? Maar die voegt beide dingen samen. De uitvoer die we hier dus krijgen, is Bericht geschreven door naam uit de database, dikgedrukt.
echo " op " .$data['datum'];
Dit heeft eenzelfde constructie als de naam, maar hier wordt dan de bijbehorende datum uit de database gehaald.
echo " om " .$data['tijd'];
En nu weer hetzelfde, maar dan dus met de tijd.
echo"<br /><br />";
Ik zet er nu een dubbele enter neer, dit zorgt ervoor dat je een witregel krijgt tussen de naam van de auteur, tijd en datum en het bericht zelf.
$bericht = nl2br($data['bericht']);
Voordat we het bericht zelf weergeven, moeten we nog een handeling verrichten. Als mensen in hun berichten een enter hebben getypt, dan wil je die natuurlijk ook in het bericht zelf weergeven. Dit doe ik door gebruik te maken van nl2br(). Wat een handige functie is dat toch;)
echo $bericht; //Het bericht zelf
En hier geven we dan het bericht zelf weer. Let erop dat niet $data['bericht'] staat, maar $bericht. Dat komt door het weghalen van de enters, daar hebben we namelijk een variabele gemaakt.
echo"<br /><br /><br />";
En dit zijn dan enters om de onderkant van het bericht af te scheiden van de bovenkant van het volgende bericht dat wordt weergegeven.
}
Hier beëindigen we de loop alweer.
Nu gaan we ook nog onderaan de knoppen 'volgende' en 'vorige' maken en dan is dit bestand ook al klaar.
Dit gaan we doen door twee keer gebruik te maken van een if...else constructie.
echo"<br /><br />";
Eerst maar even wat ruimte tussen de berichten en de knoppen.
if ($page > 1)
Hier zeggen we "Als het huidige paginanummer groter is dan 1, dan..."
{
Begin van de opdracht die gedaan moet worden als paginanummer groter is dan 1.
$vorige = $page-1;
De variabele $vorige krijgt als waarde het huidige paginanummer, min 1.
echo "<a href='gastenboek.php?page=".$vorige."'>Vorige</a> ";
Hier creeren we de link naar de vorige pagina met behulp van de variabele $vorige. We echoen een link, met als paginanummer dus die van de vorige pagina.
}
Het einde van deze if.
else
Als het paginanummer niet groter is dan 1, dan komt het volgende.
{
Weer het begin, maar nu dus van de else.
echo "<b>Vorige </b>";
Gewoon de tekst Vorige echoen we hier, deze is dus niet klikbaar. En dat klopt ook, want er is geen vorige pagina.
}
En het einde van de else.
Nu moeten we hetzelfde principe nog een keer doen, maar dan voor de volgende pagina.
if ($page < ceil($aantal/$perpage))
Als het paginanummer kleiner is dan het totaal aantal paginas, dan....
{
$volgende = $page+1;
echo "<a href='gastenboek.php?page=".$volgende."'>Volgende</a>";
}
else
{
echo "<b>Volgende</b>";
}
Het principe is hetzelfde als bij vorige, alleen met een andere tekst en nu dus een pagina verder in plaats van terug.
Ik ga het dan ook niet nog een keer opnieuw uitleggen.
Zo, dat was het alweer met dit bestand:)
Het hele bestand...
<?php
//gastenboek.php
//geeft alle berichten weer, en bevat een link naar het schrijven van een bericht.
echo"<a href=\"sgastenboek.php\">Schrijf een bericht</a>";
include("connect.php"); // Nu maken we dus een verbinding met de database.
$sql = "SELECT * FROM gastenboek";
$uitvoer = mysql_query($sql);
$aantal = mysql_num_rows($uitvoer)
or die(mysql_error());
$perpage = 10;
$page_count = ceil($aantal/$perpage);
$page = (isset($_GET['page'])) ? $_GET['page'] : 1; // als $_get[page] nog niet bestaat, dan begint je gastenboek bij pagina 1
$start = ($page * $perpage) - $perpage;
$sql = "SELECT * FROM gastenboek ORDER BY id DESC LIMIT ".$start.",".$perpage.""; //Berichten uit de database halen en deze sorteren.
$uitvoer = mysql_query($sql) or die(mysql_error());
while($data = mysql_fetch_array($uitvoer))
{
echo "Bericht geschreven door <b>".$data['naam']."</b>"; //De naam van de auteur
echo " op " .$data['datum'];
echo " om " .$data['tijd'];
echo"<br /><br />";
$bericht = nl2br($data['bericht']);
echo $bericht; //Het bericht zelf
echo"<br /><br /><br />";
}
echo"<br /><br />";
if ($page > 1)
{
$vorige = $page-1;
echo "<a href='gastenboek.php?page=".$vorige."'>Vorige</a> ";
}
else
{
echo "<b>Vorige </b>";
}
if ($page < ceil($aantal/$perpage))
{
$volgende = $page+1;
echo "<a href='gastenboek.php?page=".$volgende."'>Volgende</a>";
}
else
{
echo "<b>Volgende</b>";
}
Zozo, het laatste bestand alweer. Dit is toch een erg belangrijk bestand, dus zet nog even door;)
include("connect.php");
We maken een verbinding met de databse, include() helpt ons hierbij, connect.php maakt namelijk de verbinding.
if (!isset($_POST['submit']))
Hier maken we weer gebruik van de isset() functie, in dit geval om te kijken of er al iets gesubmit is. Let op de !, deze zorgt voor een ontkenning.
{
Begin van deze if. Wat er nu komt is dus hetgeen wat er moet komen te staan als er niks gepost is, dus de tekstvakken ed om een bericht te kunnen plaatsen.
?>
We moeten nu een lap html gaan invoeren, dus is het makkelijker om de php even af te sluiten.
<form method="post" action="" />
Deze maakt een formulier, de method="post" is hiervan erg belangrijk. Deze zorgt er namelijk voor dat het formulier uiteindelijk ook werkelijk vezonden kan gaan worden.
<table width="300" cellpadding="0" border="0">
Nu maken we een tabel waar we dan dalijk de benodigde dingen in kunnen gaan zetten. Voor meer uitleg over table, kun je hier of hier eens een kijkje nemen.
<tr>
Hiermee beginnen we dus een rij.
<td>
En hiermee maken we dus de cel.
Naam:
Gewoon tekst, zodat mensen weten wat ze moeten invullen.
</td>
En deze cel sluiten we af.
<td>
Een volgende cel, deze zit dus rechts van de vorige.
<input type="text" name="naam" maxlength="30" />
Dit maakt een textbox, met als naam "naam" en maximaal 30 tekens.
</td>
Deze cel sluiten we nu af.
</tr>
En nu sluiten we de hele rij af.
En nu moeten we nog hetzelfde doen, maar dan voor het bericht.
<tr>
<td>
Bericht:
</td>
Hier beginnen we dus een nieuwe rij, en in de eerste cel staat "Bericht:".
<td>
<textarea name="bericht" cols="40" rows="8"></textarea>
</td>
</tr>
Voor het bericht nemen we niet één regel, maar gewoon een heel tekstvak, is wel zo gemakkelijk;) de cols is voor de breedte, de rows voor de hoogte. Je kunt ook tekst laten verschijnen zonder dat iemand iets heeft getypt, dat doe je door:
<textarea name="bericht" cols="40" rows="8">Hier je tekst neer te zetten.</textarea>
<tr>
<td>
</td>
Weer een nieuwe rij. Hier laat ik de eerste cel leeg, omdat ik de submitbox liever onder de tekstvakken heb staan, dus in de tweede cel.
<td>
<br /><input type="submit" value="Bericht plaatsen" name="submit" />
In deze cel komt dus de knop om het bericht te verzenden. Vandaar dat het type nu submit is, en niet text. De value is hetgeen wat op de knop zelf komt te staan.
</td>
</tr>
</table>
Tot slot sluiten weer alle dingen af.
<?php
We gaan nu weer verder in php, we hebben het grootste deel html namelijk wel gehad;)
}
Hiermee sluiten we de if-reeks af.
else{
Jaja, nu beginnen we dus aan de else, dus als er wel een bericht wordt verzonden.
In dat geval moeten we het bericht gaan controleren op dingen als lege vakken.
$naam = $_POST['naam'];
$bericht = $_POST['bericht'];
Het is nu wat makkelijker om met variabelen te werken, dus maak ik hier een variabele van de naam en het bericht.
if (!$naam) {
Als er geen naam is ingevuld, dan....
echo "FOUTMELDING:<br />";
echo "Je hebt geen naam ingevuld, maar die is wel verplicht.<br />";
echo "<input type='submit' value='Terug' onclick='history.back(1)'>";
}
... krijg je bovenstaande foutmelding. En je krijgt ook een knopje waarmee je een pagina terug kunt gaan, afhankelijk van de hosting worden de ingevulde gegevens wel of niet onthouden.
if(strlen($naam) > 30)
Ook controleren we het veld van de naam op de lengte, met strlen(). In dit geval wordt het volgende weergegeven als de naam langer is dan 30 tekens.
echo "FOUTMELDING:<br />";
echo "Je naam mag maar 30 tekens lang zijn.<br />";
echo "<input type='submit' value='Terug' onclick='history.back(1)'>";
}
Bovenstaande foutmelding krijg je dan.
if (!$bericht){ //....
echo "FOUTMELDING:<br />";
echo "Je hebt geen bericht ingevuld, en waar gaat het hier nou juist om? Precies!... <br />";
echo "<input type='submit' value='Terug' onclick='history.back(1)'>";
}
Ook nog even de foutmelding voor als je geen bericht in hebt gevuld.
Dan moeten we nu nog de gegevens in de database opslaan.
$naam = str_replace("'", "`", $naam);
Deze functie (str_replace()) vervangt een ' door een `. Dit is van belang omdat de database in de war raakt als hij ' moet invoeren.
$naam = htmlspecialchars($naam);
We gebruiken hier dus de functie htmlspecialchars(), deze is zeker niet onbelangrijk. Deze maakt hacken via tekstvakken namelijk moeilijker (Okee, beetje kort door de bocht inderdaad, maar het idee is denk ik wel duidelijk.).
$tijd = date("G:i");
$datum = date("d-m-y");
Hiermee definiëren we $tijd en $datum. De keuzes die je hebt voor de verschillende soorten notaties, kun je vinden bij de omschrijving van date().
$bericht = str_replace("'", "`", $bericht);
$bericht = htmlspecialchars($bericht);
Hetzelfde als bij de naam, maar nu met het bericht.
Dan nu het invoegen van het bericht in de database:
$sql = "INSERT INTO gastenboek (id, naam, tijd, datum, bericht)
VALUES ('', '$naam', '$tijd', '$datum', '$bericht')";
Meer uitleg over de INSERT query is hier te vinden. Maar het komt er dus op neer dat we de waarden die de variabelen bevatten, invoegen in de database.
mysql_query($sql) or die(mysql_error());
Het echte uitvoeren van de query (myqsl_query()) en anders een error (mysql_error())
header("Location: gastenboek.php");
Een doorlinking met behulp van header(), zo voorkom je dat mensen door te refreshen hun bericht opnieuw plaasten.
}
Dit is nog de afsluiting van de else, die moet je niet vergeten.
?>
Nog de afsluiting van het document.
Voor de laatse keer nog het hele bestand
include("connect.php");
if (!isset($_POST['submit']))
{
?>
<form method="post" action="" />
<table width="300" cellpadding="0" border="0">
<tr>
<td>
Naam:
</td>
<td>
<input type="text" name="naam" maxlength="20" />
</td>
</tr>
<tr>
<td>
Bericht:
</td>
<td>
<textarea name="bericht" cols="40" rows="8"></textarea>
</td>
</tr>
<tr>
<td>
</td>
<td>
<br /><input type="submit" value="Bericht plaatsen" name="submit" />
</td>
</tr>
</table>
<?php
}
else{
$naam = $_POST['naam'];
$bericht = $_POST['bericht'];
if (!$naam) {
echo "FOUTMELDING:<br />";
echo "Je hebt geen naam ingevuld, maar die is wel verplicht.<br />";
echo "<input type='submit' value='Terug' onclick='history.back(1)'>";
exit;
}
if(strlen($naam) > 30) { //Als de lengte van $naam > 30 is, ....
echo "FOUTMELDING:<br />";
echo "Je naam mag maar 30 tekens lang zijn.<br />";
echo "<input type='submit' value='Terug' onclick='history.back(1)'>";
}
if (!$bericht){
echo "FOUTMELDING:<br />";
echo "Je hebt geen bericht ingevuld, en waar gaat het hier nou juist om? Precies!... <br />";
echo "<input type='submit' value='Terug' onclick='history.back(1)'>";
}
$naam = str_replace("'", "`", $naam); //zo kan de functie uitgevoerd worden, anders kan hij in de war raken door '
$naam = htmlspecialchars($naam);
$tijd = date("G:i");
$datum = date("d-m-y");
$bericht = str_replace("'", "`", $bericht);
$bericht = htmlspecialchars($bericht);
$sql = "INSERT INTO gastenboek (id, naam, tijd, datum, bericht)
VALUES ('', '$naam', '$tijd', '$datum', '$bericht')";
mysql_query($sql) or die(mysql_error());
header("Location: gastenboek.php");
}
?>
Zozo, het heeft een tijd geduurt, maar nu heb je dan toch wel je eigen gastenboek!
Veel plezier ermee!
Ik wil het je niet verplichten, maar ik zou het leuk vinden als je een link zou plaatsen naar mijn site als je dit gastenboek gebruikt.
<a href="http://www.anjoonline.nl">Dit gastenboek is mede tot stand gekomen met hulp van Anjo Online</a>
Zoiets bijvoorbeeld.