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 />";
?>

Hartelijk dank voor jullie reacties.


Bedankt Ariën voor de code om een bezoeker door te sturen naar een bedankt pagina, dat was inderdaad nog een vraag die ik nog wilde stellen.

Nick Vledder, Anti spam en captcha is zeker belangrijk is deze tijd, als deze code werkt ga ik daar zeker naar opzoek. De values voor het geslacht zijn man of vrouw.
Het idee erachter is dat bij een voornaam het soms niet helemaal duidelijk is of het een man of vrouw betreft. Als men een bericht terug schrijft is het wel fijn om die persoon aan te kunnen schrijven met heer, of mevrouw,

Ivo P ik begrijp je reactie. Ik had zelf al gezien dat je bij het invul veld ‘comment’ geen punt mag gebruiken. Wat denk ik heel frustrerend is voor iemand die een bericht probeert te typen. Maar ik weet helaas niet hoe ik dit kan aanpassen.

De website waar deze pagina uiteindelijk opkomt is voorzien van SSL https://. Dat is denk ik altijd wel belangrijk als men formulieren moet kunnen invullen.

De code ziet er na jullie suggesties zo uit:

<?php

// voor ontwikkeling
	error_resporting(E-ALL);
	ini_set('display_errors', 'stdout');
	
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($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 gebruiken door naar de bedankt pagina.
	header("location: bedankt.php");
	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 ($_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 />";
?>




Ik heb de php pagina geupload naar de server.
Ik krijg de pagina niet te zien alleen deze foutmeldingen:

Parse error: syntax error, unexpected ';' in /public/sites/www.domeinnaam.nl/testform.php on line 70

$headers .= ($html) ? "MIME-Version: 1.0" . "\r\n";
$headers .= ($html) ? "Content-type:text/html;charset=UTF-8" . "\r\n";

Ik mis een false, dit moet wel werken:
<?php
$headers .= ($html) ? 'MIME-Version: 1.0' . "\r\n" : '';
$headers .= ($html) ? 'Content-type: text/html; charset=UTF-8' . "\r\n" : '';
?>
[/code]
In deze code laat je die twee waardes leeg als HTML uit staat. Je hebt dan geen MIME en Content-Type nodig.

De opbouw is:

(voorwaarde) ? true : false;


Zie ook: https://davidwalsh.name/php-shorthand-if-else-ternary-operators

maar je code is nog steeds verre van netjes. Om even een eerdere bericht aan te halen uit een ander gelijkwaardig topic:

- Ariën - op 17/01/2018 14:58:24

Persoonlijk zou ik er één script van maken in een enkel bestand. Je wilt immers ook invoer-validatie toevoegen, en het netste is dat je hierbij een melding bij de velden toont die niet of incompleet ingevuld zijn.

Het belangrijkste hierbij is dat je in je script als eerste de PHP-scripting uitvoert, en controleert of er een formulier verstuurd is:


<?php
if($_SERVER['REQUEST_METHOD']=="POST") {
// je formulier is verstuurd!
// valideer eerst je invoer
// Als dit allemaal gepasseerd is, dan verstuur je het formulier via mail
} else {
?>
Hier komt je formulier....
<?php
}
?>



In dat topic staan nog een hoop tips hierover.
Als ik ($html) ? weghaal, foutmelding opeens opgelost, krijg ik vervolgens deze foutmelding:

Parse error: syntax error, unexpected '""' (T_CONSTANT_ENCAPSED_STRING) in /public/sites/www.websitenaam.nl/testform.php on line 75

Wat betrekking heeft op:
<?php
$naamErr = $plaatsErr = $emailErr = $geslachtErr = $commentErr "";
$naam = $plaats = $email = $geslacht = $comment "";
?>


Als ik dit zou veranderen, geen idee hoe en waarom, maar dan zou de laatste foutmelding zijn:
<?php
echo $email;
echo "<br />";
?>

Want mijn HTML editor geeft namelijk precies dezelfde foutmeldingen aan. De regel nummer staat in het rood aangegeven, als je de cursor er boven houdt krijg je die foutmeldingen.
@Anja: heb je mijn bericht wel gelezen? Daar zijn de fouten uit waar je nu last van hebt.
Bedoel je dit:
in plaat van

in plaats van:
<?php
$html = true;
?>

wordt:
<?php
$html = ? true : false;
?>


dit veroorzaakt weer een extra foutmelding = syntac error unexpected '?'

Ik zal de desbetreffende pagina gaan doorlezen, dankjewel.

Het blijft lastig omdat ik php niet beheerst. Ik probeer door het script de bekijken de logica ervan in de zien en indien mogelijk een beetje aan te passen, maar zonder het besef te hebben of het een veilig script is of, of de opbouw ervan goed is. Het is heel fijn omdat hier te kunnen vragen aan forum leden die wel weten hoe de vork in de steel zit.
Let wel even op, want die zwarte code is alleen de syntax en geen bruikbare code.
Lees anders mijn post nog eens goed.
Jan Koehoorn op 17/01/2018 16:23:02

@Anja: heb je mijn bericht wel gelezen? Daar zijn de fouten uit waar je nu last van hebt.


Jazeker, ik heb het PHP script zelfs geprint. En het script aangepast.
Ik zag o.a. dat de echo's onderaan verwijderd waren. Ik wist niet zeker of dat de bedoeling was of dat het per ongeluk niet mee gekopieerd was.
Ik zou misschien eens kijken naar een goede opbouw van het formulier, zoals in het aangehaalde andere topic.
Het kan tevens een mooie beginners-les zijn als je PHP onder de knie wilt krijgen.
Anja v op 17/01/2018 16:27:32

[quote="Jan Koehoorn op 17/01/2018 16:23:02"]
@Anja: heb je mijn bericht wel gelezen? Daar zijn de fouten uit waar je nu last van hebt.


Jazeker, ik heb het PHP script zelfs geprint. En het script aangepast.
Ik zag o.a. dat de echo's onderaan verwijderd waren. Ik wist niet zeker of dat de bedoeling was of dat het per ongeluk niet mee gekopieerd was.
[/quote]

In mijn code staat bijvoorbeeld dit:
<?php
// define variables and set to empty values
$naamErr = $plaatsErr = $emailErr = $geslachtErr = $commentErr = "";
$naam = $plaats = $email = $geslacht = $comment = "";
?>

Dit ziet er anders uit dan in jouw laatste post ;-)

edit:

Daar staat namelijk:
<?php
$naamErr = $plaatsErr = $emailErr = $geslachtErr = $commentErr "";
$naam = $plaats = $email = $geslacht = $comment "";
?>
(let op het laatste = teken bij mij)
En er zijn nog meer verschillen, waar ik uit opmaak dat je het niet integraal overgenomen hebt.
**quoteknip**

Ja, ik zie het.
Ik heb de code naar MS Word gekopieerd en uitgeprint om het vervolgens aan te passen. Door het kopiëren naar Word zijn sommige code tekst verplaatst van positie.
Ik heb het nu gekopieerd naar een php bestand. En zal de code nu opnieuw gaan vergelijken. Dankjewel.

Reageren