Inlog- en registratie script
Naar aanleiding van
is dit artikel tot stand gekomen waarin uitgelegd wordt hoe je een op PHP en MySql
gebaseerd memberssysteem kan maken.
In dit artikel zal echter stapsgewijs naar het resultaat toe worden gewerkt.
Ben je dus onbekend met PHP en MySql, of ben je nieuw met PHP en MySql en weet je
niet waar je moet beginnen wanneer je een members-script wil maken?
Dan zou het doornemen van dit artikel een ideale oplossing kunnen zijn.
Zoals gezegd zal er stap voor stap worden gewerkt, met tussendoor en na
het uiteindelijk resultaat enkele tips/suggesties.
Aan het eind is het gehele script te downloaden waarin de tabs en
overzichtelijkheid behouden zijn gebleven en het dus eenvoudiger aan te passen is.
Maar nu eerst het echte werk.
Stap 1, hoe begin ik?
Je moet voor jezelf eerst weten wat je wil, dus met welke gegevens moet men inloggen en welke gegevens moet men opgeven bij het registreren?
Handig is dus om eerst te bepalen hoe je tabel in je MySql-database er uit komt te zien waarin de gegevens worden opgeslagen. In dit artikel willen we een loginnaam en passwoord weten, onze tabel noemen we members. Het tabel krijgt dus twee velden plus de standaardveld ‘id’. Je query om je tabel te creëren wordt dus;
CREATE TABLE members (
id int(10) unsigned NOT NULL auto_increment,
inlognaam varchar(50) default NULL,
passwoord varchar(20) default NULL,
PRIMARY KEY (id)
) TYPE=MyISAM;
kleine uitleg;
De hoofdletters die hierin gebruikt worden zijn ter verduidelijking van de commando’s.
Zoals gezegd is ‘id’ een standaardveld, omdat een waarde in deze veld enkel een getal kan zijn, gebruiken we hiervoor het type int(), tussen haakjes komt het aantal maximaal karakters dat een waarde in dit veld kan bevatten. ‘Auto_increment’ betekent letterlijk ‘zelf toename’, de waarde neemt dus vanzelf met één toe wanneer er een nieuwe waarde wordt ingevoegd, dit om elke rij in die tabel uniek te kunnen maken. De velden inlognaam en passwoord krijgen het type VARCHAR (dit betekent dat de waarden in die velden een variabele aantal karakters kunnen krijgen) met tussen haakjes wederom het maximaal aantal karakters dat een waarde mag hebben. Mocht je niet meer weten wanneer je over tabel, veld of rij spreekt, bekijk dan eens onderstaand afbeelding;
Als je niet bekend bent met MySql, wanneer je (of je host) met phpMyAdmin werkt kun je de ‘create table’-query uitvoeren door op de volgende afbeelding te klikken;
In phpMyAdmin 2.6.1 verschijnt dan een pop-up met een tekstveld waarin je deze query kunt plaatsen en uitvoeren.
Voor meer uitleg hierover zou je eens op google kunnen zoeken. We gaan snel door naar de volgende stap voordat het te vermoeiend wordt, we willen immers ons systeem zo snel mogelijk online hebben!
Stap twee, het maken van een inlogformulier.
Dit is nog puur (x)html, op w3schools.com kun je wat meer informatie vinden over formulieren en input-typen, deze site is ook handig om als naslagwerk te gebruiken. De opbouw van een formulier is daar ook te vinden, dus wij gaan hier snel door. Om het formulier er netjes uit te laten zien kun je gebruik maken van tabellen;
<form method=”post”>
<table>
<tr><th colspan=”2″>Inloggen</th></tr>
<tr><td>Inlognaam</td><td><input type=”text” name=”inlognaam” size=”15″></td></tr>
<tr><td>Passwoord</td><td><input type=”password” name=”passwoord” size=”15″></td></tr>
<tr><td></td><td><input type=”submit” value=”Inloggen”></td></tr>
</table></form>
De inlognaam-input-type is gewoon ’text’, de passwoord-input-type is natuurlijk ‘password’ zodat andere mensen niet kunnen zien wat voor passwoord er ingevoerd wordt.
Natuurlijk doet dit formulier nog niets, want de gegevens worden nergens opgevangen. Om dit te doen geven we het formulier een actie waar de gegevens naartoe moeten, daar vangen we de gegevens vervolgens op zodat we het kunnen vergelijken met de gegevens uit de database. Dit kan zo;
<form action=”?actie=inloggen” method=”post”>
Het formulier wordt nu naar dezelfde pagina verstuurd. ‘actie=inloggen’ gebruik ikzelf vaak om te kunnen controleren of er een actie gaande is, zoniet, dan toon ik het formulier, kleine voorbeeld;
<?php
if ($_GET[‘actie’] == ‘inloggen’) {
// opgestuurde gegevens vergelijken met gegevens uit database
} else {
// als er geen actie is, dan wordt het formulier getoond.
}
?>
We kunnen direct query’s maken om de opgestuurde gegevens te vergelijken met de gegevens in de database, maar er staat nog niets in die database dus er valt vanzelfsprekend nog niets te vergelijken. Een logische stap is dus om eerst ervoor te zorgen dat men zich kan registreren zodat er gegevens in de database kunnen worden gestopt.
Stap drie, registreren
We zijn hier wederom een formuliertje nodig waarmee men enkele gegevens op kunnen sturen.
We weten nu hoe een formulier gemaakt wordt. Het registratie-formulier zullen we ietsje uitbreiden. Men kan hier een voorkeurspasswoord invullen, maar omdat de input-type hiervan ‘password’ is, kan men niet zien of ze het goed invullen, ze kunnen immers door het snelle typen een typefout maken. Wat je dus kunt doen (en veel gedaan wordt) is een extra passwoord-controleveld maken en deze waarden na het versturen met elkaar vergelijken. Het formulier komt er dan als volgt uit te zien;
<?php
echo “<form action=””.$_SERVER[‘PHP_SELF’].”?actie=registreren” method=”post”>
<table>
<tr><th colspan=”2″>Registreren</th></tr>
<tr><td>Inlognaam</td><td><input type=”text” name=”inlognaam” size=”15″></td></tr>
<tr><td>Passwoord</td><td><input type=”password” name=”passwoord” size=”15″></td></tr>
<tr><td>Passwoord <small>(controle)</small></td><td><input type=”password” name=”passwoord_controle” size=”15″></td></tr>
<tr><td></td><td><input type=”submit” value=”Registreer”></td></tr>
</table></form>”;
?>
Dit zal er voor het oog anders uit zien dan het vorige formulier, aangezien er allemaal slashes in staan, dit is om de dubbele aanhalingstekens die er in staan, te ‘backslashen’ of ‘escapen’, zoals dat wordt genoemd. Alles wat je op het scherm wilt hebben plaats je namelijk tussen de dubbele aanhalingstekens van de echo “”, wanneer er dan een verdwaalde dubbele aanhalingsteken tussenstaat denkt het script dat de echo is afgelopen terwijl dat niet zo is, het gevolg is dat je script niet werkt en je een leuke error krijgt. Ook moet je zorgen dat er altijd een puntkomma volgt na het afsluiten van je echo.
Nieuw in deze formulier is $_SERVER[‘PHP_SELF’]?actie=waarde, SELF geeft al deels aan wat het ongeveer inhoudt. De variabele $_SERVER[‘PHP_SELF’] leest gewoon de pagina uit waarin het script wordt uitgevoerd, heet je pagina dus index.php, dan krijgt die variabele de waarde index.php. Het betekent dus niets anders dan dat de ingevoerde gegevens naar dezelfde pagina zullen worden verzonden.
Nu komt het echte werk. We moeten eerst zorgen dat we de ingevoerde waarden opvangen, we hebben het formulier de parameter actie=registreren gegeven, we kunnen dit nu dus makkelijk opvangen door te kijken wat de parameter is, dus als actie registreren is, dan moeten we het opvangen; if actie=registreren -> gegevens opvangen. In php wordt dat als volgt;
<?php
if ($_GET[‘actie’] == ‘registreren’) {
// gegevens opvangen
} else {
// anders, formulier tonen
}
?>
Je ziet dat we evenveel geopende accolades hebben ({) als gesloten accolades (}). Als dit niet het geval is, zul je op een error stuiten.
De opbouw is dus makkelijk, if ($_GET[‘actie’] == ‘registreren’) is een if-statement, alles wat er moet gebeuren als die statement klopt (= true) moet je tussen een geopende en gesloten accolade zetten. Als de statement niet klopt (= false) kun je een andere if-statement gebruiken of een else-statement, ‘else’ is engels voor ‘anders’, dus je zou het kunnen lezen als ‘in elk ander geval’;
als actie==registreren {
doe dit
} in elk ander geval {
doe dat
}
We kunnen nu de ingevoerde gegevens in de database zetten, maar als men vergeten is een veld in te vullen heb je dus lege rijen in je database. Voordat we het in de database zetten kijken we dus eerst of de variabele wel een waarde bevat of dat de variabele leeg is. Ook hier is een functie voor, welke een engelse benaming heeft, namelijk empty, wederom kun je met een statement kijken of een variabele leeg is;
if (empty($variabele)) {
// als de variabele geen waarde bevat
echo “de variabele is leeg.”;
} else {
// in elk ander geval
echo “de variabele bevat een waarde namelijk “.$variabele.”.”;
}
Om te kijken of er wel een inlognaam en passwoord is ingevuld moeten we weten wat de namen waren van onze input-velden in het formulier, dit waren ‘inlognaam’, ‘passwoord’ en ‘passwoord_controle’. Onze statement wordt;
if (empty($_POST[‘inlognaam’])) {
echo “Je hebt geen inlognaam ingevuld, <a href=””.$_SERVER[‘PHP_SELF’].”?actie=registreren”>Probeer nogmaals</a>.”;
} else if (empty($_POST[‘passwoord’])) {
echo “Je hebt geen passwoord ingevuld, <a href=””.$_SERVER[‘PHP_SELF’].”?actie=registreren”>Probeer nogmaals</a>.”;
} else if (empty($_POST[‘passwoord_controle’])) {
echo “Je moet ter controle ook het controleveld voor het passwoord invullen, <a href=””.$_SERVER[‘PHP_SELF’].”?actie=registreren”>Probeer nogmaals</a>.”;
} else {
// als alle velden zijn ingevuld
}
Uitleg:
Waarom ‘$_POST[‘inlognaam’]’? ‘$inlognaam’ zou ook kunnen werken, maar niet meer in elke versie van php. Hier gebruiken we superglobals, we gebruiken POST wanneer de method van het formulier post is, en GET wanneer de method van het formulier get is en de waarden weggeschreven worden in de url. Method post is dus vaak veiliger omdat men niet in de url kan zien welke gegevens opgestuurd worden en zijn voor bijvoorbeeld hackers minder makkelijk om te onderscheppen.
Nu hebben we alle mogelijke velden gecontroleerd op een waarde. Wanneer alle velden zijn ingevuld zal hij dus de laatste else-statement bereiken. Hier gaan we controleren of het ingevoerde passwoord overeenkomt met de controlepasswoord;
if ($_POST[‘passwoord’] != $_POST[‘passwoord_controle’]) {
echo “De ingevoerde passwoorden kwamen niet overeen, <a href=””.$_SERVER[‘PHP_SELF’].”?actie=registreren”>Probeer nogmaals</a>.”;
} else {
//gegevens in database stoppen
}
Nu nog de gegevens in de database stoppen, hier is de INSERT-qeury voor; INSERT INTO tabelnaam (veld1, veld2) VALUES (‘”.$variabele1.”‘, ‘”.$variabele2.”‘).
Met ‘mysql_query(query)’ voer je de query uit. We willen natuurlijk ook dat men een melding krijgt zodra de gegevens in de database zijn gestopt, in zijn totaliteit krijgen we dan;
$registreer = “INSERT INTO members (inlognaam, passwoord) VALUES (‘”.$_POST[‘inlognaam’].”‘, ‘”.$_POST[‘passwoord’].”‘)”;
mysql_query($registreer) or die(mysql_error());
echo “Uw gegevens zijn succesvol opgeslagen! Klik <a href=””.$_SERVER[‘PHP_SELF’].””>hier</a> om in te kunnen loggen.”;
Het script-gedeelte voor registreren ziet er nu als volgt uit;
if ($_GET[‘actie’] == ‘registreren’) {
// als men zich wil registreren
if ($_GET[‘versturen’] == ‘ja’) {
// als formulier reeds is verstuurd
if (empty($_POST[‘inlognaam’])) {
echo “Je hebt geen inlognaam ingevuld, <a href=””.$_SERVER[‘PHP_SELF’].”?actie=registreren”>Probeer nogmaals</a>.”;
} else if (empty($_POST[‘passwoord’])) {
echo “Je hebt geen passwoord ingevuld, <a href=””.$_SERVER[‘PHP_SELF’].”?actie=registreren”>Probeer nogmaals</a>.”;
} else if (empty($_POST[‘passwoord_controle’])) {
echo “Je moet ter controle ook het controleveld voor het passwoord invullen, <a href=””.$_SERVER[‘PHP_SELF’].”?actie=registreren”>Probeer nogmaals</a>.”;
} else {
if ($_POST[‘passwoord’] != $_POST[‘passwoord_controle’]) {
echo “De ingevoerde passwoorden kwamen niet overeen, <a href=””.$_SERVER[‘PHP_SELF’].”?actie=registreren”>Probeer nogmaals</a>.”;
} else {
$registreer = “INSERT INTO members (inlognaam, passwoord) VALUES (‘”.$_POST[‘inlognaam’].”‘, ‘”.$_POST[‘passwoord’].”‘)”;
mysql_query($registreer) or die(mysql_error());
echo “Uw gegevens zijn succesvol opgeslagen! Klik <a href=””.$_SERVER[‘PHP_SELF’].””>hier</a> om in te kunnen loggen.”;
}
}
} else {
// als formulier nog niet is verstuurd, toon registratieformulier
echo “<form action=””.$_SERVER[‘PHP_SELF’].”?actie=registreren&versturen=ja” method=”post”>
<table>
<tr><th colspan=”2″>Registreren</th></tr>
<tr><td>Inlognaam</td><td><input type=”text” name=”inlognaam” size=”15″></td></tr>
<tr><td>Passwoord</td><td><input type=”password” name=”passwoord” size=”15″></td></tr>
<tr><td>Passwoord <small>(controle)</small></td><td><input type=”password” name=”passwoord_controle” size=”15″></td></tr>
<tr><td></td><td><input type=”submit” value=”Registreer”></td></tr>
</table></form>”;
}
}
Stap vier, inloggen.
Er kunnen nu gegevens in de database worden gezet, het inlog-formulier hebben we in stap twee al gemaakt, nu moeten we dus de opgestuurde gegevens gaan vergelijken met de gegevens uit de database.
Men heeft dus een inlognaam en passwoord ingevuld, we kunnen op twee manier kijken of de gegevens in de database staan en bij elkaar horen. De eerste is door de ingevulde passwoord uit de database te halen en de bijbehorende inlognaam in die rij vergelijken met de ingevulde inlognaam, of andersom. Mijn voorkeur gaat uit naar de tweede optie. We gaan dus alle gegevens uit de database selecteren waar de inlognaam gelijk is aan de opgestuurde inlognaam;
$query= “SELECT * FROM members WHERE inlognaam='”.$_POST[‘inlognaam’].”‘”;
Het resultaat is nu nog enkel geselecteerd, we moeten het nu dus uitvoeren;
$resultaat = mysql_query($query) OR die (“Kon geen verbinding maken met MySQL”);
We kunnen nu kijken of er uberhaupt een waarde in de database staat die overeenkomt met de ingevulde inlognaam;
$aantal = mysql_num_rows($resultaat);
Zoniet, dan is er geen resultaat;
if ($aantal == ‘0’) {
echo “Er was geen resultaat gevonden, inlognaam bestaat niet.”;
} else {
// er is wel een resultaat gevonden, we kunnen nu kijken of het passwoord uit de database overeenkomt met de ingevoerde passwoord.
}
Als de inlognaam in de database staat, moeten we kijken of de passwoord dus overeenkomt. We moeten dus de velden van het resultaat opvangen;
$login = mysql_fetch_object($resultaat);
De bijbehorende passwoord kunnen we nu uitlezen met ‘objectvariabele->veldnaam’, dus $login->passwoord.
Wanneer het passwoord overeenkomt moeten we eerst een cookie zetten bij de bezoeker zodat hij niet op elke pagina opnieuw hoeft in te loggen. Vervolgens kun je de bezoeker doorsturen;
if($_POST[‘passwoord’] == $login->passwoord) {
// als gegevens kloppen met gegevens uit database, cookies setten en doorsturen!
setcookie(“inlognaam”, $_POST[‘inlognaam’], time() + 60*60); // cookie blijft 60 keer 60 seconden bestaan
setcookie(“passwoord”, $_POST[‘wachtwoord’], time() + 60*60);
echo “U bent succesvol ingelogd, een moment.. <META HTTP-EQUIV=”REFRESH” CONTENT=”2; URL=”.$redirect_pagina.””>”;
} else {
echo “Uw inloggegevens kloppen niet, klik <a href=””.$_SERVER[‘PHP_SELF’].””>hier</a> om nogmaals te proberen.”;
}
Dat is bijna alles wat we nodig hebben voor de inlog- & registratiepagina, uiteraard moet je zorgen dat alles in de goede volgorde staat. Het inlogformulier mag bijvoorbeeld alleen getoond worden als er nog niet is ingelogd en als men niet wil registreren. Voor het registratie-gedeelte hadden we dit al gedaan;
<?php
if ($_GET[‘actie’] == ‘registreren’) {
// gegevens opvangen
} else {
// anders, formulier tonen
}
?>
Het eigenlijke script wordt dus;
<?php
// waar moet de bezoeker heengestuurd worden nadat hij/zij succesvol ingelogd is ?
$redirect_pagina = “pagina.php”;
if ($_GET[‘actie’] == ‘inloggen’) {
// als inlogformulier is verstuurd
$sql = “SELECT * FROM members WHERE inlognaam='”.$_POST[‘inlognaam’].”‘”;
$resultaat = mysql_query($sql) OR die (“Kon geen verbinding maken met MySQL”);
$aantal = mysql_num_rows($resultaat);
if ($aantal == ‘0’) {
// als er geen resultaat is gevonden
echo “Het door u ingevulde inlognaam bestaat niet.”;
} else {
$login = mysql_fetch_object($resultaat);
$login->passwoord;
$login->inlognaam;
if($_POST[‘passwoord’] == $login->passwoord) {
// als gegevens kloppen met gegevens uit database, cookies setten en doorsturen!
setcookie(“inlognaam”, $_POST[‘inlognaam’], time() + 60*60); // cookie blijft 60 keer 60 seconden bestaan
setcookie(“passwoord”, $_POST[‘wachtwoord’], time() + 60*60);
echo “U bent succesvol ingelogd, een moment.. <META HTTP-EQUIV=”REFRESH” CONTENT=”2; URL=”.$redirect_pagina.””>”;
} else {
echo “Uw inloggegevens kloppen niet, klik <a href=””.$_SERVER[‘PHP_SELF’].””>hier</a> om nogmaals te proberen.”;
}
}
} else if ($_GET[‘actie’] == ‘registreren’) {
// als men zich wil registreren
if ($_GET[‘versturen’] == ‘ja’) {
// als formulier reeds is verstuurd
if (empty($_POST[‘inlognaam’])) {
echo “Je hebt geen inlognaam ingevuld, <a href=””.$_SERVER[‘PHP_SELF’].”?actie=registreren”>Probeer nogmaals</a>.”;
} else if (empty($_POST[‘passwoord’])) {
echo “Je hebt geen passwoord ingevuld, <a href=””.$_SERVER[‘PHP_SELF’].”?actie=registreren”>Probeer nogmaals</a>.”;
} else if (empty($_POST[‘passwoord_controle’])) {
echo “Je moet ter controle ook het controleveld voor het passwoord invullen, <a href=””.$_SERVER[‘PHP_SELF’].”?actie=registreren”>Probeer nogmaals</a>.”;
} else {
if ($_POST[‘passwoord’] != $_POST[‘passwoord_controle’]) {
echo “De ingevoerde passwoorden kwamen niet overeen, <a href=””.$_SERVER[‘PHP_SELF’].”?actie=registreren”>Probeer nogmaals</a>.”;
} else {
$registreer = “INSERT INTO members (inlognaam, passwoord) VALUES (‘”.$_POST[‘inlognaam’].”‘, ‘”.$_POST[‘passwoord’].”‘)”;
mysql_query($registreer) or die(mysql_error());
echo “Uw gegevens zijn succesvol opgeslagen! Klik <a href=””.$_SERVER[‘PHP_SELF’].””>hier</a> om in te kunnen loggen.”;
}
}
} else {
// als formulier nog niet is verstuurd, toon registratieformulier
echo “<form action=””.$_SERVER[‘PHP_SELF’].”?actie=registreren&versturen=ja” method=”post”>
<table>
<tr><th colspan=”2″>Registreren</th></tr>
<tr><td>Inlognaam</td><td><input type=”text” name=”inlognaam” size=”15″></td></tr>
<tr><td>Passwoord</td><td><input type=”password” name=”passwoord” size=”15″></td></tr>
<tr><td>Passwoord <small>(controle)</small></td><td><input type=”password” name=”passwoord_controle” size=”15″></td></tr>
<tr><td></td><td><input type=”submit” value=”Registreer”></td></tr>
</table></form>”;
}
} else {
// inlogformulier
echo “<form action=””.$_SERVER[‘PHP_SELF’].”?actie=inloggen” method=”post”>
<table>
<tr><th colspan=”2″>Inloggen</th></tr>
<tr><td>Inlognaam</td><td><input type=”text” name=”inlognaam” size=”15″></td></tr>
<tr><td>Passwoord</td><td><input type=”password” name=”passwoord” size=”15″></td></tr>
<tr><td></td><td><input type=”submit” value=”Inloggen”></td></tr>
<tr><td></td><td><a href=””.$_SERVER[‘PHP_SELF’].”?actie=registreren”>Registreren</a></td></tr>
</table></form>”;
}
?>
Echter, er kunnen nu nog geen gegevens met de database worden uitgewisseld omdat er geen verbinding is met de database. De database en de tabel ‘members’ had je -als het goed is- al aangemaakt, je zult dus een pagina moeten maken die contact legt met de database en deze includen in het script. De pagina die contact legt met de database noem je bijvoorbeeld contactdb.php, die moet er dan als volgt uit komen te zien;
<?php
$host = “localhost”; //mysql locatie
$user = “”; //mysql gebruikersnaam
$pass = “”; //mysql wachtwoord
$db = “”; //mysql database
mysql_connect($host,$user,$pass) or die(mysql_error());
mysql_select_db($db);
?>
Nu moet je nog zorgen dat het script via dat bestand contact heeft met de database, dit kan door dit bestand te includen, zet helemaal bovenaan je inlog- & registratiescript het volgende (natuurlijk wel na <?php);
// sql connectie includen
include(‘contactdb.php’);
Stap vijf, pagina’s beveiligen.
De bedoeling van een members-gedeelte is natuurlijk dat alleen geregistreerde mensen op bepaalde pagina’s mogen komen. Die pagina’s kun je nu op een eenvoudige manier beveiligen, je bent bent enkel een statement nodig waarin je kijkt of de cookie aanwezig is en deze overeenkomt met de andere cookie die geplaatst waren na het succesvol inloggen.
<?php
// sql connectie includen
include(‘contactdb.php’);
// inlogpagina
$login_pagina = “login.php”;
$sql = “SELECT * FROM members WHERE inlognaam='”.$_COOKIE[‘inlognaam’].”‘”;
$resultaat = mysql_query($sql) OR die (“Kon geen verbinding maken met MySQL”);
$aantal = mysql_num_rows($resultaat);
if ($aantal == ‘0’) {
// de waarde van de aanwezige inlognaam-cookie bij de bezoeker komt niet overeen met een waarde uit de database
echo “Klik <a href=””.$login_pagina.””></a> om in te kunnen loggen.”;
} else {
$login = mysql_fetch_object($resultaat);
if ($_COOKIE[‘passwoord’] != $login->passwoord) || ($_COOKIE[‘inlognaam’] != $login->inlognaam)) {
echo “De cookies konden niet gecombineerd worden.”;
} else {
// de beveiligde inhoud tonen;
}
}
?>
Wanneer je al pagina’s klaar hebt liggen in enkel html en veel gebruikt maakt van dubbele quotes is het onbegonnen werk om voor elke quote een slash te plaatsen. Je kunt drie dingen doen;
1)
Voor je echo enkele quotes gebruiken, dus echo ‘Je tekst met dubbele quotes “, het script zal nu geen error ondervinden’;
2)
Even de php-modus verlaten, dus;
else {
// de beveiligde inhoud tonen;
?> Je tekst met dubbele quotes “, het script zal nu geen error ondervinden, deze tekst wordt gewoon getoond.
Zorg wel dat er na je tekst de php-tag staat, zodat het script wel de rest uit kan voeren en geen error ondervindt.
<?php
}
3)
De php-generator op deze site gebruiken om automatisch slashes te plaatsen voor dubbele quotes, klik hier.
Zorg dus dat je gewoon standaard dubbele quotes escaped wanneer je aan het scripten bent, op deze manier heb je ook een consquente manier van scripten.
Download zipbestand
Uiteraard is dit bestand ook in downloadformaat, hierin zitten login.php, connectdb.php, beveiligd.php en members.sql voor de table-query. Klik hier om het zip-bestand te dowloaden.
De bestanden zijn hierin met tabs gescript (in Notepad++) waardoor het script wat overzichtelijker oogt.
Tips
->Commentaar
Zoals je ziet ben ik in het script niet zuinig geweest met commentaar, wanneer je zelf eens iets schrijft of aanpast is het voor jezelf handig om dit ook niet te zijn, wanneer je namelijk aantekeningen plaatst bij sommige acties in het script, weet je later als je terugkijkt precies wat het script op dat punt doet. Ook kan het handiger zijn wanneer je script een error ondervindt, om deze sneller terug te vinden. Zoals je wellicht door hebt kun je in php commentaar plaatsen door twee slashes te plaatsen en daarachter het commentaar. Er zijn drie methodes om commentaar te plaatsen in php;
Manier 1;
// ruimte voor commentaar, alles wat op de volgende regel komt wordt weer gewoon meegenomen door het script
Manier 2;
# ruimte voor commentaar, alles wat op de volgende regel komt wordt weer gewoon meegenomen door het script
Manier 3;
/*
Ruimte voor grote lappen commentaar
Alles wat na het sterretje en slash komt wordt weer meegenomen door het script.
*/
->Eigenwijs
Iedereen heeft zijn eigen manier van scripten, voor de één erg onoverzichtelijk en onbegrijpelijk, voor de ander misschien weer volkomen begrijpelijk.
Zelf probeer ik altijd beknopt commentaar te plaatsen in scripts en maak ik gebruik van superglobals daar waar het nodig is, dus $_POST[‘variabele’] in plaats van $variabele, ook zet ik dit altijd binnen quotes;
zonder quotes;
echo “De variabele heeft de waarde $_POST[‘variabele’]”;
met quotes;
echo “De variabele heeft de waarde “.$_POST[‘variabele’].””;
Veel editors zorgen dan dat de variabelen gekleurd worden waardoor je scriptwerk overzichtelijker is, een tweede reden is dat het script weet dat het ook echt om een variabele gaat, beide heeft waarschijnlijk hetzelfde effect, maar door de steeds vernieuwde versies van php wordt het plaatsen van variabelen binnen quotes gewaardeerd, dus; “.$je_variabele.”.
Wat ik nooit doe is hele pagina’s echoën, hierdoor wordt je script alleen maar onnodig zwaar en kan het langer duren voordat het is uitgevoerd. Een voorbeeld, een basis van een pagina ziet er als volgt uit;
<html><head>
</head><body>
<div id=”menu”></div>
<div id=”content”></div>
</body></html>
Stop dit dus niet in elke echo, maar plaats het script op de plaats in je document waar je de formulieren en meldingen wilt hebben, in dit voorbeeld dus in je content-div.
Wat je kunt doen is het volgende;
<html><head>
</head><body>
<div id=”menu”></div>
<div id=”content”>
<?php
het script hier dus
?></div>
</body></html>
of
<html><head>
</head><body>
<div id=”menu”></div>
<div id=”content”>
<?php
include(‘login.php’);
?></div>
</body></html>
Dit is natuurlijk vele malen overzichtelijker. De laatste optie is vooral handig wanneer je iets wilt wijzigen, je hebt alles mooi gescheiden, wanneer je iets wilt wijzigen hoef je enkel door login.php te bladeren.
Uitbreidingen
Het script dat we hier hebben gemaakt is natuurlijk erg basic, dus er is genoeg ruimte voor uitbreidingen. Misschien heb je zelf al ideën of misschien moet je eerst inspiratie opdoen. Hier schotelen we alvast twee mogelijkheden voor.
->Inlogtijd
De tijd dat een persoon die is ingelogd, ingelogd blijft, is afhankelijk van de tijd dat de door jou geplaatste cookie blijft bestaan. We kijken even terug;
setcookie(“inlognaam”, $_POST[‘inlognaam’], time() + 60*60);
setcookie(“passwoord”, $_POST[‘wachtwoord’], time() + 60*60);
Een uur dus, de bezoeker blijft een uur ingelogd na ingelogd te zijn. Leuker is natuurlijk als de bezoeker zelf kan bepalen hoelang hij ingelogd blijft, hiervoor kunnen we een extra input-veld maken in het inlog-formulier. Omdat de tijd alleen bepaald wordt met getallen, kunnen we beter een veld maken waarbij de waarden al vast staan, bijvoorbeeld een selectbox, het volgende kun je dan invoegen;
<tr><td>inlogtijd</td><td><select name=”inlogtijd”>
<option value=”1800″>Half uur</option>
<option value=”3600″>Eén uur</option>
<option value=”7200″>Twee uur</option>
<option value=”14400″>Vier uur</option>
<option value=”86400″>Eén dag</option></td></tr>
Natuurlijk kun je meer toevoegen, het getal staat voor seconden, wil je dus een kwartier ingelogd blijven, dan moet je (15*60=)900 invullen. Het plaatsen van de cookie vervang je door
setcookie(“inlognaam”, $_POST[‘inlognaam’], time() + $_POST[‘inlogtijd’]); // cookie blijft 60 keer 60 seconden bestaan
setcookie(“passwoord”, $_POST[‘wachtwoord’], time() + $_POST[‘inlogtijd’]);
->Wachtwoord vergeten
Omdat je tegenwoordig overal een wachtwoord voor nodig bent, kan het wel eens voorkomen dat men een wachtwoord vergeten. Mocht dat het geval zijn, dan is een functie waarmee je je wachtwoord op kan vragen natuurlijk een ideale uitkomst. Maar hoe zet je dat nu weer in elkaar?
Het veiligst is om het wachtwoord te mailen, hiervoor ben je wel het emailadres nodig van de leden. Je zult dus eerst je tabel moeten wijzigen door het veld ‘emailadres’ toe te voegen, aan het registratieformulier de input-veld emailadres toe moeten voegen en natuurlijk je INSERT INTO-query aanpassen. Dan zorg je voor een link in je formulier waar men op kan klikken als ze hun wachtwoord zijn vergeten. De link zou je bijvoorbeeld onder ‘registreren’ kunnen plaatsen;
<tr><td></td><td><a href=””.$_SERVER[‘PHP_SELF’].”?actie=ww_vergeten”>Wachtwoord vergeten?</a></td></tr>
Nu zou je dus zelf een if-statement kunnen maken waarin je de parameter ww_vergeten opvangt;
if ($_GET[‘actie’] == ‘ww_vergeten’) {
$site = “”;
/*
zonder http://www., dus bijvoorbeeld google.com
Je kunt het From: gedeelte in de mail() functie natuurlijk aanpassen naar eigen wensen
*/
if ($_GET[‘versturen’] == ‘ja’) {
$sql = “SELECT * FROM members WHERE email='”.$_POST[‘emailadres’].”‘”;
$resultaat = mysql_query($sql) OR die (“Kon geen verbinding maken met MySQL”);
$aantal = mysql_num_rows($resultaat);
$rij = mysql_fetch_object($resultaat);
$passwoord = $rij->passwoord;
$inlognaam = ucfirst($rij->inlognaam);
$emailadres = htmlspecialchars($rij->emailadres);
if ($aantal == ‘0’) {
echo “Dit emailadres is bij ons niet bekend!”;
} else {
$bericht = “Beste “.$naam.”,
nn
Er is zojuist op “.$site.” met dit emailadres het bijbehorende passwoord opgevraagd.
nn
Onthoud of bewaar uw passwoord zorgvuldig en buiten bereik van anderen!
Uw passwoord is “.$passwoord.”.nn
Groet,n
“.$site.””;
mail($emailadres,”Wachtwoord opgevraagd”,$bericht,”From: “.$site.” <no_reply@”.$site.”>”);
echo “Er is een email met het bijbehorende passwoord verstuurd naar de door u opgegeven emailadres!”;
}
}else{
?>
<form method=”post” action=”<? echo “”.$_SERVER[‘PHPSELF’].”?actie=ww_vergeten&versturen=ja”; ?>”>
<table>
<tr>
<td>Emailadres:</td><td><input type=”text” name=”emailadres”></td>
</tr>
<tr>
<td></td><td><input type=”submit” name=”submit” value=”Opvragen”></td>
</tr>
</table>
</form>
<?php
}
}
Je hebt nu een hele lap tekst achter de kiezen dus tijd om het online uit te proberen!
Heb je alles stap voor stap doorgenomen maar kom je er niet uit? Wil je het script op andere manieren uitbreiden maar vind je op google of andere sites geen uitkomst?
Dan kun je natuurlijk hier terecht!
Stel je vraag duidelijk of omschrijf je probleem zo krachtig mogelijk,
dus wat heb je geprobeerd, wat heb je op papier (computer), wat wil je bereiken en
wat is het resultaat nu (krijg je bv een foutmelding, zo ja vermeld die,
of krijg je alleen maar het inlogformulier te zien, et cetera) ?
Wanneer je de hele code wilt kun je op deze pagina
terecht. Succes.
Duidelijk beschrijving waar een newbee wat aanheeft.
Reuze bedankt hiervoor !
groet
gerard
Ik heb een hekel aan techneuten die altijd alles beter weten, maar nu moet ik toch echt even ingrijpen. Je werkwijze is in elk geval op twee punten zwaar onveilig. In 2014 kon dit eigenlijk al niet meer, maar in 2018 kun je hiervoor zelfs een miljoenen-boete krijgen.
Je gebruikt invoer van de gebruiker ($_POST) en plakt die in je query. Dat kan echt niet! Hackers sturen een waarde op dat jouw select afsluit en een nieuwe query begint die je hele database delete. Gebruik DPO of Msqli en bind je parameters aan de query.
En je slaat leesbare wachtwoorden op in je database? Gebruik hashes en weer alleen PASSWORD_HASH zonder salt! Gewone hashes zijn gemaakt op snelheid en daarmee help je de hackers. Password hashes zijn gemaakt op TRAAGHEID en daarmee veiliger. Bij password_hash() van php is het beter geen ‘eigen’ salt te gebruiken. De interne salts die worden benut wanneer je geen salt meegeeft zijn veel beter.
En zo zijn er nog vele zaken die het maken van een inlog/registratie systeem tot een jungle maken. Nogmaals mijn excuses voor de onaardige reactie.
Je hebt volkomen gelijk. het gaat hier om een oud artikel wat nooit meer geüpdatet is. Nu is het een leuk artikel als je eens wilt kennismaken met het maken van zo’n systeem. Er wordt nergens beweerd dat dit voldoet aan enige eisen die anno 2018 worden gesteld. Die miljoenenboete dat is natuurlijk onzin. Want niemand gaat dit systeem gebruiken om zijn site te beveiligen. Toch bedankt voor de waarschuwing. Dat de lezer dit maar ter harte neemt.