Problemen met Form Action / formulier

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Nicolas Mousserin

Nicolas Mousserin

12/11/2013 15:44:52
Quote Anchor link
Beste lezer,

Sinds een tijdje ben ik bezig met de basics van PHP en MySQL en ik ben nu bij het onderwerp formulieren en het controleren van de gegevens hiervan.

Hiervoor heb ik een proef script gemaakt om het te testen maar om de een of andere reden doet die het niet helemaal naar wens. Wat specifieker: mijn form action POST werkt niet helemaal goed. Ten eerste krijg ik deze PHP zin steeds te zien (form action checkall) na het invullen van mij formulier. Ten tweede heb ik een probleem met me action pagina (checkAll) die de gegevens niet goed controleert.

Zo heb ik er een controle voor ingevoerde velden inzitten maar als ik geeneen veld invoer dan krijg ik alleen een foutmelding te zien van één veld dat niet is ingevuld terwijl er dan (volgens mij) alle velden getoond moeten worden die niet ingevuld zijn. Daarnaast laat het programma ook niet de goede tekst zien als alle gegevens correct zijn ingevuld.

Wat overige informatie: XAMPP is geinstallaeerd en draait tijdens het testen. Hieronder volgt de gebruikte code:

Het hoofdprogramma
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
<?php
 $labels
= array("voor_naam" => "Voornaam",
                "achter_naam" => "Achternaam",
                "e_mail" => "E-mail adres",
                "e_bevestiging" => "Bevestiging E-mail adres",
                "wachtwoord" => "Wachtwoord",
                "geboortedatum" => "Geboortedatum",
                "Woonplaats" => "Waar woon je?");
                
?>

<html>
<head>
<title>Registreren</title>
<style type ='text/css'>
<!--
    form {margin: 1.5em 0 0 0; padding: 0; }
    .field {padding-top: .5em; }
    label { float: left; width: 20%;
            margin-right: 1em; text-align: right; }
    #submit { margin-left: 35%; padding-top: 1em; }
-->

</style>
</head>                

<body>
<h1>Registreren</h1>
<form action='checkAll.php' method ='POST'    

<?php
//lus die de formuliervelden weergeeft

foreach($labels as $field => $label)
{

    echo "<div class='field'>
            <label for='$field'>$label</label>
             <input type='text' name='$field' id='$field'
                size='65' maxlenght='65' /></div>\n"
;
}

echo "<input type='radio' name='geslacht'
            value='Man' />Man\n"
;            
echo "<input type='radio' name='geslacht'
                value='Vrouw' />Vrouw\n"
;        

echo "<div id='submit'><input type='submit'
            value='Registreren' /></div>\n"
;
echo "</div>\n</form>\n</body>\n</html>";
?>
    


Het controle (form action) programma
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
<html>
<head>
<title>Account aanmaken</title>
<style type ='text/css'>
<!--
    form {margin: 1.5em 0 0 0; padding: 0; }
    .field {padding-top: .5em; }
    label { float: left; width: 20%;
            margin-right: 1em; text-align: right; }
    #submit { margin-left: 35%; padding-top: 1em; }
-->

