validatie formulier vraag
Ik heb een formulier waar een php validatie opzit (dus als je nix invult dan krijg je in het rood te zien dat je de velden gebruikersnaam en wachtwoord in moet vullen).
Maar als je wel een gebruikersnaam en wachtwoord invult dan is het de bedoeling dat inloggen.php wordt uitgevoerd (het controleren van de gebruikersnaam en wachtwoord in de database).
En het laatste werkt niet.
Ik krijg dan de foutmelding:
Notice: Undefined index: gebruikersnaam in C:\xampp\htdocs\website\inloggen.php on line 8
Notice: Undefined index: wachtwoord in C:\xampp\htdocs\website\inloggen.php on line 9
in het formulier bij action staat nu:
ik heb bij action inloggen.php gezet maar dan werkt de validatie niet als de velden leeg zijn.
mijn vraag is: Hoe moet ik inloggen.php uitvoeren als er in de velden gebruikersnaam en wachtwoord wel iets ingevuld is? en als de velden gebruikersnaam en wachtwoord leeg zijn dat dan de rode tekst komt dat de velden ingevoerd moeten worden als op de knop wordt geklikt.
alvast bedankt
index.php
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?php
$nameErr = $wwErr = '';
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$valid = true;
if (empty($_POST["gebruikersnaam"])) {
$nameErr = "Gebruikersnaam is verplicht";
$valid = false;
}
if (empty($_POST["wachtwoord"])) {
$wwErr = "Wachtwoord is verplicht";
$valid = false;
}
if($valid){
$username = mysqli_real_escape_string ($conn, $_POST ['gebruikersnaam']);
$password = mysqli_real_escape_string ($conn, $_POST ['wachtwoord']);
header('Location: inloggen.php');
exit();
}
}
?>
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Beheer</title>
<link href="style.css" type="text/css" rel="stylesheet">
</head>
<body>
<?php
//include 'includes/header.php';
?>
<header>
<img src="images/logo_wit.png" width="200" alt="logo"/>
</header>
<div id="main_container">
<div id="inloggen">
<p><span class="error">* verplicht veld</span></p>
<form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>">
Gebruikersnaam: <input type="text" name="gebruikersnaam" /><span class="error">* <?php echo $nameErr;?></span><br /><br />
Wachtwoord: <input type="password" name="wachtwoord" /><span class="error">* <?php echo $wwErr;?></span><br /><br />
<input type="submit" name="submit" value="Inloggen" />
</form>
</div>
</div>
</body>
</html>
$nameErr = $wwErr = '';
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$valid = true;
if (empty($_POST["gebruikersnaam"])) {
$nameErr = "Gebruikersnaam is verplicht";
$valid = false;
}
if (empty($_POST["wachtwoord"])) {
$wwErr = "Wachtwoord is verplicht";
$valid = false;
}
if($valid){
$username = mysqli_real_escape_string ($conn, $_POST ['gebruikersnaam']);
$password = mysqli_real_escape_string ($conn, $_POST ['wachtwoord']);
header('Location: inloggen.php');
exit();
}
}
?>
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Beheer</title>
<link href="style.css" type="text/css" rel="stylesheet">
</head>
<body>
<?php
//include 'includes/header.php';
?>
<header>
<img src="images/logo_wit.png" width="200" alt="logo"/>
</header>
<div id="main_container">
<div id="inloggen">
<p><span class="error">* verplicht veld</span></p>
<form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>">
Gebruikersnaam: <input type="text" name="gebruikersnaam" /><span class="error">* <?php echo $nameErr;?></span><br /><br />
Wachtwoord: <input type="password" name="wachtwoord" /><span class="error">* <?php echo $wwErr;?></span><br /><br />
<input type="submit" name="submit" value="Inloggen" />
</form>
</div>
</div>
</body>
</html>
inloggen.php
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
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
<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
include 'connect.php';
session_start();
$username = mysqli_real_escape_string ($conn, $_POST ['gebruikersnaam']);
$password = mysqli_real_escape_string ($conn, $_POST ['wachtwoord']);
$query = ("SELECT naam, wachtwoord FROM leden WHERE naam= ? AND wachtwoord= ? LIMIT 1 ");
$stmt = $conn->prepare($query);
$stmt->bind_param("ss", $username, $password );
$stmt->execute();
$stmt->bind_result($username, $password);
$stmt->store_result();
if($stmt->num_rows > 0) {
while($stmt->fetch()) {
$_SESSION ['gebruikersnaam'] = $username;
header('Location: dashboard.php');
}
}
else {
echo "<h3>incorrect wachtwoord of gebruikersnaam, voer opnieuw in <a href='index.php'>Klik hier</a></h3>";
die ();//als je niks intypt en je klikt toch op de knop login dan krijg je deze melding
}
?>
error_reporting(E_ALL);
ini_set('display_errors', '1');
include 'connect.php';
session_start();
$username = mysqli_real_escape_string ($conn, $_POST ['gebruikersnaam']);
$password = mysqli_real_escape_string ($conn, $_POST ['wachtwoord']);
$query = ("SELECT naam, wachtwoord FROM leden WHERE naam= ? AND wachtwoord= ? LIMIT 1 ");
$stmt = $conn->prepare($query);
$stmt->bind_param("ss", $username, $password );
$stmt->execute();
$stmt->bind_result($username, $password);
$stmt->store_result();
if($stmt->num_rows > 0) {
while($stmt->fetch()) {
$_SESSION ['gebruikersnaam'] = $username;
header('Location: dashboard.php');
}
}
else {
echo "<h3>incorrect wachtwoord of gebruikersnaam, voer opnieuw in <a href='index.php'>Klik hier</a></h3>";
die ();//als je niks intypt en je klikt toch op de knop login dan krijg je deze melding
}
?>
- Begin in dat bestand met de PHP. Dit is je applicatie waarin je alles gaat regelen behalve DE OUTPUT. (zie ook mijn reactie in dit draadje). Begin daarna met de output.
- Controleer of je formulier verstuurd is met deze regel
Gewijzigd op 14/02/2017 15:55:43 door Frank Nietbelangrijk
* htmlspecialchars veranderd bijvoorbeeld & in &. Daar heb je niks aan als je een formulier verstuurd.
Daarnaast doe je form afhandeling in één bestand. Of op de pagina zelf dmv
of stuur de pagina naar inloggen.php met
Ik stel voor om het tweede te doen want bij het eerste loop je tegen het probleem dat als iemand de pagina ververst met F5 het formulier opnieuw gepost wordt.
Op inloggen.php loop je daarna alles door en check je of alle velden ingevuld zijn en of alle waardes aan bepaalde voorwaarden voordoen. Als de ingevulde waardes ergens niet voldoen aan wat je wilt dan kan je een error opslaan in een $_SESSIE['error'] en dan dmv header("Location: index.php"); en een exit(); erachter de gebruiker terug sturen naar het formulier.
Onder het formulier kan je dan de error opvangen bijvoorbeeld:
Gewijzigd op 16/02/2017 10:01:04 door Danny von Gaal
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
$username = mysqli_real_escape_string ($conn, $_POST ['gebruikersnaam']);
$password = mysqli_real_escape_string ($conn, $_POST ['wachtwoord']);
$query = ("SELECT naam, wachtwoord FROM leden WHERE naam= ? AND wachtwoord= ? LIMIT 1 ");
$stmt = $conn->prepare($query);
$stmt->bind_param("ss", $username, $password );
$stmt->execute();
$stmt->bind_result($username, $password);
$stmt->store_result();
?>
$username = mysqli_real_escape_string ($conn, $_POST ['gebruikersnaam']);
$password = mysqli_real_escape_string ($conn, $_POST ['wachtwoord']);
$query = ("SELECT naam, wachtwoord FROM leden WHERE naam= ? AND wachtwoord= ? LIMIT 1 ");
$stmt = $conn->prepare($query);
$stmt->bind_param("ss", $username, $password );
$stmt->execute();
$stmt->bind_result($username, $password);
$stmt->store_result();
?>
Beetje vreemd dat je dubbel gaat escapen. Gebruik prepared statements óf escape, nooit beide. Liefst prepared statements natuurlijk.
Danny von Gaal op 15/02/2017 21:44:35:
Haal sowieso htmlspecialchars weg in het action veld en verander het gewoon naar:
...
* htmlspecialchars veranderd bijvoorbeeld & in &. Daar heb je niks aan als je een formulier verstuurd.
...
* htmlspecialchars veranderd bijvoorbeeld & in &. Daar heb je niks aan als je een formulier verstuurd.
Desalniettemin is het verstandig om alle output te escapen, zo ook form actions. Al bevat PHP_SELF geen querystring-variabelen.
Ben van Velzen op 15/02/2017 23:00:03:
Beetje vreemd dat je dubbel gaat escapen. Gebruik prepared statements óf escape, nooit beide. Liefst prepared statements natuurlijk.
Maar prepared statements in MySQLi is nogal meh.
prepare, bind_param, bind_result, store_result... Aint nobody got time fo dat :).
Als je dan toch prepared statements wilt gebruiken is PDO misschien een beter alternatief.
@topicstarter: scheid of alles in aparte bestanden, of deel het op een andere manier op in verschillende acties (tonen van formulier, verwerken van formulier etc.). De aanpak die @Frank aangeeft kan de oplossing zijn... totdat je met meer dan twee acties te maken krijgt. Dan wordt het al snel een brei met één (of zelfs meerdere) gigantisch(e) if-elseif-elseif-else statement(s).
Gewijzigd op 16/02/2017 10:43:04 door Thomas van den Heuvel