Beste,

Ik heb een contactformulier wat na veel zoekwerk nu eindelijk naar mijn mail verstuurd wordt. Echter krijg ik geen melding dat deze verstuurd is. Ook als ik een veld niet invul krijg ik daar geen melding van, het formulier wordt ook niet naar de mail gestuurd.

Ik ben nieuw met php en weet ook niet zo goed waar ik moet zoeken. De codes heb ik van een uitleg op internet gekopieerd, dus ik heb geen idee waarom het bij mij niet werkt.

Het formulier: (index3.html)

<form action="" method="post" id="myform">
    <div>
        <label for="name">Name:</label><br>
        <input type="text" id="name" name="name" />
    </div>
    <div>
        <label for="surname">Surname:</label><br>
        <input type="text" id="surname" name="surname" />
    </div>
    <div>
        <label for="companyname">Company Name:</label><br>
        <input type="text" id="companyname" name="companyname" />
    </div>
    <div>
        <label for="email">E-mail:</label><br>
        <input type="email" id="email" name="email" />
    </div>
    <div>
        <label for="bericht">Message:</label><br>
        <textarea id="bericht" name="bericht"></textarea>
    </div>
    <div class="button">
        <button type="submit" name="submit">Send your message</button>
    </div>
</form>


PHP: (formverzenden.php)
<?php 
if(isset($_POST['submit'])){
    $naar = "[email protected]";
    $onderwerp  = "Contactformulier";

    if(!empty($_POST['name'])){
          $name = $_POST['name']; 
    }else{
          die("U heeft geen voornaam ingevuld");
    }

    if(!empty($_POST['surname'])){
          $surname = $_POST['surname']; 
    }else{
          die("U heeft geen achternaam ingevuld");
    }
	
    if(!empty($_POST['companyname'])){
          $companyname = $_POST['companyname']; 
    }else{
          die("U heeft geen bedrijfsnaam ingevuld");
    }
	
    if(!empty($_POST['email'])){
           $email = $_POST['email']; 
     }else{
           die("U heeft geen emailadres ingevuld");
     }
    if(!filter_var($email, FILTER_VALIDATE_EMAIL)) // Als het email adres niet correct is
    {
        print '<p>Helaas, het email adres is niet correct!</p>';
        $fout = true;
    }
    if(!empty($_POST['bericht'])){
           $bericht = $_POST['bericht']; 
     }else{
           die("U heeft geen bericht geschreven");
     }
    $sjabloon = "
    Naam: {name} {surname}
    Bedrijf: {companyname}
    Email adres: {email}
    Bericht: {bericht}
     ";
    $message = str_replace("{name}", $name, $sjabloon);
    $message = str_replace("{surname}", $surname, $sjabloon);
    $message = str_replace("{companyname}", $companyname, $sjabloon);
    $message = str_replace("{email}", $email, $message);
    $bericht = nl2br($bericht);
    $message = str_replace("{bericht}", $bericht, $message);

    $headers  = 'MIME-Version: 1.0\r\n';
    $headers .= 'Content-type: text/html; charset=iso-8859-1\r\n';
    $headers .= 'To: <' .$naar. '>\r\n';
    $headers .= 'From: ' .$name. ' ' .$surname. ' <' .$email. '>\r\n';

    if(mail($naar, $onderwerp, $message, $headers)){
         echo "De mail is succesvol verzonden, u wordt teruggestuurd naar het formulier";
         ?>
         <script language="javascript">setTimeout('document.location.href = "index3.html"', 2000);</script>
         <?
    }else{
         die("De mail kon niet verzonden worden, probeer later nog eens.");
    }

}else{
    die('U heeft het formulier niet ingevuld');
}
?>


Dit staat in de <script> tags:

   $(document).ready(function(){
        $("#myform").validate({
            debug: false,
            submitHandler: function(form) {
                // do other stuff for a valid form
                $.post('formverzenden.php', $("#myform").serialize(), function(data) {
                    $('#results').html(data);
                });
            }
        });
    });


Ook zie ik dat in de mail die ik ontvang {name} en {surname} niet worden ingevuld, terwijl dit bij {email}, {companyname} en {bericht} wel gebeurd.
Kunnen jullie me hiermee helpen?
- Ariën - op 13/03/2019 11:17:44
Het voorkomt ook een berichtenflood.

Nee, dat doet het niet. Bots maken doorgaans niet zulke nette/uitgebreide HTTP-requests. Cookies worden dus naar alle waarschijnlijkheid niet meegestuurd. De link naar je sessie is dus elke POST weg. Dus de teller begint bij elke aanroep opnieuw te lopen. Deze antiflood aanpak biedt dus geen enkele bescherming. Mede omdat je met deze aanpak niet afhankelijk bent van de sessie.

Je zou sessies wel kunnen gebruiken in combinatie met een CRSF-token, dat helpt waarschijnlijk stukken beter. In dit geval kun je namelijk niets POSTen zonder de aanwezigheid van een sessie, in deze opzet kun je dus niet zonder.
Toch wel hoor...
Berichtfloodings hoeven niet alleen van botjes vandaan te komen.
Het is puur bedoeld tegen vervelio's of mensen die vaak blijven klikken.

Tegen bots is het inderdaad niet bedoeld. CSRF zou een stuk netter zijn, maar ook re-Captcha zou niet misstaan. Die pikt de meeste botjes er wel uit aan de hand van hun gedrag.
Marina Koster op 13/03/2019 16:07:55