</style>
</head>
<body>
<?php
$labels
= array("voor_naam" => "Voornaam",
                "achter_naam" => "Achternaam",
                "e_mail" => "E-mail adres",
                "e_bevestiging" => "Bevestiging E-mail adres",
                "wachtwoord" => "Wachtwoord",
                "geboortedatum" => "Geboortedatum",
                "Woonplaats" => "Waar woon je?");

    foreach ($_POST as $field => $value)
    {

        //controleren van elk veld
        if(empty($value))
        
            {

                $blank_array[] = $field;
            }
    
        
        //controleren namen op opmaak
        elseif($field == "voor_naam" or $field == "achter_naam")
        {

            if(!preg_match("/^[A-Za-z' -]{1,50}$/",$_POST[$field]) )
            {

                $bad_format[] = $field;
            }
        }
    
        //controleren e-mail op opmaak
        elseif($field == "e_mail" or $field == "e_bevestiging")
        {

            if(!preg_match("/^[@A-Za-z 0-9_.%+-]{1,50}$/",$_POST[$field]) )
            {

                $bad_format[] = $field;
            }
        }
    
        // woonplaats en geboortedatum worden drop down keuzemenus
        
        //foutberichten en formulier weergeven als het niet klopt

        if(@sizeof($blank_array) > 0)
        {

            echo "<p><b>U heeft de volgende vereiste velden niet ingevuld:</b><br />\n";
            //toon lijst met ontbrekende gegevens
            foreach($blank_array as $value)
            {

                echo "&nbsp;&nbsp;&nbsp;{$labels[$value]} <br /> \n";
            }

            echo "</p>\n";
        }
    
        
        //berichten voor foutieve gegevens
        if(@sizeof($bad_format) > 0)
        {

            echo "<p><b>De volgende velden bevatte incorrecte gegevens</b><br />\n";
            //toon lijst met foutieve gegevens
            foreach($bad_format as $value)
            {

                echo "&nbsp;&nbsp;&nbsp;{$labels[$value]} <br /> \n";
            }

            echo "</p>\n";
        }

        //formulier opnieuw weergeven
        echo "form action='$_SERVER[PHP_SELF]' method='POST'>";
        foreach($labels as $field => $label)
        {
        
            $clean_data[$field] =
                strip_tags(trim($_POST[$field]));
            echo "<div class='field'>
                <label for='$field'>$label</label>
                <input type='text' name='$field' id='$field'
                size='65' maxlenght='65'
                value='$clean_data[$field]' /></div>\n"
;
        }
        
        echo "<div id='submit'><input type='submit'
            value='Registreren' /></div>\n"
;        
        echo "</div>\n</form>\n</body>\n</html>";    
        exit();    
    }
        
    //als de gegevens goed zijn
    echo "<p>Alle gegevens zijn ingevuld</p></body></html>";
            
            
?>
    


Iemand een idee wat er misgaat want ik kom er niet uit!

Bij voorbaat dank!
 
PHP hulp

PHP hulp

22/12/2024 22:59:38
 
Kris Peeters

Kris Peeters

12/11/2013 15:56:05
Quote Anchor link
Ik ga niet rechtstreeks een antwoord geven.
Maar waar je altijd moet mee beginnen (wanneer je een formulier verwerkt), is dingen in de juiste volgorde zetten.

PHP bovenaan de code
Formulier onderaan de code.


Werk altijd volgens zo'n structuur:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
// eerst testen of er een POST verzoek is
if($_SERVER['REQUEST_METHOD'] == 'POST')
{

  // ... Hier verwerk je de POST variabelen

  header('location: index.php'); // hier vul je de url in van het formulier.  Daarmee wordt de pagina ververst en blijven de POST variabelen niet actief
}
?>

<form ...>
...
 
Nicolas Mousserin

Nicolas Mousserin

12/11/2013 17:42:12
Quote Anchor link
Kris Peeters op 12/11/2013 15:56:05:
Ik ga niet rechtstreeks een antwoord geven.
Maar waar je altijd moet mee beginnen (wanneer je een formulier verwerkt), is dingen in de juiste volgorde zetten.

PHP bovenaan de code
Formulier onderaan de code.


Werk altijd volgens zo'n structuur:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
// eerst testen of er een POST verzoek is
if($_SERVER['REQUEST_METHOD'] == 'POST')
{

  // ... Hier verwerk je de POST variabelen

  header('location: index.php'); // hier vul je de url in van het formulier.  Daarmee wordt de pagina ververst en blijven de POST variabelen niet actief
}
?>

<form ...>
...


Dankjewel voor je reactie! Ik heb de PHP en de form even geswitched en in de goede volgorde gezet. Tevens de request en de header gebruikt, hij doet het echter nog steeds niet.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

12/11/2013 21:34:15
Quote Anchor link
Waarom zou je je formulier laten posten naar een andere pagina? laat die action gewoon leeg.

@kris ik mis de validatie nog.

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
<?php

// deze functie controleert of het ingevulde goed is en geeft direct de fouten in de vorm van een array terug.
function validate($name, $email)
{

    $errors = array();
    
    if($name == '')
        $errors[] = 'U moet een naam opgeven.';
                
    if(!filter_var($email, FILTER_VALIDATE_EMAIL))
        $errors[] = 'U dient een GELDIG emailadres op te geven.';

    return $errors;
}


