Hallo allemaal,

Ik heb met HTML5 (Bootstrap3) een contactformulier gemaakt.

Omdat ik de server taal PHP niet beheers ben ik opzoek gegaan naar een veilige code. Via w3schools.com kwam ik
een uitgebreid PHP script tegen voor formulieren.
https://www.w3schools.com/php/showphp.asp?filename=demo_form_validation_complete

Omdat ik het ingevulde formulier graag naar een e-mail adres wil laten sturen ben ik weer opzoek gegaan. Via phphulp.nl en PHPwiki heb ik stukjes code gevonden en vervolgens geprobeerd die stukjes script aan de code van w3schools.com toe te voegen. Klopt de code nu nog wel? Wellicht de volgorde?

Ik zie door de bomen het bos niet meer. Kan iemand mij alstublieft helpen?



<?php 
	
if(isset($_POST['emailadres'])) 
{
	$email_from = "[email protected]";
	$email_to = "[email protected]";
	$email_subject = "Contactform";
	
	$emailadres = filter_input(INPUT_POST,'emailadres', FILTER_VALIDATE_EMAIL);
	$naam = $_POST['naam'];
	$plaats = $_POST['plaats'];
	$email = $_POST['email'];
	$geslacht = $_POST['geslacht'];
	$comment = $_POST['comment'];
	$html = true;


$email_message = nl2br;

$headers .= "From:". $email_from . "\r\n";
$headers .= "To:". $email_to . "\r\n";
$headers .= "X-Mailer: PHP/".phpversion(). "\r\n";
$headers .= ($html) ? "MIME-Version: 1.0" . "\r\n";
$headers .= ($html) ? "Content-type:text/html;charset=UTF-8" . "\r\n";

@mail($email_to,$email_subject,$email_message,$headers);	
}
	
// define variables and set to empty values
$naamErr = $plaatsErr = $emailErr = $geslachtErr = $commentErr "";
$naam = $plaats = $email = $geslacht = $comment "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  if (empty($_POST["naam"])) {
    $naamErr = "Typ uw naam in";
  } else {
    $naam = test_input($_POST["naam"]);
    // check if name only contains letters and whitespace
    if (!preg_match("/^[a-zA-Z ]*$/",$naam)) {
      $naamErr = "Alleen letters en spaties"; 
    }
  }
  
  if (empty($_POST["plaats"])) {
    $plaatsErr = "Typ uw woonplaats in";
  } else {
    $plaats = test_input($_POST["plaats"]);
    // check if name only contains letters and whitespace
    if (!preg_match("/^[a-zA-Z ]*$/",$plaats)) {
      $plaatsErr = "Alleen letters en spaties"; 
    }
  }
  
  
  if (empty($_POST["email"])) {
    $emailErr = "Typ geldig email adres";
  } else {
    $email = test_input($_POST["email"]);
    // check if e-mail address is well-formed
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
      $emailErr = "Ongeldige email"; 
    }
  }
    
	 if (empty($_POST["geslacht"])) {
    $geslachtErr = "Maak geslachts keuze";
  } else {
    $geslacht = test_input($_POST["geslacht"]);
  }
}
	
  if (empty($_POST["comment"])) {
    $comment = "Typ uw opmerking of vraag";
  } else {
    $comment = test_input($_POST["comment"]);
	// check if name only contains letters and whitespace
    if (!preg_match("/^[a-zA-Z ]*$/",$plaats)) {
      $plaatsErr = "Alleen letters en spaties"; 
  	}
  }


function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
?>

	
<form class="form-horizontal" method="post" name="contactform" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">	
	
<h6>* Verplichte velden</h6><br />							
<div class="form-group row">
<label for="naam" class="col-sm-2 col-form-label">naam*</label>
<div class="col-sm-2">
<input class="form-control" type="text" name="naam" id="naam" placeholder="voor en achternaam" required>
<span class="error"><?php echo $naamErr;?></span>
</div>
</div>
				
<div class="form-group row">
<label for="plaats" class="col-sm-2 col-form-label">Woonplaats*</label>
<div class="col-sm-2">
<input class="form-control" type="text" name="plaats" id="plaats" required>
<span class="error"><?php echo $plaatsErr;?></span>
</div>
</div>
	
