form database fout

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Davey Mat

Davey Mat

05/01/2013 13:31:12
Quote Anchor link
Hallo allemaal,

Ik probeer een pagina te maken waarop de admin alle accounts kan beheren.
Echter, ik slaag er niet in om deze werkend te krijgen. Als ik de gegevens verkeerd invul, bijvoorbeeld pass != pass2 of in het emailadres zitten geen '@' en '.', dan worden deze toch opgeslagen in de database.

Quote:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
define('INCLUDE_CHECK',true);

require 'inc/connect.php';

session_name('Login');
session_set_cookie_params(2*7*24*60*60);
session_start();

if(isset($_GET['logoff']))
{

    $_SESSION = array();
    session_destroy();
    
    header("Location: index.php");
    exit;
}


include "inc/header.php";
require "inc/check.php";
include "inc/menu.php";
?>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<div class="container">

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
function renderForm($usr, $pass, $pass2, $voornaam, $achternaam, $huistelnummer, $mobielnummer, $email, $error)
{

 // Als er errors zijn, laat ze dan zien
 if ($error != '')
 {

 echo '<div style="padding:4px; border:1px solid red; color:red;">'.$error.'</div>';
 }

 ?>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<form action="" method="post">
 <strong>Accountnaam: *</strong> <input type="text" name="usr"/><br/>
 <strong>Wachtwoord: *</strong> <input type="text" name="pass"/><br/>
 <strong>Wachtwoord controle: *</strong> <input type="text" name="pass2"/><br/>
 <strong>Voornaam: *</strong> <input type="text" name="voornaam"/><br/>
 <strong>Achternaam: *</strong> <input type="text" name="achternaam"/><br/>
 <strong>Huistelefoonnummer:</strong> <input type="text" name="huistelnummer"/><br/>
 <strong>Mobielnummer:</strong> <input type="text" name="mobielnummer"/><br/>
 <strong>Email: *</strong> <input type="text" name="email"/><br/>
 <p>* Benodigde velden</p>
 <input type="submit" name="submit" value="Submit">
 </form>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
58
59
60
<?php
 }
 
 // Check of de form als is gesubmit.
 if (isset($_POST['submit']))
 {

 // kijken of de data geldig is
 $usr = mysql_real_escape_string(htmlspecialchars($_POST['usr']));
 $pass= mysql_real_escape_string(htmlspecialchars($_POST['pass']));
 $pass2= mysql_real_escape_string(htmlspecialchars($_POST['pass2']));
 $voornaam = mysql_real_escape_string(htmlspecialchars($_POST['voornaam']));
 $achternaam = mysql_real_escape_string(htmlspecialchars($_POST['achternaam']));
 $huistelnummer = mysql_real_escape_string(htmlspecialchars($_POST['huistelnummer']));
 $mobielnummer = mysql_real_escape_string(htmlspecialchars($_POST['mobielnummer']));
 $email = mysql_real_escape_string(htmlspecialchars($_POST['email']));
 
 // controleer lengte wachtwoord
 if ( strlen($pass) < 6 ){
 $error = 'ERROR: Wachtwoord moet minimaal 6 tekens bevatten.';
 renderForm($usr, $pass, $pass2, $voornaam, $achternaam, $huistelnummer, $mobielnummer, $email, $error);
 }

 if ( $pass <> $pass2 ){
 $error = 'ERROR: Het wachtwoord is niet hetzelfde als het controle wachtwoord!';
 renderForm($usr, $pass, $pass2, $voornaam, $achternaam, $huistelnummer, $mobielnummer, $email, $error);
 }

 
$pass = md5($pass);
$pass2 = md5($pass2);

// controleer email
 if ( !stristr($email,"@") || !stristr($email,".")) {
    $error = 'Het ingevoerde email-adres is niet juist.';
    renderForm($usr, $pass, $pass2, $voornaam, $achternaam, $huistelnummer, $mobielnummer, $email, $error);
    }

    
 // check of de velden met * zijn ingevuld
 if ($usr == '' || $pass == '' || $pass2 == '' || $voornaam == '' || $achternaam == '' || $email == '')
 {

 // genereer error bericht
 $error = 'ERROR: Vul alle velden in met een *!';
 
 // Als velden leeg zijn laat dan form weer zien
 renderForm($usr, $pass, $pass2, $voornaam, $achternaam, $huistelnummer, $mobielnummer, $email, $error);
 }

 else
 {
 // sla data op in de database
 mysql_query("INSERT members SET usr='$usr', pass='$pass', voornaam='$voornaam', achternaam='$achternaam', huistelnummer='$huistelnummer', mobielnummer='$mobielnummer', email='$email'")
 or die(mysql_error());
 
 
 echo "Nieuw account is aangemaakt. <a href=accounts.php>Klik hier</a> om terug te gaan naar het account overzicht.";
 }
 }

 else
 // Als form niet is gesubmit laat dan form weer zien
 {
 renderForm('','','','','','','','','');
 }

