elseif
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?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();
}
}
}
?>
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();
}
}
}
?>
if (strlen($password) > 5) {
zal wel
if (strlen($password) < 5) {
moeten zijn.
Als je niet ingelogd bent (regel 17) dan ga je toch altijd door en kom je altijd op de admin of klant pagina.
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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();
}
}
?>
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();
}
}
?>
Gewijzigd op 19/01/2016 14:17:11 door Jac E
elseif ($login = $users->login($username, $password) | $login === false)
Wat is het resultaat van de methode $users->login()? Is dat bijvoorbeeld true/false?
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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;
?>
// 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).
Helaas geen veranderingen...
Gewijzigd op 19/01/2016 14:44:15 door Jac E
Heb je het weergeven + melden van fouten aan staan?
Zet dit helemaal aan het begin van je code:
Dit begint weer te klinken als een probleem dat geen probleem is, maar de aanpak van het oplossen ervan...
Code (php)
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.
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.
Mijn functie login geeft alleen de waarde true/false na controle van de combinatie $username, $password. Wat moet ik dan toevoegen? Dan gaat het om de vergelijking $login === true of false lijkt me.
Daarom vond ik de naam voor de methode "login" een beetje misleidend en vroeg ik om bevestiging van de betekenis/werking.
Ik zou dus eigenlijk twee stappen verwachten in plaats van die ene login methode:
1. een authenticatie-stap, wat nu in feite de login methode is: invoer username+password, uitvoer: simpelweg "ja" als de gegevens kloppen en "nee" wanneer dit niet het geval is, en
2. een login-stap, waarin je de administratieve afhandeling verricht van een geslaagde authenticatie; dit kan bijvoorbeeld het instellen van sessie-variabelen zijn
Vervolgens controleer je of iemand ingelogd is door (het bestaan van) deze sessie-variabelen te raadplegen.