Inlogsysteem met MySQL
1. Database
2. Form Verwerken
3. Login-Functie
4. Uitloggen
Voor een leden systeem met mysql heb je natuurlijk een tabel nodig ;-).
Dit is een kleine tabel met alles wat we zullen gebruiken:
|
CREATE TABLE `leden` (
`userId` int(11) NOT NULL auto_increment,
`userName` varchar(255) NOT NULL default '',
`userPass` varchar(255) NOT NULL default '',
KEY `userId` (`userId`)
) TYPE=MyISAM;
|
Dit hoeft denk ik geen verdere uitleg.
Voeg alvast een gebruikersnaam en paswoord in:
|
INSERT INTO `leden` ( `userId` , `userName` , `userPass` )
VALUES (
'', 'SickBoy', 'ab4f63f9ac65152575886860dde480a1'
);
|
Een id komt vanzelf (auto_increment), een gebruikersnaam, en de md5 van een paswoord (hier 'azerty').
top
2. Form Verwerken
Voor een form te verwerken moeten we natuurlijk eerst een form hebben, ik heb gebruik gemaakt van deze:
|
<form method="post" action="action.php" id="Login">
<input type="text" name="pUser" value="" size="15" />
<input type="password" name="pPass" value="" size="15" />
<input type="hidden" value="login" name="pAction" />
<input type="submit" name="pSubmit" value="Login" />
</form>
|
Een naam-vakje, een paswoord-vakje, een action-vakje en een knop.
Als je je afvraagt waarom er telkens een 'p' voor de naam staat: dit is voor hosts die geen gebruik maken van register globals, zo hou je je variabelen uit mekaar ;-).
Ok, nu we een form hebben, vullen we allemaal gegevens in en gaan we ze verwerken:
|
<?php
ob_start(); //pas op voor header-fouten
session_start(); //en voor sessie-fouten ^^
$dbConnect = mysql_connect("localhost", "Naam", "Wachtwoord") or die ("Verbinding mislukt");
mysql_select_db("DBnaam", $dbConnect);
$action = '';//variabel leegmaken voor de zekerheid
if(isset($_POST['pAction']))
{//Post moet gebruikt zijn
$action = $_POST['pAction'];
if($action == 'login')
{//inloggen
$user = $_POST['pUser'];
$password = md5($_POST['pPass']); //paswoord encrypten
$loginCheckQuery = mysql_query("SELECT userId, userName, userPass FROM leden WHERE userName='".$user."' AND userPass='".$password."'");
$results = mysql_num_rows($loginCheckQuery);
if ($results == 1) //gebruikersnaam en paswoord kloppen
{
while($loginFetch = mysql_fetch_array($query)) //alles selecteren
{
$_SESSION['sLogin'] = 1;
$_SESSION['sUser'] = $loginFetch['userName'];
$_SESSION['sUserId'] = $loginFetch['userId'];
$checkValue = md5('login'.$loginFetch['userId']); //speciale cookie (kijk hieronder
setcookie('cUserId', $loginFetch['userId'], time()+60*60*24*100,"/", ".domein.be"); //2 cookies, elk 100 dagen
setcookie('cCheck', $checkValue, time()+60*60*24*100,"/", ".domein.be");
setcookie('cPass', $loginFetch['userPass'], time()-60*60*24*100,"/", ".domein.be");
}
echo 'Succes!';
}else
{
echo 'Foute gebruikersnaam of paswoord!';
}
}else
{//andere actie of geen actie
header("Location:login.php");
}
}else
{//fout
header("Location:login.php");
}
?>
|
De uitleg:
1) Zoek een rij in de database waar de ingegeven gebruikersnaam en paswoord gebruikt worden.
2) indien een rij gevonden is => cookies en sessies zetten, indien geen rij gevonden is => foutbericht weergeven.
NB: Er worden 2 cookies gezet: 1 cookie die het userId bevat en 1 cookie die de md5 van het userId en een bepaalde key bevat, om te controleren of deze cookies wel door de site zelf zijn gezet.
top
3. Login-Functie
Nu we onze cookies en sessies hebben geplaatst, moeten we een functie maken die controleert of we wel degelijk ingelogd zijn.
De volgende functie zorgt hiervoor:
|
<?php
function LogIn()
{
$cookieUserId = ''; //variabelen leegmaken voor de zekerheid
$cookieCheck = '';
$cookiePass = '';
if(isset($_COOKIE['cUserId']))
{
$cookieUserId = (int)$_COOKIE['cUserId'];
}
if(isset($_COOKIE['cCheck']) && preg_match("/^[a-z0-9]+$/i", $_COOKIE['cCheck']))
{
$cookieCheck = $_COOKIE['cCheck'];
}
if(isset($_COOKIE['cPass']) && preg_match("/^[a-z0-9]+$/i", $_COOKIE['cPass']))
{
$cookiePass = $_COOKIE['cPass'];
}
$checkGoodCookie = md5('login'.$cookieUserId);//cookie controle
if($checkGoodCookie == $cookieCheck && $cookiePass != '' && empty($_SESSION['sUserId']))
{ // wel cookie maar geen sessie
$checkQuery = mysql_query("SELECT userId, userName, userPass FROM leden WHERE userId='".$cookieCheck."' AND userPass='".$cookiePass."'") or die(mysql_error());
while($checkResults = mysql_fetch_array($checkQuery))
{//sessies zetten
$_SESSION['sLogin'] = 1;
$_SESSION['sUser'] = $checkResults['userName'];
$_SESSION['sUserId'] = $checkResults['userId'];
$checkValue = md5('login'.$checkResults['userId']);
//delete cookies
setcookie('cUserId', '', time()-60*60*24*100,"/");
setcookie('cCheck', '', time()-60*60*24*100,"/");
setcookie('cPass', '', time()-60*60*24*100,"/");
// zet nieuwe cookies
setcookie('cUserId', $checkResults['userId'];, time()+60*60*24*100,"/", ".domein.be");
setcookie('cCheck', $checkValue, time()+60*60*24*100,"/", ".domein.be");
setcookie('cPass', $checkResults['userPass'], time()-60*60*24*100,"/", ".domein.be");
}
return TRUE;
}elseif($checkGoodCookie == $cookieCheck && $cookiePass != '' && isset($_SESSION['userId']) && is_numeric($_SESSION['userId']))
{//sessie en cookie
$checkValue = md5('login'.$_SESSION['userId']);
$setPassCookie = $cookiePass;
//delete cookies
setcookie('cUserId', '', time()-60*60*24*100,"/");
setcookie('cCheck', '', time()-60*60*24*100,"/");
setcookie('cPass', '', time()-60*60*24*100,"/");
// zet nieuwe cookies
setcookie('cUserId', $_SESSION['userId'], time()+60*60*24*100,"/", ".domein.be");
setcookie('cCheck', $checkValue, time()+60*60*24*100,"/", ".domein.be");
setcookie('cPass', $setPassCookie, time()+60*60*24*100,"/", ".domein.be");
return TRUE;
}else
{
return FALSE;
}
}
?>
|
De uitleg staat erbij, ik hoop dat die voldoende is. Nu moet je gewoon de functie LogIn() aanroepen om te kijken of je ingelogd bent (let op: bij cookies staat een domeinnaam!).
top
1. Uitloggen
Als je een irritant familielid hebt dat graag eens onder jouw gebruikersnaam ongepaste zaken zegt, dan zal je het leuk vinden wanneer er een log-uit knop bestaat.
Begin alvast met een link te maken:
|
<a href="action.php?a=logout">Log uit </a>
|
We breiden action.php een beetje uit:
|
<?php
ob_start(); //pas op voor header-fouten
session_start(); //en voor sessie-fouten ^^
$dbConnect = mysql_connect("localhost", "Naam", "Wachtwoord") or die ("Verbinding mislukt");
mysql_select_db("DBnaam", $dbConnect);
$action = '';//variabel leegmaken voor de zekerheid
$a = '';
if(isset($_POST['pAction']))
{//met Post
$action = $_POST['pAction'];
if($action == 'login')
{//inloggen
$user = $_POST['pUser'];
$password = md5($_POST['pPass']); //paswoord encrypten
$loginCheckQuery = mysql_query("SELECT userId, userName, userPass FROM leden WHERE userName='".$user."' AND userPass='".$password."'");
$results = mysql_num_rows($loginCheckQuery);
if ($results == 1) //gebruikersnaam en paswoord kloppen
{
while($loginFetch = mysql_fetch_array($query)) //alles selecteren
{
$_SESSION['sLogin'] = 1;
$_SESSION['sUser'] = $loginFetch['userName'];
$_SESSION['sUserId'] = $loginFetch['userId'];
$checkValue = md5('login'.$loginFetch['userId']); //speciale cookie (kijk hieronder
setcookie('cUserId', $loginFetch['userId'], time()+60*60*24*100,"/", ".domein.be"); //2 cookies, elk 100 dagen
setcookie('cCheck', $checkValue, time()+60*60*24*100,"/", ".domein.be");
setcookie('cPass', $loginFetch['userPass'], time()-60*60*24*100,"/", ".domein.be");
}
echo 'Succes!';
}else
{
echo 'Foute gebruikersnaam of paswoord!';
}
}else
{//andere actie of geen actie
header("Location:login.php");
}
}elseif(isset($_GET['a']))
{//met Get
$a = $_GET['a'];
if($action2 == 'logout' && LogIn())
{//uitloggen
session_unset();//sessies legen
session_destroy();//sessies verwijderen
setcookie('cUserId','', time()-60*60*24*100,'/');//cookies verwijderen
setcookie('cCheck', '', time()-60*60*24*100,'/');
setcookie('cPass', '', time()-60*60*24*100,'/');
echo 'Je bent uitgelogd';
}else
{//niet ingelogd of foute waarde
header("Location:login.php");
}
}else
{//fout
header("Location:login.php");
}
?>
|
Indrukken die handel, en als alles goed gaat ben je uitgelogd.
Ziezo, dat was het. Vanaf nu kan je veilig in- en uit-loggen.
Als je nog vragen hebt, plaats ze dan hier, stuur een privébericht of zend een postduif uit.
top
|