Actief
Topic: [PHP] Login systeem OOP
Vorige
( 1,2 )
Volgende
# Gepost op 15-11-2010 20:48
Bewerkt door superkluns op 15-11-2010 20:49
Ik heb nog wel een ideetje voor een nieuwe 'database_velden-flag'. Ik ben ff vergeten hoe die php-functie heet, maar er is er 1 waarbij je kan controleren of een string uit bepaalde tekens bestaat en zo niet geeft ie false.
Dan kun je bv. als flag
???=[A-Za-z0-9_.-] (vervang die ??? door de flag-naam die ik ff niet weet.) gebruiken voor bv. een gebruikersnaam die alleen uit letters, cijfers of die 3 tekens mag bestaan. (k gloof dat ik al een fout heb gemaakt, volgens mij moet er een backslash voor die punt, maarja dat maakt voor het voorbeeld ff niks uit)
Volg je me nog een beetje

??
Ik heb nog wel een ideetje voor een nieuwe 'database_velden-flag'. Ik ben ff vergeten hoe die php-functie heet, maar er is er 1 waarbij je kan controleren of een string uit bepaalde tekens bestaat en zo niet geeft ie false.
Dan kun je bv. als flag [b]???=[A-Za-z0-9_.-][/b] (vervang die ??? door de flag-naam die ik ff niet weet.) gebruiken voor bv. een gebruikersnaam die alleen uit letters, cijfers of die 3 tekens mag bestaan. (k gloof dat ik al een fout heb gemaakt, volgens mij moet er een backslash voor die punt, maarja dat maakt voor het voorbeeld ff niks uit)
Volg je me nog een beetje:P??
# Gepost op 24-11-2010 15:04
Kun je daar niet beter is_string voor gebruiken?
Mijn software heeft geen bugs. Het ontwikkelt gewoon ongedocumenteerde functies.
Kun je daar niet beter is_string voor gebruiken?
simon
member
# Gepost op 05-02-2011 00:53
zit er zo op het eerste gezicht leuk uit.
morgen maar even kijken wat het nu precies is
zit er zo op het eerste gezicht leuk uit.
morgen maar even kijken wat het nu precies is;)
ud2011
member
# Gepost op 28-02-2011 13:02
Mooie code.
Ik heb wel een vraag, wanneer ik in de database een extra kolom toevoeg met naam: "Locaties". Deze worden gebruikt om een gebruiker na het inloggen door te verwijzen naar een bepaalde pagina.
Bijv: gebruiker 1 heeft als locatie: amsterdam en gebruiker 2 locatie: Utrecht.
Hoe kan ik dit in de code zo aanpassen dat de gebruikers automatisch worden doorverwezen naar de juiste pagina.
Mooie code.
Ik heb wel een vraag, wanneer ik in de database een extra kolom toevoeg met naam: "Locaties". Deze worden gebruikt om een gebruiker na het inloggen door te verwijzen naar een bepaalde pagina.
Bijv: gebruiker 1 heeft als locatie: amsterdam en gebruiker 2 locatie: Utrecht.
Hoe kan ik dit in de code zo aanpassen dat de gebruikers automatisch worden doorverwezen naar de juiste pagina.
# Gepost op 12-03-2011 15:49
Late reactie maar als je het nog nodig hebt,
Je kunt informatie opvragen met:
login::get_login_info('veldnaam');
Dus in jou geval kan je zoiets maken:
<?php
if($locatie = login::get_login_info('Locaties'))
{
$url = '/url/naar/locaties/locatie_'.$locatie.'.php';
}
?>
Stel de gebruiker is niet ingelogd dan returned de login info method een bool false waardoor hij de if-lus niet uitvoert.
Vervolgens maak je de url dus bij Utrecht zou dat zijn /url/naar/locaties/locatie_Utrecht.php. Eventueel zou je kunnen controleren of die bestaat en de link pas je natuurlijk aan naar wat jij wilt.
Let wel op dat je een header moet uitvoeren voordat er informatie naar de client wordt verzonden (dus bij echo, print, tekst en/of spaties, enters en/of code boven de <?php tag.
Late reactie maar als je het nog nodig hebt,
Je kunt informatie opvragen met:
[code=php]login::get_login_info('veldnaam');[/code]
Dus in jou geval kan je zoiets maken:
[code=php]<?php
if($locatie = login::get_login_info('Locaties'))
{
$url = '/url/naar/locaties/locatie_'.$locatie.'.php';
header("Location: ".$url);
}
?>[/code]
Stel de gebruiker is niet ingelogd dan returned de login info method een bool false waardoor hij de if-lus niet uitvoert.
Vervolgens maak je de url dus bij Utrecht zou dat zijn /url/naar/locaties/locatie_Utrecht.php. Eventueel zou je kunnen controleren of die bestaat en de link pas je natuurlijk aan naar wat jij wilt.
Let wel op dat je een header moet uitvoeren voordat er informatie naar de client wordt verzonden (dus bij echo, print, tekst en/of spaties, enters en/of code boven de <?php tag.
ud2011
member
# Gepost op 14-03-2011 09:10
Bedankt voor de reactie, ik wilde het gaan testen maar krijg (nog voordat ik de code aangepast heb) de volgende errors:
Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\php\PEAR\Config.php on line 80
Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\php\PEAR\Config.php on line 166
Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\php\PEAR\Config\Container.php on line 111
Warning: mysql_connect() [function.mysql-connect]: php_network_getaddresses: getaddrinfo failed: Host is onbekend. in C:\xampp\htdocs\test\classes\header.php on line 69
Warning: mysql_connect() [function.mysql-connect]: [2002] php_network_getaddresses: getaddrinfo failed: Host is onbekend. (trying to connect via tcp://mysql_host:3306) in C:\xampp\htdocs\test\classes\header.php on line 69
Warning: mysql_connect() [function.mysql-connect]: php_network_getaddresses: getaddrinfo failed: Host is onbekend. in C:\xampp\htdocs\test\classes\header.php on line 69
Warning: mysql_select_db() expects parameter 2 to be resource, boolean given in C:\xampp\htdocs\test\classes\header.php on line 70
Fatal error: Uncaught exception 'Exception' with message 'MySQL liep tegen de volgende fout aan: <br />php_network_getaddresses: getaddrinfo failed: Host is onbekend. ' in C:\xampp\htdocs\test\classes\header.php:78 Stack trace: #0 C:\xampp\htdocs\test\classes\header.php(378): login->__construct() #1 C:\xampp\htdocs\test\index.php(3): include('C:\xampp\htdocs...') #2 {main} thrown in C:\xampp\htdocs\test\classes\header.php on line 78
Enig idee wat het probleem kan zijn?
Bedankt voor de reactie, ik wilde het gaan testen maar krijg (nog voordat ik de code aangepast heb) de volgende errors:
Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\php\PEAR\Config.php on line 80
Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\php\PEAR\Config.php on line 166
Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\php\PEAR\Config\Container.php on line 111
Warning: mysql_connect() [function.mysql-connect]: php_network_getaddresses: getaddrinfo failed: Host is onbekend. in C:\xampp\htdocs\test\classes\header.php on line 69
Warning: mysql_connect() [function.mysql-connect]: [2002] php_network_getaddresses: getaddrinfo failed: Host is onbekend. (trying to connect via tcp://mysql_host:3306) in C:\xampp\htdocs\test\classes\header.php on line 69
Warning: mysql_connect() [function.mysql-connect]: php_network_getaddresses: getaddrinfo failed: Host is onbekend. in C:\xampp\htdocs\test\classes\header.php on line 69
Warning: mysql_select_db() expects parameter 2 to be resource, boolean given in C:\xampp\htdocs\test\classes\header.php on line 70
Fatal error: Uncaught exception 'Exception' with message 'MySQL liep tegen de volgende fout aan: <br />php_network_getaddresses: getaddrinfo failed: Host is onbekend. ' in C:\xampp\htdocs\test\classes\header.php:78 Stack trace: #0 C:\xampp\htdocs\test\classes\header.php(378): login->__construct() #1 C:\xampp\htdocs\test\index.php(3): include('C:\xampp\htdocs...') #2 {main} thrown in C:\xampp\htdocs\test\classes\header.php on line 78[code=text][/code]
Enig idee wat het probleem kan zijn?
ud2011
member
# Gepost op 15-03-2011 14:00
Ik heb het al opgelost, dit is wat ik veranderd heb:
In de config.php:
# De mysql host, waar je database op draait. Is meestal localhost
define("mysql_host", 'localhost');
# De mysql gebruikersnaam. Is meestal niet root
# Het mysql wachtwoord, is eigenlijk nooit leeg
# De tabel waar het systeem op draait. Als je de SQL niet hebt uitgevoerd moet je deze aanpassen
define("mysql_database", 'loginsysteem');
# De login sessie tijd, het aantal uren dat je bent ingelogd dus.
define("login_session_time", 24
);
# MD5 gebruiken om wachtwoorden te coderen? Staat standaard uit
define("login_password_md5", false);
# Fouten weergeven ? Alleen handig als je aan het testen bent!
Werd:
# De mysql host, waar je database op draait. Is meestal localhost
$this->host = "localhost");
# De mysql gebruikersnaam. Is meestal niet root
$this->user = "root");
# Het mysql wachtwoord, is eigenlijk nooit leeg
$this->password = "");
# De tabel waar het systeem op draait. Als je de SQL niet hebt uitgevoerd moet je deze aanpassen
$this->database = "test");
# De login sessie tijd, het aantal uren dat je bent ingelogd dus.
$this->login_session_time = 24);
# MD5 gebruiken om wachtwoorden te coderen? Staat standaard uit
$this->login_password_md5 = true);
# Fouten weergeven ? Alleen handig als je aan het testen bent!
$this->show_errors = false);
En in de header:
$verbinding = mysql_connect(mysql_host
, mysql_user
, mysql_password
);
Werd:
$verbinding = mysql_connect($this->host,$this->user,$this->password);
Ik vermoed dat de define in config.php niet goed werkte.
Ik heb het al opgelost, dit is wat ik veranderd heb:
In de config.php:
[code=php]
# De mysql host, waar je database op draait. Is meestal localhost
define("mysql_host", 'localhost');
# De mysql gebruikersnaam. Is meestal niet root
define("mysql_user", 'root');
# Het mysql wachtwoord, is eigenlijk nooit leeg
define("mysql_password", '');
# De tabel waar het systeem op draait. Als je de SQL niet hebt uitgevoerd moet je deze aanpassen
define("mysql_database", 'loginsysteem');
# De login sessie tijd, het aantal uren dat je bent ingelogd dus.
define("login_session_time", 24);
# MD5 gebruiken om wachtwoorden te coderen? Staat standaard uit
define("login_password_md5", false);
# Fouten weergeven ? Alleen handig als je aan het testen bent!
define("show_errors", false);
[/code]
Werd:
[code=php]
# De mysql host, waar je database op draait. Is meestal localhost
$this->host = "localhost");
# De mysql gebruikersnaam. Is meestal niet root
$this->user = "root");
# Het mysql wachtwoord, is eigenlijk nooit leeg
$this->password = "");
# De tabel waar het systeem op draait. Als je de SQL niet hebt uitgevoerd moet je deze aanpassen
$this->database = "test");
# De login sessie tijd, het aantal uren dat je bent ingelogd dus.
$this->login_session_time = 24);
# MD5 gebruiken om wachtwoorden te coderen? Staat standaard uit
$this->login_password_md5 = true);
# Fouten weergeven ? Alleen handig als je aan het testen bent!
$this->show_errors = false);
[/code]
En in de header:
[code=php]
$verbinding = mysql_connect(mysql_host, mysql_user, mysql_password);
mysql_select_db(mysql_database, $verbinding);
[/code]
Werd:
[code=php]
$verbinding = mysql_connect($this->host,$this->user,$this->password);
mysql_select_db($this->database,$verbinding);
[/code]
Ik vermoed dat de define in config.php niet goed werkte.
# Gepost op 03-07-2011 21:40
Beetje laat misschien maar ik heb (alweer) een complete rewrite van de header gemaakt. Eentje die consequent is met foutmeldingen (en MySQL foutmeldingen). Ook is de login pagina wat anders geworden omdat de fouten variabele een array is geworden.
login.inc.php
<?php if(count($login->fouten) > 0) : ?> <p><?php print $login->toonFouten();?></p>
<?php endif;?>
<form method="post" action="<?php print $_SERVER['REQUEST_URI'];?>">
<input type="hidden" name="actie" value="login" />
<dl>
<dd><input type="text" name="gebruikersnaam" placeholder="Gebruikersnaam" /></dd>
<dd><input type="text" name="wachtwoord" placeholder="Wachtwoord" /></dd>
<dd><input type="submit" value="Login" /></dd>
</dl>
</form>
En de login header
<?php
{
include_once('config.php');
}
else
{
die('Fout: config.php kon niet gevonden worden.'); }
class login
{
private static $loginsessie = false;
public $fouten = array(); private static
$gebruikersinfo = array(); public $databaseVelden = array(); private $recheck = 0;
public function __construct()
{
{
}
$this->checkSession();
if(isset($_GET['actie']) && $_GET['actie'] == 'uitloggen' && self::$loginsessie === true) {
$this->endSession();
}
}
public function toonFouten()
{
foreach($this->fouten as $fout)
{
$out .= $fout;
}
return $out;
}
public function init()
{
if($_SERVER['REQUEST_METHOD'] == 'POST' && self::$loginsessie === false)
{
if(isset($_POST['actie'])) {
switch($_POST['actie'])
{
case 'login': $this->controleerGegevens(); break;
}
}
}
return $this;
}
public function getIP()
{
{
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$realip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
elseif(isset($_SERVER['HTTP_CLIENT_IP'])) {
$realip = $_SERVER['HTTP_CLIENT_IP'];
}
else
{
$realip = $_SERVER['REMOTE_ADDR'];
}
}
else
{
if(getenv('HTTP_X_FORWARDED_FOR')) {
$realip = getenv('HTTP_X_FORWARDED_FOR'); }
elseif(getenv('HTTP_CLIENT_IP')) {
$realip = getenv('HTTP_CLIENT_IP'); }
else
{
$realip = getenv('REMOTE_ADDR'); }
}
return $realip;
}
private function controleerGegevens()
{
if(isset($_POST['actie']) && $_POST['actie'] == 'login') {
if(constant('login_password_md5') === true) {
$wachtwoord = md5($wachtwoord); }
$query = mysql_query("SELECT * FROM gebruikers WHERE gebruikersnaam = '".$gebruikersnaam."' AND wachtwoord = '".$wachtwoord."'");
{
self::$gebruikersinfo = array(); return $this->startSession();
}
else
{
{
}
else
{
array_push($this->fouten, 'Gebruikersnaam of wachtwoord bestaat niet'); }
}
}
}
private function checkSession()
{
if($this->recheck >= constant('login_attempts')) {
array_push($this->fouten, 'Er is een ongeldige sleutel gevonden'); return false;
}
if(isset($_COOKIE['sid']) && !empty($_COOKIE['sid'])) {
$query = mysql_query("SELECT * FROM logins WHERE sid = '".$sid."' AND ip = '".$this->getIP()."'");
{
$query = mysql_query("SELECT * FROM gebruikers WHERE id = '".$f->uid."'");
{
self::$loginsessie = true;
self::$gebruikersinfo = array(); }
}
{
}
}
else
{
$secondes = constant('login_session_time') * 3600; $this->recheck++;
}
}
public function startSession()
{
self::$gebruikersinfo['sleutel'] = md5(rand(0
,99999999999
).date('dmyhis')); $info = self::$gebruikersinfo['info'];
$sql = "INSERT INTO logins ";
$sql .= "ip = '".$this->getIP()."', ";
$sql .= "datum = NOW()";
{
}
$secondes = constant('login_session_time') * 3600; setcookie('sid', self::$gebruikersinfo['sleutel'], time() + $secondes, '/'); header('Location: '.$_SERVER['REQUEST_URI']); }
private function endSession()
{
mysql_query("DELETE FROM logins WHERE sid = '".$sid."' AND ip = '".$this->getIP()."'");
{
}
$secondes = constant('login_session_time') * 3600; $url = str_replace('?actie=uitloggen', '', $_SERVER['REQUEST_URI']); }
public static function getLoginInfo($wat=false)
{
if(!self::$loginsessie || !count(self::$gebruikersinfo)) {
return false;
}
else
{
if($wat === 'alles')
{
return self::$gebruikersinfo['info'];
}
elseif(isset(self::$gebruikersinfo['info'][$wat])) {
return self::$gebruikersinfo['info'][$wat];
}
else
{
return true;
}
}
}
}
?>
Ik heb nog
geen tijd gehad om deze code te testen dus ik weet niet 100% zeker of het foutloos is!
Mijn software heeft geen bugs. Het ontwikkelt gewoon ongedocumenteerde functies.
Beetje laat misschien maar ik heb (alweer) een complete rewrite van de header gemaakt. Eentje die consequent is met foutmeldingen (en MySQL foutmeldingen). Ook is de login pagina wat anders geworden omdat de fouten variabele een array is geworden.
[b]login.inc.php[/b]
[code=php]
<?php if(count($login->fouten) > 0) : ?>
<p><?php print $login->toonFouten();?></p>
<?php endif;?>
<form method="post" action="<?php print $_SERVER['REQUEST_URI'];?>">
<input type="hidden" name="actie" value="login" />
<dl>
<dd><input type="text" name="gebruikersnaam" placeholder="Gebruikersnaam" /></dd>
<dd><input type="text" name="wachtwoord" placeholder="Wachtwoord" /></dd>
<dd><input type="submit" value="Login" /></dd>
</dl>
</form>
[/code]
En de login header
[code=php]
<?php
if(file_exists('config.php'))
{
include_once('config.php');
}
else
{
die('Fout: config.php kon niet gevonden worden.');
}
class login
{
private static $loginsessie = false;
public $fouten = array();
private static $gebruikersinfo = array();
public $databaseVelden = array();
private $recheck = 0;
public function __construct()
{
$verbinding = mysql_connect(constant('mysql_hostname'), constant('mysql_username'), constant('mysql_password'));
mysql_select_db(constant('mysql_database'), $verbinding);
if(constant('debug') === true && mysql_error())
{
die(mysql_error());
}
$this->checkSession();
if(isset($_GET['actie']) && $_GET['actie'] == 'uitloggen' && self::$loginsessie === true)
{
$this->endSession();
}
}
public function toonFouten()
{
foreach($this->fouten as $fout)
{
$out .= $fout;
}
return $out;
}
public function init()
{
if($_SERVER['REQUEST_METHOD'] == 'POST' && self::$loginsessie === false)
{
if(isset($_POST['actie']))
{
switch($_POST['actie'])
{
case 'login': $this->controleerGegevens(); break;
}
}
}
return $this;
}
public function getIP()
{
if(isset($_SERVER))
{
if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
{
$realip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
elseif(isset($_SERVER['HTTP_CLIENT_IP']))
{
$realip = $_SERVER['HTTP_CLIENT_IP'];
}
else
{
$realip = $_SERVER['REMOTE_ADDR'];
}
}
else
{
if(getenv('HTTP_X_FORWARDED_FOR'))
{
$realip = getenv('HTTP_X_FORWARDED_FOR');
}
elseif(getenv('HTTP_CLIENT_IP'))
{
$realip = getenv('HTTP_CLIENT_IP');
}
else
{
$realip = getenv('REMOTE_ADDR');
}
}
return $realip;
}
private function controleerGegevens()
{
if(isset($_POST['actie']) && $_POST['actie'] == 'login')
{
$gebruiker = strip_tags(mysql_real_escape_string($_POST['gebruikersnaam']));
$wachtwoord = strip_tags(mysql_real_escape_string($_POST['wachtwoord']));
if(constant('login_password_md5') === true)
{
$wachtwoord = md5($wachtwoord);
}
$query = mysql_query("SELECT * FROM gebruikers WHERE gebruikersnaam = '".$gebruikersnaam."' AND wachtwoord = '".$wachtwoord."'");
if(mysql_num_rows($query) > 0)
{
self::$gebruikersinfo = array();
self::$gebruikersinfo['info'] = mysql_fetch_array($query);
return $this->startSession();
}
else
{
if(constant('debug') === true && mysql_error())
{
die(mysql_error());
}
else
{
array_push($this->fouten, 'Gebruikersnaam of wachtwoord bestaat niet');
}
}
}
}
private function checkSession()
{
if($this->recheck >= constant('login_attempts'))
{
array_push($this->fouten, 'Er is een ongeldige sleutel gevonden');
return false;
}
if(isset($_COOKIE['sid']) && !empty($_COOKIE['sid']))
{
$sid = strip_tags(mysql_real_escape_string($_COOKIE['sid']));
$query = mysql_query("SELECT * FROM logins WHERE sid = '".$sid."' AND ip = '".$this->getIP()."'");
if(mysql_num_rows($query) > 0)
{
$f = mysql_fetch_object($query);
$query = mysql_query("SELECT * FROM gebruikers WHERE id = '".$f->uid."'");
if(mysql_num_rows($query) > 0)
{
self::$loginsessie = true;
self::$gebruikersinfo = array();
self::$gebruikersinfo['info'] = mysql_fetch_array($query);
}
}
if(constant('debug') === true && mysql_error())
{
die(mysql_error());
}
}
else
{
$secondes = constant('login_session_time') * 3600;
setcookie('sid', null, time() - $secondes, '/');
$this->recheck++;
}
}
public function startSession()
{
self::$gebruikersinfo['sleutel'] = md5(rand(0,99999999999).date('dmyhis'));
$info = self::$gebruikersinfo['info'];
$sql = "INSERT INTO logins ";
$sql .= "SET uid = '".mysql_real_escape_string($info['id'])."', ";
$sql .= "sid = '".mysql_real_escape_string(self::$gebruikersinfo['sleutel'])."', ";
$sql .= "ip = '".$this->getIP()."', ";
$sql .= "datum = NOW()";
mysql_query($sql);
if(constant('debug') === true && mysql_error())
{
die(mysql_error());
}
$secondes = constant('login_session_time') * 3600;
setcookie('sid', self::$gebruikersinfo['sleutel'], time() + $secondes, '/');
header('Location: '.$_SERVER['REQUEST_URI']);
}
private function endSession()
{
$sid = strip_tags($_COOKIE['sid']);
mysql_query("DELETE FROM logins WHERE sid = '".$sid."' AND ip = '".$this->getIP()."'");
if(constant('debug') === true && mysql_error())
{
die(mysql_error());
}
$secondes = constant('login_session_time') * 3600;
setcookie('sid', null, time() - $secondes, '/');
$url = str_replace('?actie=uitloggen', '', $_SERVER['REQUEST_URI']);
header('Location: '.$url);
}
public static function getLoginInfo($wat=false)
{
if(!self::$loginsessie || !count(self::$gebruikersinfo))
{
return false;
}
else
{
if($wat === 'alles')
{
return self::$gebruikersinfo['info'];
}
elseif(isset(self::$gebruikersinfo['info'][$wat]))
{
return self::$gebruikersinfo['info'][$wat];
}
else
{
return true;
}
}
}
}
?>
[/code]
Ik heb nog [b]geen tijd[/b] gehad om deze code te testen dus ik weet niet 100% zeker of het foutloos is!
jakeng
member
# Gepost op 04-09-2011 18:43
beste webmaster
ik wou vandaag uw inlogscript toe passen op mijn site.
maar ik ziet steeds bij de inlog pagina de php code. hoe kan ik dit weg doen?
ik heb funpic als hoster.
wat ook is als ik inlog krijg ik geen fout melding maar een 404 pagina.
help me aub
beste webmaster
ik wou vandaag uw inlogscript toe passen op mijn site.
maar ik ziet steeds bij de inlog pagina de php code. hoe kan ik dit weg doen?
ik heb funpic als hoster.
wat ook is als ik inlog krijg ik geen fout melding maar een 404 pagina.
help me aub
# Gepost op 24-09-2011 14:40
De bestanden waarin je php gebruikt moeten de extensie .php hebben. Ook moet jou host PHP ondersteunen.
De bestanden waarin je php gebruikt moeten de extensie [b].php[/b] hebben. Ook moet jou host PHP ondersteunen.
Vorige
( 1,2 )
Volgende
U moet aangemeld zijn om een reactie te kunnen plaatsen.