<div class="form-group row">
<label for="email" class="col-sm-2 col-form-label">E-mail*</label>
<div class="col-sm-3">
<input class="form-control" type="email" name="email" placeholder="[email protected]" id="email" required>
<span class="error"><?php echo $emailErr;?></span>
</div>
</div>
				
<div class="form-group row">
<label for="geslacht" class="col-sm-2">Geslacht*</label>
<div class="col-sm-2">
<select class="form-control" name="geslacht" id="geslacht">
<option>Man</option>
<option>Vrouw</option>
</select>
<span class="error"><?php echo $geslachtErr;?></span>
</div>
</div>
				
<div class="form-group row">
<label for="comment" class="col-sm-2">Opmerking*</label>
<div class="col-sm-5">
<textarea class="form-control" rows="3" name="comment" id="comment"></textarea>
<span class="error"><?php echo $commentErr;?></span>
</div> 
</div>	
				
<div class="form-group row">
<div class="col-sm-2"></div>
<div class="col-sm-2">
<button type="submit" class="btn btn-primary" value="sent">Verzend</button>	
</div>	
</div>	
</form>

<?php
echo "<h2>Your Input:</h2>";
echo $naam;
echo "<br />";
echo $plaats;
echo "br />"
echo $email;
echo "<br />";
echo $geslacht;
echo "<br />";
echo $comment;
echo "<br />";
?>

Anja v op 18/01/2018 13:41:14

Ik heb de code naar MS Word gekopieerd ...


Nooit MS Word gebruiken voor dit soort codes.
Gebruik dan Notepad of een goede ASCII editor.
Ikzelf zou dan eerder Notepad++ aanraden. Deze is speciaal bedoeld voor programmeren en dus ook voor PHP-code.
Ik zal het onthouden. Zoals doe je maar één keer fout.


<?php 
if(isset($_POST['submit'])){
	$email_from    = "[email protected]";
	$email_to      = "[email protected]";
	$email_subject = "Contactform";
	$emailadres    = filter_input(INPUT_POST,'emailadres', FILTER_VALIDATE_EMAIL);
	$naam          = $_POST['naam'];
	$plaats        = $_POST['plaats'];
	$email         = $_POST['email'];
	$geslacht      = $_POST['geslacht'];
	$comment       = $_POST['comment'];
	$html          = true;


$email_message = nl2br($comment);

$headers .= "From:". $email_from . "\r\n";
$headers .= "To:". $email_to . "\r\n";
$headers .= "X-Mailer: PHP/".phpversion(). "\r\n";
$headers .= ($html) ? "MIME-Version: 1.0" . "\r\n" : '';
$headers .= ($html) ? "Content-type:text/html;charset=UTF-8" . "\r\n" : '';

if(mail($email_to,$email_subject,$email_message,$headers)) {	
 //Alles Oké? we sturen de gebruiker door naar de bedankt pagina.
	header("location: bedankt.html");
	exit();
} else {
	echo "Er is een technische fout aan onze kant. Gelieve ons een mail te sturen op: ".$email_to;
}
}
	
// define variables and set to empty values
$naamErr = $plaatsErr = $emailErr = $geslachtErr = $commentErr = "";
$naam    = $plaats    = $email    = $geslacht    = $comment = "";

if ("POST" == $_SERVER["REQUEST_METHOD"]) {
  if (empty($_POST["naam"])) {
    $naamErr = "Typ a.u.b. uw naam";
  } else {
    $naam = test_input($_POST["naam"]);
    // check if name only contains letters and whitespace
    if ( ! preg_match("/^[a-zA-Z ]*$/", $naam)) {
      $naamErr = "Alleen letters en spaties toegestaan"; 
    }
  }
  
  if (empty($_POST["plaats"])) {
    $plaatsErr = "Typ a.u.b. uw woonplaats";
  } else {
    $plaats = test_input($_POST["plaats"]);
    // check if name only contains letters and whitespace
    if (!preg_match("/^[a-zA-Z ]*$/", $plaats)) {
      $plaatsErr = "Alleen letters en spaties toegestaan"; 
    }
  }
  
  
  if (empty($_POST["email"])) {
    $emailErr = "Typ a.u.b. een geldig emailadres";
  } else {
    $email = test_input($_POST["email"]);
    // check if e-mail address is well-formed
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
      $emailErr = "Ongeldige email"; 
    }
  }
    
   if (empty($_POST["geslacht"])) {
    $geslachtErr = "Maak geslachts keuze";
  } else {
    $geslacht = test_input($_POST["geslacht"]);
  }
}
	
  if (empty($_POST["comment"])) {
    $comment = "Typ uw opmerking of vraag";
  } else {
    $comment = test_input($_POST["comment"]);
	// check if name only contains letters and whitespace
    if (!preg_match("/^[a-zA-Z0-9\. ]*$/", $plaats)) {
      $plaatsErr = "Alleen (hoofd)letters, cijfers, punten en spaties toegestaan"; 
  	}
  }


