elseif
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.
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();
}
}
}
?>
Ff heeeeeel snel gekeken ...
if (strlen($password) > 5) {
zal wel
if (strlen($password) < 5) {
moeten zijn.
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.
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.
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?
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
Dan zit de fout waarschijnlijk hierin:
elseif ($login = $users->login($username, $password) | $login === false)
Wat is het resultaat van de methode $users->login()? Is dat bijvoorbeeld true/false?
elseif ($login = $users->login($username, $password) | $login === false)
Wat is het resultaat van de methode $users->login()? Is dat bijvoorbeeld true/false?
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:
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;
?>
Beste Ward,
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...
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
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?
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...
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...
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.
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.
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.
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.
Beste Thomas. Bedankt voor je advies. Je script werkt helaas niet bij mij (omleidingslus). Je gaat er ook vanuit zoals je al zegt "alsmede de stappen die genomen moeten worden om iemand in te loggen als de check is geslaagd".
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.
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.
Je zult ergens moeten onthouden dat een inlogpoging is geslaagd, en daar (de manier waarop je het onthoudt) zul je op moeten controleren of iemand ingelogd is.
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.
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.