?>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
</div>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php include "inc/footer.php"; ?>
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
</div>
</body>
</html>

Weten jullie misschien waar de fout kan zitten?
Alvast bedankt!
Gewijzigd op 05/01/2013 15:59:37 door Davey Mat
 
PHP hulp

PHP hulp

22/11/2024 22:51:16
 
Erwin H

Erwin H

05/01/2013 13:39:50
Quote Anchor link
htmlspecialchars gebruik je verkeerd. Dat kan je beter pas gebruiken op het moment dat je de data uitleest uit je database en weer in een html pagina zet. Normaal gesproken wil je dat 'raw' in je database hebben. Daarnaast, kan dat ook problemen opleveren bij je tests. Als iemand namelijk zo'n karakter in zijn password heeft zitten, dan verander je dat password voor het de database in gaat en klopt het dus niet meer met wat hij oorspronkelijk heeft ingegeven. Daarnaast wordt het password ook langer en klopt je < 6 test niet meer.

En dan je probleem. Je insert in de database staat na de if statements voor de checks. Als die checks niet kloppen, wordt je insert dus alsnog gewoon uitgevoerd.

Toevoeging op 05/01/2013 13:40:35:

Voor de html, geen [.quote.] gebruiken, maar [.code.] (zonder de punten uiteraard)
 
Davey Mat

Davey Mat

05/01/2013 16:18:57
Quote Anchor link
Ah oke bedankt!
Dus ik kan zeggen dat ik altijd bij een invoer in de database 'mysql_real_escape_string' gebruik ter preventie van een sql injection en bij het uitlezen van de data gebruik ik altijd 'htmlspecialchars'?

Ik kan er alleen nog niet uit komen waarom de insert buiten de if statements staat. Ik gebruik toch gewoon
Quote:
if { code }
else { code }

of waar kijk ik overheen?
 
Erwin H

Erwin H

05/01/2013 16:34:59
Quote Anchor link
Ga consequent inspringen, dan kom je er vanzelf achter. Zonder inspringen is het inderdaad niet te zien en dat merk je nu.
 
Davey Mat

Davey Mat

05/01/2013 19:46:19
Quote Anchor link
Na lang proberen werkt de code denk ik. Heb de code nu veranderd in:
Quote:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
define('INCLUDE_CHECK',true);

require 'inc/connect.php';

session_name('Login');
session_set_cookie_params(2*7*24*60*60);
session_start();

if(isset($_GET['logoff']))
{

    $_SESSION = array();
    session_destroy();
    
    header("Location: index.php");
    exit;
}


include "inc/header.php";
require "inc/check.php";
include "inc/menu.php";
?>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<div class="container">
 <form action="" method="post">
 <strong>Accountnaam: *</strong> <input type="text" name="usr"/><br/>
 <strong>Wachtwoord: *</strong> <input type="text" name="pass"/><br/>
 <strong>Wachtwoord controle: *</strong> <input type="text" name="pass2"/><br/>
 <strong>Voornaam: *</strong> <input type="text" name="voornaam"/><br/>
 <strong>Achternaam: *</strong> <input type="text" name="achternaam"/><br/>
 <strong>Huistelefoonnummer:</strong> <input type="text" name="huistelnummer"/><br/>
 <strong>Mobielnummer:</strong> <input type="text" name="mobielnummer"/><br/>
 <strong>Email: *</strong> <input type="text" name="email"/><br/>
 <p>* Benodigde velden</p>
 <input type="submit" name="submit" value="Submit">
 </form>