function test_input($data) 
{
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
	
  return $data;
}
	
?>
	
<form class="form-horizontal" method="post" name="contactform" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
	
<h6>* Verplichte velden</h6><br />			
				
<div class="form-group row">
<label for="naam" class="col-sm-2 col-form-label">naam*</label>
<div class="col-sm-2">
<input class="form-control" type="text" name="naam" id="naam" placeholder="voor en achternaam" required>
<span class="error"><?php echo $naamErr;?></span>
</div>
</div>
				
<div class="form-group row">
<label for="plaats" class="col-sm-2 col-form-label">Woonplaats*</label>
<div class="col-sm-2">
<input class="form-control" type="text" name="plaats" id="plaats" required>
<span class="error"><?php echo $plaatsErr;?></span>
</div>
</div>
	
<div class="form-group row">
<label for="email" class="col-sm-2 col-form-label">E-mail*</label>
<div class="col-sm-3">
<input class="form-control" type="email" name="email" placeholder="[email protected]" id="email" required>
<span class="error"><?php echo $emailErr;?></span>
</div>
</div>
				
<div class="form-group row">
<label for="geslacht" class="col-sm-2">Geslacht*</label>
<div class="col-sm-2">
<select class="form-control" name="geslacht" id="geslacht">
<option>Man</option>
<option>Vrouw</option>
</select>
<span class="error"><?php echo $geslachtErr;?></span>
</div>
</div>
				
<div class="form-group row">
<label for="comment" class="col-sm-2">Opmerking*</label>
<div class="col-sm-5">
<textarea class="form-control" rows="3" name="comment" id="comment"></textarea>
<span class="error"><?php echo $commentErr;?></span>
</div> 
</div>	
				
<div class="form-group row">
<div class="col-sm-2"></div>
<div class="col-sm-2">
<button type="submit" name="submit" class="btn btn-primary">Verzend</button>	
</div>	
</div>	

</form>






Het formulier werkt!
Nadat ik code
<?php if(isset($_POST['emailadres']))?>

veranderd had in
<?php if(isset($_POST['submit']))?>

Dat geeft een goed gevoel.

Nu komt alleen de $comment binnen.
 <?php $email_message = nl2br($comment);?>


Ik dacht dat ik dat kon aanpassen door dit toe te voegen:
<?php $email_message = nl2br($naam,$plaats,$email,$comment);?> 

Maar als ik dat doe, dan ontvang ik opeens geen email(s) meer.

Mogen die komma's niet? Zie ik iets over het hoofd?
enig idee wat nl2br eigenlijk doet?

http://php.net/nl2br

Wat verwacht je dat nl2br() met meerdere argumenten moet doen?

Er gaan 1 of 2 parameters die functie in: een string die eventueel enters bevat, en een boolean die middels true/false aangeeft wat voor smaak html je gebruikt.



[size=xsmall]Toevoeging op 22/01/2018 16:29:09:[/size]

verder zou ik ipv
<?php if(isset($_POST['submit']))?>

liever gaan voor

<?php if('POST' == $_SERVER['REQUEST_METHOD']) ?>

je wilt immers weten of een formulier gepost werd? Niet of dat toevallig gedaan werd door een klik op een button of dat javascript of "enter" daarvoor verantwoordelijk was...
Vervang dit:
<?php if(isset($_POST['submit']))?>

door dit:

