Tutorials >
PHP >
Loginsysteem
|
Gepost op: 19 augustus 2006 - 14:16 |
|
|
|
PHP expert
|
het zit mooi en duidelijk in elkaar, maar toch 3 opmerkingen
1:
in is_email():
return ($match_local && $match_host ? true : false);
beetje onzinnig als je verkorte if's gaat gebruiken als je ze ook helemaal weg kan laten=>
return ($match_local && $match_host );
2:
als je nu een acount maakt en je verandert daarna je email weet je niet meer of het adres echt van die persoon is, je zou eigenlijk de account opnieuw moeten 'activeren'. of het registreeradres altijd onthouden. |
|
|
|
Gepost op: 19 augustus 2006 - 14:21 |
|
|
|
Erelid
|
1: dat is een codestijl, het is ook niet de bedoeling dat je deze code overneemt, maar dat je ze snapt.
2: dan moet je dat doen, als je de tutorial doorgelopen hebt weet je wanneer een account niet geactiveerd is en is het dus kinderspel om dit te doen. |
|
|
|
Gepost op: 21 augustus 2006 - 14:36 |
|
|
|
Moderator
|
Ik zou functies in een aparte include zetten, en niet declareren op het moment dat ik ze nodig heb .
Wat ik ook anders zou doen is die activatie-tabel. Uit het afwezig zijn van een gegeven kun je in principe niet zoveel afleiden - ik zou die activatie-hash onderbrengen in de gebruikers-tabel en een extra kolom "actief" of "is_actief" aanmaken. De tabel gebruikers_activaties is dan in principe overbodig.
Bij registratie: vul hash en zet "actief" op 0.
Bij activeren: controleer hash en (als deze klopt) reset deze hash en zet "actief" op 1 (zodat men deze hash niet opnieuw kan gebruiken om het account actief te maken).
Je kunt dan later (m.b.v. "actief") accounts van mensen weer de-activeren mocht dit nodig zijn. |
|
|
|
Gepost op: 21 augustus 2006 - 14:52 |
|
|
|
Erelid
|
Waarom EN een hash EN een actief veld? Als de hash er is is hij niet actief en anders wel, daar heb je geen 2 velden voor nodig?
Ik doe dit in een aparte tabel ivm plaatsbesparing. Als je 5000 leden hebt, waar er 4980 accounts geactiveerd zijn, zijn dat 4980 kolommen die geen nut hebben (of ik jouw geval 9960). In mijn geval zijn er slechts 20 rijen van 2 kolommen, wat dus 40 velden maakt.
Overigens schrijf ik ook ergens in m'n tutorial dat het verstandig is om functies in een apart bestand te declareren, zo doe ik het ook altijd. |
|
|
|
Gepost op: 21 augustus 2006 - 16:09 |
|
|
|
Moderator
|
Citaat: Waarom EN een hash EN een actief veld? Omdat het twee verschillende doelen dient.
Citaat: Als de hash er is is hij niet actief en anders wel, daar heb je geen 2 velden voor nodig? En wat als je een account wilt uitschakelen (waarmee je dus in feite een e-mailadres onbruikbaar maakt)? Hoe kun je dat bij jouw opzet aangeven? Het beste lijkt mij om één "hoofdschakelaar" per account te hebben: "actief" (0 of 1).
Citaat: Ik doe dit in een aparte tabel ivm plaatsbesparing. Als je 5000 leden hebt, waar er 4980 accounts geactiveerd zijn, zijn dat 4980 kolommen die geen nut hebben (of ik jouw geval 9960). In mijn geval zijn er slechts 20 rijen van 2 kolommen, wat dus 40 velden maakt. Na de activatie zou je deze kolom voor een lost- of reset-pass hash kunnen gebruiken, zodat het af en toe nog enig doel dient. Lege kolommen nemen volgens mij geen ruimte in dacht ik?
Citaat: Overigens schrijf ik ook ergens in m'n tutorial dat het verstandig is om functies in een apart bestand te declareren, zo doe ik het ook altijd. Goed voorbeeld doet goed volgen . Geef dus het goede voorbeeld ;). |
|
|
|
Gepost op: 21 augustus 2006 - 16:46 |
|
|
|
Erelid
|
Citaat: Omdat het twee verschillende doelen dient. IMO niet
Citaat: En wat als je een account wilt uitschakelen Daar bestaan rechtenmodellen en zo voor? De bedoeling van deze tutorial is om mensen de basis logica bij een loginsysteem aan te geven. Eens je door hebt dat je gegevens kan opvragen met de sessievariabelen is een basis rechtenmodel waar bv. level 0 'inactief' is geen probleem?
Citaat: Na de activatie zou je deze kolom voor een lost- of reset-pass hash kunnen gebruiken, zodat het af en toe nog enig doel dient. Of het gewoon niet gebruiken, dan moet het ook niet geforceerd tot enig nut gaan dienen.
Citaat: Lege kolommen nemen volgens mij geen ruimte in dacht ik? Wel op je scherm (databasebeheer)
Citaat: Goed voorbeeld doet goed volgenĀ . Geef dus het goede voorbeeld ;). Als mensen de code klakkeloos willen overnemen zonder aandacht te besteden aan de opmerkingen waarin dergelijke zaken staan moeten ze daar zelf maar de gevolgen van dragen. Ik kan niet voor iedereen's scenario een tutorial voorzien. De ene persoon werkt met templatepower, de andere niet. De ene heeft een persoonlijke library structuur, de andere niet.
Ieder moet gewoon voor zich de code analyseren, het snappen het zelf maken imo. Anders had ik het wel gewoon bij de scripts gepost en dan was de opzet wel iets groter geweest. |
|
|
|
Gepost op: 22 augustus 2006 - 11:36 |
|
|
|
Onbekend
|
$_SESSION = array();
session_destroy();
$_SESSION is toch al een array?
Waarom gebruik je htmlentities() voor <form action=""> ?
Je foutcontrole vind ik niet echt super ofzo. Beetje goedkoop. |
|
|
|
Gepost op: 22 augustus 2006 - 11:37 |
|
|
|
Erelid
|
True. Met $_SESSION = array() is hij terug leeg |
|
|
|
Gepost op: 22 augustus 2006 - 11:39 |
|
|
|
Onbekend
|
Ja, maar daarna gooi je de sessie weg (destroy), dus heb je ook al de beginwaarde. De regel is dus niet nodig.
Ik ben het verder met FangorN eens dat je actief als aparte kolom in je gebruikerstabel moet zetten, maar niet in een aparte tabel.
isset($_SESSION['gebruiker']))
Ik vind dit echt veel te zwak. Ik zou loginsessies ook bijhouden in een tabel. Sla ook het ip en een controlegetal op en vergelijk deze met elkaar (sessie en db (en $_SERVER['REMOTE_ADDR'])). Bij elke pageview een ander controlegetal nadat de controle oke is.
Gebruikersnaam niet opslaan in sessie, maar alleen gebruikers_id. Dat is voldoende. |
|
|
|
Gepost op: 22 augustus 2006 - 11:46 |
|
|
|
Erelid
|
Mjah okey die $_SESSION array legen en dan destroyen is inderdaad wel dom, heb dat even aangepast.
Maar die activatietabel ga ik echt niet aanpassen, dat is een kwestie van persoonlijke voorkeur en niet het beter functioneren en het netter uitzien van je code. |
|
|
|
Gepost op: 24 augustus 2006 - 13:23 |
|
|
|
PHP expert
|
|
|
|
Gepost op: 24 augustus 2006 - 13:46 |
|
|
|
Erelid
|
Omdat het over 1 regel HTML gaat. Als het over meerdere lijnen gaat zet ik de HTML wel buiten PHP. |
|
|
|
Gepost op: 24 augustus 2006 - 13:50 |
|
|
|
PHP expert
|
ja maar ergens anders heb je ook over 1 lijn html buiten php als ik het me goed herinner. |
|
|
|
Gepost op: 24 augustus 2006 - 13:56 |
|
|
|
Erelid
|
|
|
|
Gepost op: 12 december 2006 - 21:32 |
|
|
|
Nieuw lid
|
heb een vraag wat is de code om een pagina alleen kan kijken als je ingelogd bent
|
|
|
|
Gepost op: 02 januari 2007 - 23:53 |
|
|
|
Erelid
|
Leer lezen...
Citaat: Op het controlepaneel moet eerst en vooral gecontroleerd worden of we wel ingelogged zijn. Dit doe je simpelweg als volgt:
[en hier staat dan de code] |
|
|
|
Gepost op: 08 januari 2007 - 19:28 |
|
|
|
Nieuw lid
|
Alles goed uitgelegd toppie:). Heb al het een en ander geleerd.
Maar(nu komt het)
Ik blijf een loop krijgen:
login -> u bent ingelogd ga naar controlepaneel.php -> u bent niet ingelogd klik hier om u in te loggen:@
Ik heb het script en de uitleg wel 1000 keer doorgelezen en ik zie de fout maar niet:(
Hieronder controlepanneel.php:
<?php
include "connect.php";
session_start();
// Zorg dat hierboven ERGENS session_start() staat!
if(isset($_SESSION['gebruiker'])) {
// E-mailadres bijwerken:
// De variabele fout aanmaken om fouten ivm 'undefined variable' te voorkomen
$fout = '';
if($_SERVER['REQUEST_METHOD'] == 'POST') {
// Zelfde functie als bij registratie
// Een globale functies.php waarin je al je functies gooit is dus wel handig
function is_email($in) {
list($local, $host) = explode('@', $in);
$pattern_local = '^([0-9a-z]*([-|_]?[0-9a-z]+)*)(([-|_]?)\.'
. '([-|_]?)[0-9a-z]*([-|_]?[0-9a-z]+)+)*([-|_]?)$';
$pattern_host = '^([0-9a-z]+([-]?[0-9a-z]+)*)(([-]?)\.([-]?)'
. '[0-9a-z]*([-]?[0-9a-z]+)+)*\.[a-z]{2,4}$';
$match_local = eregi($pattern_local, $local);
$match_host = eregi($pattern_host, $host);
return ($match_local && $match_host ? true : false);
}
if(!is_email($_POST['email'])) {
$fout = 'Geen geldig e-mailadres!';
} else {
mysql_query("UPDATE gebruikers SET
email = '".mysql_real_escape_string($_POST['email'])."'
WHERE id = ".$_SESSION['gebruiker']);
// Vervolgens moet de pagina vernieuwd worden.
header('Location: '.$_SERVER['REQUEST_URI']);
}
} else {
// Het formulier is nog niet verzonden, dus vullen we het veldje met het huidig e-mailadres
$email = mysql_result(mysql_query("SELECT email FROM gebruikers WHERE id = ".$_SESSION['gebruiker']),0);
}
?>
<h1>Welkom, <?=htmlentities($_SESSION['gebruikersnaam'])?>!</h1>
Wijzig je e-mailadres:
<?=$fout?>
<form action="<?=htmlentities($_SERVER['REQUEST_URI'])?>" method="post">
<input type="text" name="email" value="<?=htmlentities($email)?>" />
<input type="submit" value="Bijwerken" />
</form>
<a href="uitloggen.php" onclick="return confirm('Ben je zeker dat je je wilt afmelden?');">Uitloggen</a>
<?php
} else {
echo 'Je bent niet ingelogged, klik <a href="login.php">hier</a> om dit te doen.';
}
?>
<?php include "connect.php"; // Zorg dat hierboven ERGENS session_start() staat! if(isset($_SESSION['gebruiker'])) { // E-mailadres bijwerken: // De variabele fout aanmaken om fouten ivm 'undefined variable' te voorkomen $fout = ''; if($_SERVER['REQUEST_METHOD'] == 'POST') { // Zelfde functie als bij registratie // Een globale functies.php waarin je al je functies gooit is dus wel handig function is_email($in) { $pattern_local = '^([0-9a-z]*([-|_]?[0-9a-z]+)*)(([-|_]?)\.' . '([-|_]?)[0-9a-z]*([-|_]?[0-9a-z]+)+)*([-|_]?)$'; $pattern_host = '^([0-9a-z]+([-]?[0-9a-z]+)*)(([-]?)\.([-]?)' . '[0-9a-z]*([-]?[0-9a-z]+)+)*\.[a-z]{2,4}$'; $match_local = eregi($pattern_local, $local); $match_host = eregi($pattern_host, $host); return ($match_local && $match_host ? true : false); } if(!is_email($_POST['email'])) { $fout = 'Geen geldig e-mailadres!'; } else { WHERE id = ".$_SESSION['gebruiker']); // Vervolgens moet de pagina vernieuwd worden. header('Location: '.$_SERVER['REQUEST_URI']); } } else { // Het formulier is nog niet verzonden, dus vullen we het veldje met het huidig e-mailadres } ?> <h1>Welkom, <?=htmlentities($_SESSION['gebruikersnaam'])?>!</h1> Wijzig je e-mailadres: <?=$fout?> <form action=" <?=htmlentities($_SERVER['REQUEST_URI'])?>" method="post"> <input type="text" name="email" value=" <?=htmlentities($email)?>" /> <input type="submit" value="Bijwerken" /> </form> <a href="uitloggen.php" onclick="return confirm('Ben je zeker dat je je wilt afmelden?');">Uitloggen</a> <?php } else { echo 'Je bent niet ingelogged, klik <a href="login.php">hier</a> om dit te doen.'; } ?>
Hier connect.php(allemaal in de zelfde map):
<?php
//All settings for a connecetion to my own database
define("SERVER", "localhost");
// string server
define("USERNAME", "***");
// string username
define("PASSWORD", "***");
// string password
define("DATABASE", "***");
// string database
mysql_connect(SERVER, USERNAME, PASSWORD) or die("Er kan geen verbinding gemaakt worden met de database, MySQL retouneerde: ".mysql_error());
mysql_select_db(DATABASE) or die("Er kan geen database geselecteerd worden. MySQL retouneerde devolgende error: ".mysql_error());
?>
<?php //All settings for a connecetion to my own database define("SERVER", "localhost"); // string server // string username // string password // string database mysql_connect(SERVER , USERNAME , PASSWORD ) or die("Er kan geen verbinding gemaakt worden met de database, MySQL retouneerde: ".mysql_error()); ?>
Het registreren/activeren werk perfect( goede oplossing voor het activatieprobleem:))
Ziet iemand de fout?
alvast bedankt voor alle moeite
gr
Meddie
|
|
|
|
Gepost op: 11 februari 2007 - 00:18 |
|
|
|
PHP interesse
|
Hey kleine opmerking weet niet of het al aangepast is, maar ik heb de tutorial gebruikt en de login pagina verwerkt en aangepast om mijn eigen pagina.
Maar ik had als ik geen paswoord en geen gebruikersnaam invult hij gewoon inlogd. gewoon de functie if(!empty(... gebruiken.
Mooi scriptje trouwens |
|
|
|
Gepost op: 18 maart 2007 - 15:37 |
|
|
|
Nieuw lid
|
Ik heb dit loginsysteem even geprobeerd en het werkt perfect totdat ik op een andere knop van mijn website klik, dan ben ik opeens uitgelogged.
Iemand een idee hoedat ik die sessie kan laten onthouden ? |
|
|
|
Gepost op: 18 maart 2007 - 17:53 |
|
|
|
PHP beginner
|
<?php
session_start();
?>
bovenaan de andere pagina's zetten |
|
|
|
Gepost op: 20 augustus 2007 - 11:21 |
|
|
|
Lid
|
Uhm...
Ik ben met een klanten paneel bezig.
En ik heb eventjes snel deze tut gekopieerd.
Alleen mijn controle paneel doet het niet.
http://www.insane-hosting.nl/klantenpaneel
Login: Leroyl
Pass: test
<?php
include("config.php");
session_start();
if(isset($_SESSION["gebruiker"])) {
$fout = '';
if($_SERVER['REQUEST_METHOD'] == 'POST') {
function is_email($in) {
list($local, $host) = explode('@', $in);
$pattern_local = '^([0-9a-z]*([-|_]?[0-9a-z]+)*)(([-|_]?)\.'
. '([-|_]?)[0-9a-z]*([-|_]?[0-9a-z]+)+)*([-|_]?)$';
$pattern_host = '^([0-9a-z]+([-]?[0-9a-z]+)*)(([-]?)\.([-]?)'
. '[0-9a-z]*([-]?[0-9a-z]+)+)*\.[a-z]{2,4}$';
$match_local = eregi($pattern_local, $local);
$match_host = eregi($pattern_host, $host);
return ($match_local && $match_host ? true : false);
}
if(!is_email($_POST['email'])) {
$fout = 'Geen geldig e-mailadres!';
} else {
mysql_query("UPDATE gebruikers SET
email = '".mysql_real_escape_string($_POST['email'])."'
WHERE id = ".$_SESSION['gebruiker']);
// Vervolgens moet de pagina vernieuwd worden.
header('Location: '.$_SERVER['REQUEST_URI']);
}
} else {
// Het formulier is nog niet verzonden, dus vullen we het veldje met het huidig e-mailadres
$email = mysql_result(mysql_query("SELECT email FROM gebruikers WHERE id = ".$_SESSION['gebruiker']),0);
}
?>
<h1>Welkom, <?=htmlentities($_SESSION['gebruikersnaam'])?>!</h1>
Wijzig je e-mailadres:
<?=$fout?>
<form action="<?=htmlentities($_SERVER['REQUEST_URI'])?>" method="post">
<input type="text" name="email" value="<?=htmlentities($email)?>" />
<input type="submit" value="Bijwerken" />
</form>
<a href="uitloggen.php" onclick="return confirm('Ben je zeker dat je je wilt afmelden?');">Uitloggen</a>
<?php
} else {
echo 'Je bent niet ingelogged, klik <a href="login.php">hier</a> om dit te doen.';
}
if ($i) {
if ($c) {
} // if ($c)
} // if ($i)
?>
<?php include("config.php"); if(isset($_SESSION["gebruiker"])) { $fout = ''; if($_SERVER['REQUEST_METHOD'] == 'POST') { function is_email($in) { $pattern_local = '^([0-9a-z]*([-|_]?[0-9a-z]+)*)(([-|_]?)\.' . '([-|_]?)[0-9a-z]*([-|_]?[0-9a-z]+)+)*([-|_]?)$'; $pattern_host = '^([0-9a-z]+([-]?[0-9a-z]+)*)(([-]?)\.([-]?)' . '[0-9a-z]*([-]?[0-9a-z]+)+)*\.[a-z]{2,4}$'; $match_local = eregi($pattern_local, $local); $match_host = eregi($pattern_host, $host); return ($match_local && $match_host ? true : false); } if(!is_email($_POST['email'])) { $fout = 'Geen geldig e-mailadres!'; } else { WHERE id = ".$_SESSION['gebruiker']); // Vervolgens moet de pagina vernieuwd worden. header('Location: '.$_SERVER['REQUEST_URI']); } } else { // Het formulier is nog niet verzonden, dus vullen we het veldje met het huidig e-mailadres } ?> <h1>Welkom, <?=htmlentities($_SESSION['gebruikersnaam'])?>!</h1> Wijzig je e-mailadres: <?=$fout?> <form action=" <?=htmlentities($_SERVER['REQUEST_URI'])?>" method="post"> <input type="text" name="email" value=" <?=htmlentities($email)?>" /> <input type="submit" value="Bijwerken" /> </form> <a href="uitloggen.php" onclick="return confirm('Ben je zeker dat je je wilt afmelden?');">Uitloggen</a> <?php } else { echo 'Je bent niet ingelogged, klik <a href="login.php">hier</a> om dit te doen.'; } if ($i) { if ($c) { } // if ($c) } // if ($i) ?>
|
|
|
|
Gepost op: 01 september 2007 - 09:47 |
|
|
|
Nieuw lid
|
Ik raad aan cookies te gebruiken. |
|
|
|
Gepost op: 22 november 2007 - 10:37 |
|
|
|
Nieuw lid
|
Top script, bedankt! Alleen loop ik net als de andere tegen het probleem dat wanneer je inlogt niet naar de adminpanel kan gaan (want dan zegt ie dat je niet ingelogd bent). Wie weet misschien de oplossing? Bedankt! |
|
|
|
Gepost op: 24 november 2007 - 14:42 |
|
|
|
Nieuw lid
|
ethm schreef: Top script, bedankt! Alleen loop ik net als de andere tegen het probleem dat wanneer je inlogt niet naar de adminpanel kan gaan (want dan zegt ie dat je niet ingelogd bent). Wie weet misschien de oplossing? Bedankt! session_start() of cookies... |
|
|
|
Gepost op: 27 februari 2008 - 13:14 |
|
|
|
Nieuw lid
|
Hallo,
Ik heb de tutorial gelezen en het script overgenomen en aangepast, ik heb alleen 1 vraag is het de bedoeling dat na het invullen van de registratiegegevens op registratie.php dat die gegevens al in de database terechtkomen? want hij verstuurt de email wel met activatiecode maar zonder gebruikersid en er staan dan nog geen gegevens in de tabellen gebruikers en gebruikers_activaties... ook als ik op de activatielink in de e-mail klik krijg ik op activatie.php het bericht dat de account niet bestaat of reeds geactiveerd is terwijl dit helemaall niet het geval is
Wat zou er fout kunnen zijn? |
|
|
|
Gepost op: 31 december 2008 - 01:40 |
|
|
|
Nieuw lid
|
field33 schreef: [..quote..]session_start() of cookies...
Ik gebruik session_start() maar dan krijg ik een 500..
Iemand raad? |
|
|
Enkel aanvullende informatie is welkom. Geen prijzende of afkeurende reacties. |
|
|
|