Quote:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
 // Check of de form al is gesubmit.
 if (isset($_POST['submit']))
 {

 // kijken of de data geldig is
 $usr = mysql_real_escape_string($_POST['usr']);
 $pass= mysql_real_escape_string($_POST['pass']);
 $pass2= mysql_real_escape_string($_POST['pass2']);
 $voornaam = mysql_real_escape_string($_POST['voornaam']);
 $achternaam = mysql_real_escape_string($_POST['achternaam']);
 $huistelnummer = mysql_real_escape_string($_POST['huistelnummer']);
 $mobielnummer = mysql_real_escape_string($_POST['mobielnummer']);
 $email = mysql_real_escape_string($_POST['email']);
 
 $errors = array();
 
  // check of de velden met * zijn ingevuld
 if ($usr == '' || $pass == '' || $pass2 == '' || $voornaam == '' || $achternaam == '' || $email == '')
 {

 // genereer error bericht
 array_push($errors, "ERROR: Vul alle velden in met een *!");
 }

 // controleer lengte wachtwoord
 if ( strlen($pass) < 6 )
 {

 array_push($errors, "ERROR: Wachtwoord moet minimaal 6 tekens bevatten.");
 }

 if ( $pass <> $pass2 )
 {

 array_push($errors, "ERROR: Het wachtwoord is niet hetzelfde als het controle wachtwoord!");
 }

 
$pass = md5($pass);
$pass2 = md5($pass2);

// controleer email
 if ( !stristr($email,"@") || !stristr($email,"."))
    {

    array_push($errors, "Het ingevoerde email-adres is niet juist.");
    }

 
     //kijken of  er een bericht is ingevuld, zo nee onderbreek het proces, anders ga verder
    if(count($errors) >0){
            foreach($errors as $error){
                echo $error;
            }
    }

 else
 {
 // sla data op in de database
 mysql_query("INSERT members SET usr='$usr', pass='$pass', voornaam='$voornaam', achternaam='$achternaam', huistelnummer='$huistelnummer', mobielnummer='$mobielnummer', email='$email'")
 or die(mysql_error());
 echo "Nieuw account is aangemaakt. <a href=accounts.php>Klik hier</a> om terug te gaan naar het account overzicht.";
 }
 }

?>

Als ik nu de velden invul en op submit klik dan heb ik een probleempje.
Het formulier blijft staan. Moet ik dit met een else oplossen? Dus 'else' {en dan mijn form}?
Gewijzigd op 05/01/2013 19:53:22 door Davey Mat
 
Erwin H

Erwin H

05/01/2013 20:05:11
Quote Anchor link
De opbouw van je script is verkeerd om. Op zich klopt (denk ik) alles wel, alleen omdat je eerst het form naar de browser stuurt en dan pas de gegevens controleert, kan je nooit meer het form weghalen als dat niet getoond zou moeten worden.

Wat je beter kunt doen is eerst alle php logica afhandelen en dan pas je output naar het scherm sturen. Dus nog geen <html> tag versturen als je nog niet alles in php hebt gedaan. Zo kun je heel makkelijk aan het einde bepalen welke pagina de gebruiker voor zijn snuffert krijgt.
 
Davey Mat

Davey Mat

05/01/2013 20:36:20
Quote Anchor link
Oke het is helemaal gelukt. Bedankt ErwinH!
Rest mij nog 1 vraag.
Quote:
Wat je beter kunt doen is eerst alle php logica afhandelen en dan pas je output naar het scherm sturen. Dus nog geen <html> tag versturen als je nog niet alles in php hebt gedaan. Zo kun je heel makkelijk aan het einde bepalen welke pagina de gebruiker voor zijn snuffert krijgt.

Waarom is het op de manier die ik had lastiger?
Gewijzigd op 06/01/2013 21:17:30 door Davey Mat
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.