// dit is een hulpfunctie om snel de $_POST variabelen in een eigen variabele te zetten
//   en als de $_POST variabele niet bestaat dan geven we een beginwaarde.

function getPostValue($name, $default = '')
{

    if(isset($_POST[$name]))
        $default = $_POST[$name];
        
    return $default;
}


// initialisatie van de variabelen.
$name = getPostValue('name');
$email = getPostValue('email');

// eerst testen of er een POST verzoek is
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
        
    $errors = validate($name, $email);
    
    if(count($errors) == 0)
    {

          // Als er geen errors zijn dan gegevens opslaan of verzenden per email daarna door naar een andere pagina.
        
        header('location: thankyou.php');
        exit;
    }


    // als we hier nog komen dan zijn er dus fouten en kunnen we die aan de gebruiker kenbaar maken
    echo '<ul>';
    foreach($errors as $error)
        echo '<li>' . $error . '</li>';
    echo '</ul>';
}

?>

<form action="" method="post">
    <input type="text" id="name" name="name" value="<?php echo $name; ?>" />
    <input type="text" id="email" name="email" value="<?php echo $email; ?>" />
    <input type="submit" value="Verzenden" />
</form>

https://www.youtube.com/watch?v=g_r4a-DXA7c
Gewijzigd op 12/11/2013 21:58:16 door Frank Nietbelangrijk
 
Nicolas Mousserin

Nicolas Mousserin

13/11/2013 17:43:59
Quote Anchor link
Dankjewel! Het werkt!
 
Marcel de Jong

Marcel de Jong

22/05/2014 17:35:31
Quote Anchor link
Ik weet dat het een oud bericht is, ik heb er alleen heel veel aan gehad.
@Frank Nietbelangrijk

Hoe kan ik het volgende stukje code implemeteren in jou script wat jij hierboven geschreven heb
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
<select id="ddlApkmaand" name="ddlApkmaand" class="datum_maand">
                            <option value="niet ingevuld">maand</option>
                            <option value="januari">Januari</option>
                            <option value="februari">Februari</option>
                            <option value="maart">Maart</option>
                            <option value="april">April</option>
                            <option value="mei">Mei</option>
                            <option value="juni">Juni</option>
                            <option value="juli">Juli</option>
                            <option value="augustus">Augustus</option>
                            <option value="september">September</option>
                            <option value="oktober">Oktober</option>
                            <option value="november">November</option>
                            <option value="december">December</option>
                        </select>
Gewijzigd op 22/05/2014 17:40:46 door Marcel de Jong
 
Frank Nietbelangrijk

Frank Nietbelangrijk

22/05/2014 18:00:15
Quote Anchor link
Hallo Marcel dat is een simpele aanvulling.

Uitgaande van mijn voorbeeld:
op regel 28:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$maand
= getPostValue('ddlApkmaand', 'januari'); // <-- mag ook een andere maand zijn als startwaarde..
?>


en dan vervang je regel 51 t/m 55 voor:
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
<form action="" method="post">
    <input type="text" id="name" name="name" value="<?php echo $name; ?>" />
    <input type="text" id="email" name="email" value="<?php echo $email; ?>" />

    <select id="ddlApkmaand" name="ddlApkmaand" class="datum_maand">
        <option value="niet ingevuld">maand</option>
        <option value="januari">Januari</option>
        <option value="februari">Februari</option>
        <option value="maart">Maart</option>
        <option value="april">April</option>
        <option value="mei">Mei</option>
        <option value="juni">Juni</option>
        <option value="juli">Juli</option>
        <option value="augustus">Augustus</option>
        <option value="september">September</option>
        <option value="oktober">Oktober</option>
        <option value="november">November</option>
        <option value="december">December</option>
    </select>

    <input type="submit" value="Verzenden" />
</form>
 
Marcel de Jong

Marcel de Jong

22/05/2014 19:06:25
Quote Anchor link
Bedankt voor de hulp,