Ik heb het nu werkend, het formulier wordt verstuurd en ik krijg een melding op de plek van het formulier, dus dat is ook goed. Alleen verspringt de site na het verzenden weer naar het begin van de pagina. Is er een manier om te zorgen dat de site op #contact blijft staan na verzenden?

Dat kan door dit aan te passen:
<form method="post" action="/test/index.php">
Naar:
<form method="post" action="/test/index.php#contact">

Maar als je toch op de zelfde pagina blijft, kun je de action ook prima weglaten.

EDIT: Daarnaast zou ik de 'foutmeldingen' opsparen en allemaal weergeven. Niet alleen 'Uw voornaam is niet ingevuld' terwijl de rest ook niet is ingevuld.
- Ariën - op 13/03/2019 17:42:36
Het is puur bedoeld tegen vervelio's of mensen die vaak blijven klikken.

En die kunnen geen cookies weggooien? :/
Thomas van den Heuvel op 13/03/2019 17:51:02

[quote="- Ariën - op 13/03/2019 17:42:36"]Het is puur bedoeld tegen vervelio's of mensen die vaak blijven klikken.

En die kunnen geen cookies weggooien? :/
[/quote]
Die kunnen dat ook wel als ze willen. Onder normale omstandigheden werkt het prima.
Misschien kan ik het eens 'forken' (kopiëren en aanpassen) naar iets wat van deze tijd is.
Laat ik het anders formuleren.

De huidige antispam beveiliging is gebaseerd op (een) normale operatie (van browsers), maar spam volgt dit uitgangspunt zelden tot nooit. Daarom heeft deze oplossing op voorhand al de verkeerde insteek en is daarom gewoon ongeschikt als beveiliging.
Dat weet ik! Maar het werkt wel om per ongeluk gebruik in normale situaties tegen te gaan van mensen die te vaak klikken. CSRF is, zoals ik al bevestigde, een beter idee.
het script is ook gedateerd, en daar moet verandering in komen, vind ik.
Michael - op 13/03/2019 17:46:57

EDIT: Daarnaast zou ik de 'foutmeldingen' opsparen en allemaal weergeven. Niet alleen 'Uw voornaam is niet ingevuld' terwijl de rest ook niet is ingevuld.


<?php
    // naam controle
    if (empty($_POST['voornaam']))
        $voornaam_fout = 1;
	// achternaam controle
    if (empty($_POST['achternaam']))
        $achternaam_fout = 1;
	// bedrijfsnaam controle
    if (empty($_POST['bedrijfsnaam']))
        $bedrijfsnaam_fout = 1;
    // e-mail controle
    if (function_exists('filter_var') && !filter_var($_POST['mail'], FILTER_VALIDATE_EMAIL))
            $email_fout = 1;
    // antiflood controle
    if (!empty($_SESSION['antiflood']))
    {
        $seconde = 20; // 20 seconden voordat dezelfde persoon nog een keer een e-mail mag versturen
        $tijd = time() - $_SESSION['antiflood'];
        if($tijd < $seconde)
            $antiflood = 1;
    }
}

// Kijk of alle velden zijn ingevuld - naam mag alleen uit letters bestaan en het e-mailadres moet juist zijn
if (($_SERVER['REQUEST_METHOD'] == 'POST' && (!empty($antiflood) || empty($_POST['voornaam']) || !empty($voornaam_fout) || empty($_POST['achternaam']) || !empty($achternaam_fout) || empty($_POST['bedrijfsnaam']) || !empty($bedrijfsnaam_fout) || empty($_POST['mail']) || !empty($email_fout) || empty($_POST['bericht']))) || $_SERVER['REQUEST_METHOD'] == 'GET')
{
    if ($_SERVER['REQUEST_METHOD'] == 'POST')
    {
        if (!empty($voornaam_fout))
            echo '<p>Uw voornaam is niet ingevuld.</p>';
        elseif (!empty($achternaam_fout))
            echo '<p>Uw achternaam is niet juist.</p>';
        elseif (!empty($bedrijfsnaam_fout))
            echo '<p>Uw bedrijfsnaam is niet juist.</p>';
        elseif (!empty($email_fout))
            echo '<p>Uw e-mailadres is niet juist.</p>';
        elseif (!empty($antiflood))
            echo '<p>U mag slechts &eacute;&eacute;n bericht per ' . $seconde . ' seconde versturen.</p>';
        else
            echo '<p>U bent uw naam, bedrijfsnaam, e-mailadres of bericht vergeten in te vullen.</p>';
    }
?>


Hoe zou ik dat kunnen oplossen? Heeft dat met 'elseif' te maken?

[size=xsmall]Toevoeging op 14/03/2019 08:50:39:[/size]

- Ariën - op 13/03/2019 16:22:08

Is een bericht dat 'het versturen gelukt is' niet veel praktischer. Nu kom ik op de index uit, wat verwarrend is.


Ik heb het nu zo neergezet dat je na verzenden op het kopje contact blijft staan. Maar hoe zou jij het oplossen? Als een popup geen slimme zet is, wat zou ik dan kunnen doen?
Beste oplossing is om het formulier na afloop niet te tonen en een melding te tonen.

Het opsparen kan door de elseif'jes te vervangen door ifjes. En dan elke foutmelding in een array laten zetten. En deze na versturen controlen met count() op het aantal: Is dit 0, dan is alles prima. Is het meer dan 0, dan doorloop je de foutmeldingen met foreach.

Reageren