Ben de hele dag al aan het zoeken en proberen. De bedoeling is dat je kan inloggen. Er wordt dan gecontroleerd of e.e.a. eerst klopt. Bij een klant kom je bij klant.php en wanneer admin inlogd bij admin.php.
Het inloggen lukt uiteindelijk. Alleen werkt de controle "minimaal 5 karakters" niet en de password wordt niet gecontroleerd. Ik kan van alles invoeren als wachtwoord maar het wordt goedgekeurd. Wie kan er even na kijken. Alvast bedankt.
<?php
if (empty($_POST) === false) {
$username = trim($_POST['username']);
$password = trim($_POST['password']);
if (empty($username) === true || empty($password) === true) {
$errors[] = 'Gebruik een juiste gebruikersnaam/wachtwoord.';
} elseif ($users->user_exists($username) === false) {
$errors[] = 'De gebruikersnaam wordt niet herkend.';
} elseif ($users->email_confirmed($username) === false) {
$errors[] = 'Uw account is nog niet geactiveerd.';
} else {
if (strlen($password) > 5) {
$errors[] = 'Het wachtwoord moet uit minimaal 5 karakters en zonder spaties zijn.';
}
$login = $users->login($username, $password);
if ($login === false) {
$errors[] = 'De ingevoerde gebruikersnaam/wachtwoord combinatie is niet juist.';
}
$administratie = $_SESSION["administratie"];
if($administratie=="Admin")
{
// Variabelen in session
$_SESSION['username'] = $username;
$_SESSION['administratie'] = $administratie;
session_write_close();
header("Location: admin.php");
exit();
}
else {
// Variabelen in session
$_SESSION['username'] = $username;
$_SESSION['administratie'] = $administratie;
session_write_close();
header('Location: klant.php');
exit();
}
}
}
?>
Regel 20 t/m 39 doe je ook een hoop dubbel... Je bent $administratie heen en weer aan het kopiëren zonder dat je hier iets mee doet.
Daarnaast, zou $username niet in de sessie ingevuld moeten worden in je login() routine? Waarom verricht je de afhandeling van het inloggen op twee verschillende plaatsen? Als je het wegschrijven naar de sessie van de username nu eens verplaatst naar je login routine zelf dan hoeft dit stuk code je alleen naar de juiste pagina door te sturen, lijkt mij een stuk simpeler en staan dingen ook meer op de goede plek als je het mij vraagt.
Bedankt voor de tips. Het script werkt nu op 1 onderdeel na. Dat is nog steeds de controle op het wachtwoord. Als ik een verkeerd wachtwoord invoer wordt ik gewoon ingelogd. Ik zie de fout echt niet. Soms krijg ik ook een foutmelding "Deze webpagina bevat een omleidingslus". Dan start ik logout.php en dan kan ik weer verder. Wie wil me helpen?
<?php
if (empty($_POST) === false) {
$username = trim($_POST['username']);
$password = trim($_POST['password']);
$login = $users->login($username, $password);
if (empty($username) === true || empty($password) === true)
{$errors[] = 'Gebruik een juiste gebruikersnaam/wachtwoord combinatie om in
te loggen.';}
elseif ($users->user_exists($username) === false)
{$errors[] = 'De gebruikersnaam wordt niet herkend.';}
elseif ($login = $users->login($username, $password) | $login === false)
{
header('Location: menu_ingelogd.php');
}
else {$errors[] = 'De ingevoerde gebruikersnaam/wachtwoord
combinatie is niet juist.';
exit();
}
}
?>
Allereerst, het is NOOIT de bedoeling om (gedetailleerde) informatie te geven wat er precies mis is met een login, hierin geef je informatie vrij aan derden die het (mogelijk) makkelijker maken om in te breken. Een login is simpelweg "goed" of "fout". In het laatste geval meld je ook alleen dat de login "fout" is, en geef je iemand een (beperkt aantal) nieuwe poging(en).
Daarnaast draait bovenstaande code nogal om de hete brei heen. Schrijf je code wat meer recht-door-zee. Overigens, die login() methode, voert deze zowel de controle uit of de gegevens kloppen, en logt deze iemand tevens in als deze kloppen?
Ik zou dus zoiets doen, in tegenstelling tot een overgecompliceerd if-statement:
<?php
// controleer of een formulier is gePOST
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// onderneem een inlogpoging alleen als username en wachtwoord niet leeg zijn
if (!empty($_POST['username']) && !empty($_POST['password'])) {
// aanname: login bevat zowel de check of de combinatie geldig is
// alsmede de stappen die genomen moeten worden om iemand in te
// loggen als de check is geslaagd en retourneert of dit alles succesvol was
if ($users->login($_POST['username'], $_POST['password'])) {
// alleen dan stuur je iemand door
header('Location: ingelogd.php');
exit;
}
// anders doen we niets, het einde van het script stuurt je terug naar de login
// met de indicatie (?errors=1) dat er iets mis was
}
}
// Als we dit punt bereiken is er iets mis, terug naar de login
header('Location: login.php?errors=1');
exit;
?>
Weggehaald: "$login = $users->login($username, $password) |". Stond al bovenaan.
Klopt, het resultaat van de methode $users->login() is true/false als het goed is.
Deze wordt elders gemaakt met: public function login($username, $password).
Ja euh, hoe controleer je of iemand ingelogd is? Kijk je hiervoor in $_SESSION? Roep je op alle pagina's session_start() aan? Het is een beetje koffiedik kijken wat er nu misgaat.
Heb je het weergeven + melden van fouten aan staan?
Als je het lastig vindt dergelijke logica uit te werken in meerdere geneste if/else/elseif-controlestructuren, dan kun je de 4 condities ook gewoon in één enkele if stoppen:
PHP verwerkt de condities in de volgorde waarin je ze opsomt en verlaat deze if zodra niet aan een conditie is voldaan. Is !empty($_POST['password']) in de 3e conditie bijvoorbeeld false, dan wordt $users->login($_POST['username'], $_POST['password']) in de 4e conditie niet aangeroepen maar overgeslagen.
Alleen stuurt het bovenstaande script je niet door wanneer een van de condities niet opgaat. In dat geval blijf je op een lege pagina hangen?
Pas als je doorhebt wat er allemaal gebeurt kun je dit soort "shortcuts" nemen, maar het lijkt erop dat de topicstarter er nu al niet helemaal uitkomt. Dit lijkt mij dan ook niet het moment om alles te refactoren.