Maar het stukje tussen de select tags is toch het zelfde? moet daar geen php waarde ingevoegd worden?

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
<form action="" method="post">
    <input type="text" id="name" name="name" value="<?php echo $name; ?>" />
    <input type="text" id="email" name="email" value="<?php echo $email; ?>" />

    <select id="ddlApkmaand" name="ddlApkmaand" class="datum_maand">
        <option value="niet ingevuld">maand</option>
        <option value="januari">Januari</option>
        <option value="februari">Februari</option>
        <option value="maart">Maart</option>
        <option value="april">April</option>
        <option value="mei">Mei</option>
        <option value="juni">Juni</option>
        <option value="juli">Juli</option>
        <option value="augustus">Augustus</option>
        <option value="september">September</option>
        <option value="oktober">Oktober</option>
        <option value="november">November</option>
        <option value="december">December</option>
    </select>

    <input type="submit" value="Verzenden" />
</form>
 
Frank Nietbelangrijk

Frank Nietbelangrijk

23/05/2014 00:39:53
Quote Anchor link
Ja klopt Marcel. Het punt is dat op één van de <option>s een extra attribuut gezet moet worden dat er voor zorgt dat die option geselecteerd wordt ( <option selected="selected">test</option> ). Je weet echter niet van te voren welke van de options dat moet zijn dus zul je de - in dit geval - maanden in een array moeten plaatsen en de options door PHP moeten laten genereren. Ik heb dit werkend voorbeeldje even voor je in elkaar gezet:
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<?php

// vanaf nu gebruiken we associatieve arrays om de <select>s te vullen!
$maanden = array(
    'niet ingevuld' => 'maand',
    'januari' => 'Januari',
    'februari' => 'Februari',
    'maart' => 'Maart',
    'april' => 'April',
    'mei' => 'Mei',
    'juni' => 'Juni',
    'juli' => 'Juli',
    'augustus' => 'Augustus',
    'september' => 'September',
    'oktober' => 'Oktober',
    'november' => 'November',
    'december' => 'December',
);


// deze functie maakt met behulp van een opgegeven array en de standaard geselecteerde optie de HTML aan voor alle <options> van een <select>
function getOptions($array, $selected)
{

    $html = '';
    
    foreach($array as $key => $value)
    {

        $sel = '';
        if($selected == $key)
            $sel = ' selected="selected"';
        $html .= '<option value="' . $key . '"' . $sel . '>' . $value . '</option>';
    }

    
    return $html;
}


// deze functie controleert of het ingevulde goed is en geeft direct de fouten in de vorm van een array terug.
function validate($name, $email, $maand)
{

    $errors = array();
    
    if($name == '')
        $errors[] = 'U moet een naam opgeven.';
                
    if(!filter_var($email, FILTER_VALIDATE_EMAIL))
        $errors[] = 'U dient een GELDIG emailadres op te geven.';

    if($maand == 'niet ingevuld')
        $errors[] = 'U moet een MAAND selecteren.';
                
   return $errors;
}


// dit is een hulpfunctie om snel de $_POST variabelen in een eigen variabele te zetten
//   en als de $_POST variabele niet bestaat dan geven we een beginwaarde.

function getPostValue($name, $default = '')
{

    if(isset($_POST[$name]))
        $default = $_POST[$name];
        
    return $default;
}


// initialisatie van de variabelen.
$name = getPostValue('name');
$email = getPostValue('email');
$maand = getPostValue('ddlApkmaand', 'niet ingevuld');

// eerst testen of er een POST verzoek is
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
        
    $errors = validate($name, $email, $maand);

    if(count($errors) == 0)
    {

          // Als er geen errors zijn dan gegevens opslaan of verzenden per email daarna door naar een andere pagina.
        
        header('location: thankyou.php');
        exit;
    }


    // als we hier nog komen dan zijn er dus fouten en kunnen we die aan de gebruiker kenbaar maken
    echo '<ul>';
    foreach($errors as $error)
        echo '<li>' . $error . '</li>';
    echo '</ul>';
}

?>

<form action="" method="post">
    <input type="text" id="name" name="name" value="<?php echo $name; ?>" />
    <input type="text" id="email" name="email" value="<?php echo $email; ?>" />
    
    <select id="ddlApkmaand" name="ddlApkmaand" class="datum_maand">
        <?php echo getOptions($maanden, $maand); ?>
    </select>
    
    <input type="submit" value="Verzenden" />