<?php
if($_SERVER['REQUEST_METHOD']=="POST") {
?>

Je wilt immers controleren of een formulier verstuurd is, en niet of er op een knop gedrukt is.
Klik eens in je code-blok op de functienaam nl2br(). Dan zie je dat er twee argumenten voor zijn, dus je mag geen komma's gebruiken voor elk veld. Normaliter gebruik je nl2br() op de output, en niet op de invoer.

Dus dat moet je nog aanpassen.



<?php
if (!preg_match("/^[a-zA-Z0-9\. ]*$/", $plaats)) {
$plaatsErr = "Alleen (hoofd)letters, cijfers, punten en spaties toegestaan";
}
?>

afgezien van dat je hiet $plaats en $plaatsErr gebruikt terwijl je met $_POST['comment'] bezig bent:
je bent hier heel strikt in wat jij vindt dat er in een invoer hooft te staan.
Kennlijk geen komma's in commentaar. En ook de ' of een létter met àcçent mag niet van jou.

Ik zie eigenlijk geen reden om dat ter verbieden.
Dat je checkt of een emailadres een emailadres zou kunnen zijn, kan ik begrijpen.

Maar waarom een woonplaats maar bepaalde letters en tekens mag bevatten? Je staat wel toe dat je het veld leeg laat (in elk geval in de preg-functie)
maar plaatsnamen met een koppelteken of een accent, mag weer niet.
Idem voor namen.

En wat heb je nu precies gewonnen met deze restrictie?
Een rij geërgerde gebruikers die hun naam en woornplaats niet in mogen voeren, zoals het normaal geschreven wordt?

De enige tekens die eventueel schadelijk zouden kúnenn zijn, zijn mi. de ', de < en >

Maar die vang je af met de juiste escape functies: mysqli_real_escape_string voor de ' als het om query's gaat en htmlspecialchars() voor de <> en dan met name bij het schrijven van de teksten (de output)




Eén stap vooruit, twee achteruit. Wel leerzaam.

Ivo P = Het is natuurlijk niet de bedoeling dat een bezoeker gefrustreerd raakt. Ik heb dit zo overgenomen van de code op W3Schools. Ik weet nu alleen hoe je een punt toevoegt \.
Ik zal kijken of ik iets met de informatie kan, want dit alles is voor mij nieuw. Het is een leerproces.
Ik kan met termen om m'n hoofd worden geslingerd, en het zal goed bedoeld zijn, maar dan is het nog de vraag of ik het voor elkaar krijg om het goed toe te passen. Het is vaak lastig om te weten hoe en waar je wat moet plaatsen.

Het is me gelukt om meer informatie te versturen dan alleen 'comment' :)
Op de pagina werd uitgelegd hoe je dat kunt doen:
http://webprofis.nl/discussion/372/handleiding-verwerken-data-formulier

De code ziet er nu zo uit:


<?php 
if($_SERVER['REQUEST_METHOD']=="POST") {
	$email_from    = "domeinnaam";
	$email_to      = "[email protected]";
	$email_subject = "Contactform";
	$emailadres    = filter_input(INPPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
	$naam          = $_POST['naam'];
	$plaats	       = $_POST['plaats'];
	$email	       = $_POST['email'];
	$geslacht      = $_POST['geslacht'];
	$comment       = $_POST['comment'];
	$html	       = true;


//opmaken email	
$content     = "";
$content    .= "Naam: ";
$content    .= $naam;
$content    .= "\n"; 
$content    .= "plaats: ";
$content    .= $plaats;
$content    .= "\n"; 
$content    .= "email: ";
$content    .= $email;
$content    .= "\n"; 
$content    .= "geslacht: ";
$content    .= $geslacht;
$content    .= "\n"; 
$content    .= "comment: ";
$content    .= $comment;
$content    .= "\n"; 		
	
	
$headers    .= "From:". $email_from . "\r\n";
$headers    .= "To:". $email_to . "\r\n";
$headers    .= "X-Mailer: PHP/".phpversion(). "\r\n";
$headers    .= ($html) ? "MIME-Version: 1.0" . "\r\n" : '';
$headers    .= ($html) ? "Content-type:text/html;charset=UTF-8" . "\r\n" : '';
	
if(mail($email_to,$email_subject,$content,$headers)) {	
 //Alles Oké? we sturen de gebruiker door naar de bedankt pagina.
	header("location: bedankt.html");
	exit();
} else {
	echo "Er is een technische fout aan onze kant. Gelieve ons een mail te sturen op: ".$email_to;
}
}

----knip-----	

	
?>



Is $email & $emailadres eigenlijk niet dubbel?

Nu zie je in de e-mail alle informatie achter elkaar staan.
Het zou mogelijk moeten zijn om de informatie (naam, plaats etc.)elk op een nieuwe regel te zien, dat is overzichtelijker. Ik heb nog niet kunnen vinden hoe je dat kunt doen.


<?php
$naam = $_POST['naam'];
$plaats = $_POST['plaats'];
$email = $_POST['email'];
$geslacht = $_POST['geslacht'];
$comment = $_POST['comment'];
$html = true;
?>
[/code]

Excuses dat dit niet netjes onder elkaar staat. Het gebeurt bij het kopieren.
In het php bestand staat het wel netjes onder elkaar. Als ik het met de hand aanpas staat het wel netjes onder elkaar, totdat ik op 'wijzigen' druk, dan staat het niet meer onder elkaar zoals nu. Vreemd.
Als ik dit zie, dan heb ik het idee van: 'waarom?'
je kopieert feitelijk gewoon $_POST variabelen opnieuw in een PHP-variabele.
Wat is het nut daarvan?


Je kan immers prima $_POST['naam'], $_POST['plaats'] etc in je script gebruiken.
regel 3: hier defineer je de afzender van de mail. Daar zou een mailadres moeten staan. Mogelijk is het ook ok om "mijn site <[email protected]>" te gebruiken. Maar niet zo maar een tekst.

regel 4: $email_to zegt waar de mail heen gaat.

regel 9: $email bevat het mailadres dat de bezoeker intikte en dat je ergens in de inhoud van de mail vermeldt

regel 35: is overbodig: dat staat al op regel 40 als eerste parameter van de functie mail().

Je mail bevat geen html. Op regel 12 lijkt me false dan ook op zijn plaats.

[size=xsmall]Toevoeging op 24/01/2018 10:36:26:[/size]

o
en regel 6 bevat een fout

$emailadres = filter_input(INPPUT_POST, 'email', FILTER_VALIDATE_EMAIL);

INPUT_POST is met een P minder.
Maar die hele regel is overbodig: je gebruikt $emailadres zo te zien helemaal niet.

<?php
if($_SERVER['REQUEST_METHOD']=="POST") {
	$email_from    = "domeinnaam <[email protected]>";
	$email_to      = "[email protected]";
	$email_subject = "Contactform";
	$naam          = $_POST['naam'];
	$plaats        = $_POST['plaats'];
	$email         = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
	$geslacht      = $_POST['geslacht'];
	$comment       = $_POST['comment'];
	$html	       = false;

$content     = 'Naam: ' . $naam . "\r\n" . 'Plaats: ' . $plaats . "\r\n" . 'E-mail: ' . $email . "\r\n" 
            .  'Geslacht: ' . $geslacht . "\r\n" . 'Vraag: ' . $comment;

$headers    .= "From:". $email_from . "\r\n";
$headers    .= "X-Mailer: PHP/".phpversion(). "\r\n";
$headers    .= ($html) ? "MIME-Version: 1.0" . "\r\n" : '';
$headers    .= ($html) ? "Content-type:text/html;charset=UTF-8" . "\r\n" : '';
	
if(mail($email_to,$email_subject,$content,$headers)) {	
 //Alles Oké? we sturen de gebruiker door naar de bedankt pagina.
	header("location: bedankt.html");
	exit();
} else {
	echo "Er is een technische fout aan onze kant. Gelieve ons een mail te sturen op: ".$email_to;
}
}

?>
----knip------


Jullie adviezen heb ik, zover ik kon, doorgevoerd, dank daarvoor.
$content heb ik iets veranderd, de informatie uit het formulier komt in de e-mail nu netjes elk op een nieuwe regel. Wel zo overzichtelijk.


Ivo P
Bedoel je met deze zin 'htmlspecialchars() voor de <> en dan met name bij het schrijven van de teksten (de output)'

dat ik in plaats van deze code voor de invoer, !pregmatch() in het bijzonder:

<?php

if ("POST" == $_SERVER["REQUEST_METHOD"]) {
  if (empty($_POST["naam"])) {
    $naamErr = "Typ a.u.b. uw voor- en achternaam";
  } else {
    $naam = ($_POST["naam"]);
    // de code hieronder bedoel ik
    if  (!preg_match("/^[a-zA-Z ]*$/", $naam)) {
    $naamErr = " "; 

?>


deze kan gebruiken? Zodat gebruikers hun naam wel goed kunnen schrijven?

<?php

    if  (!preg_match(htmlspecialchars($naam))){
      $naamErr = " "; 

?>

Reageren