</form>
 
Marcel de Jong

Marcel de Jong

23/05/2014 10:27:30
Quote Anchor link
Ik heb het formulier ingevuld, maar op een of andere manier krijg ik nu een blanco bericht binnen. hieronder de code
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
<?php
        // Mail opstellen
                $to  = '[email protected]';
                $onderwerp = 'onderhoudsverzoek';
                $bericht   = "<html><body>";
                $bericht  .= "<table rules='all' class='ff2 fs10 fc2' cellpadding='10'>";
                $bericht  .= "<tr class='ff2 fs14 fc2' ><td>Verzoek tot onderhoud: </td></tr>";
                $bericht  .= "<tr class='ff2 fs14 fc2' ><td>$nbsp;</td></tr>";
                $bericht  .= "<tr class='ff2 fs12 fc2' ><td>Afspraakgegevens:</td></tr>";
                $bericht  .= "<tr><td>Type afspraak: </td><td>".($_POST['ddlSoortOnderhoud']). "</td></tr>";
                $bericht  .= "<tr><td>Type afspraak: </td><td>".($_POST['ddlAfspraakdag'])." / ".($_POST['dllAfspraakmaand']). "</td></tr>";
                $bericht  .= "<tr class='ff2 fs14 fc2' ><td>&nbsp; </td></tr>";                
                $bericht  .= "<tr class='ff2 fs12 fc2' ><td>Voertuiggegevens: </td></tr>";                
                $bericht  .= "<tr><td>Merk voertuig: </td><td>".($_POST['txtMerk']). "</td></tr>";
                $bericht  .= "<tr><td>Model/type: </td><td>".($_POST['txtModel'])."</td></tr>";
                $bericht  .= "<tr><td>Vervaldatum APK: </td><td>".($_POST['ddlApkmaand'])." / ".($_POST['dllApkjaar'])."</td></tr>";
                $bericht  .= "<tr class='ff2 fs14 fc2' ><td>&nbsp; </td></tr>";                
                $bericht  .= "<tr class='ff2 fs12 fc2' ><td>contactgegevens: </td></tr>";                
                $bericht  .= "<tr><td>Naam: </td><td>".($_POST['txtNaam'])."</td></tr>";
                $bericht  .= "<tr><td>Adres: </td><td>".($_POST['txtAdres'])."</td></tr>";
                $bericht  .= "<tr><td>Postcode: </td><td>".($_POST['txtPostcode'])."</td></tr>";
                $bericht  .= "<tr><td>Woonplaats: </td><td>".($_POST['txtWoonplats'])."</td></tr>";
                $bericht  .= "<tr><td>Telefoonnummer: </td><td>".($_POST['txtTelefoon'])."</td></tr>";
                $bericht  .= "<tr><td>Emailadres: </td><td>".($_POST['txtEmail'])."</td></tr>";
                $bericht  .= "<tr class='ff2 fs14 fc2' ><td>&nbsp; </td></tr>";                
                $bericht  .= "<tr class='ff2 fs12 fc2' ><td>Opmerkingen: </td></tr>";                
                $bericht  .= "<tr><td>eventuele opmerkingen: </td><td>".($_POST['txtExtra'])."</td></tr>";                
                $bericht  .= "</table>";            
                $bericht  .= "</body></html>";
                $headers   = 'MIME-Version: 1.0' . "\r\n";
                $headers  .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
                $headers  .= "From: ".htmlspecialchars($_POST['txtNaam'])."\r\n";
                $headers  .= "CC: ".htmlspecialchars($_POST['txtEmail'])."\r\n";
                                    
                 mail($to, $onderwerp, $bericht, $headers);
                
                
    ?>
Gewijzigd op 23/05/2014 13:48:15 door Marcel de Jong
 
Frank Nietbelangrijk

Frank Nietbelangrijk

23/05/2014 17:34:06
Quote Anchor link
Marcel,

Aangezien dit een heel ander onderwerp is zou ik je willen vragen hiervoor een nieuw topic aan te maken.
 



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.