PHP formulier checken en spam vrij versturen

Status
Niet open voor verdere reacties.
Ja mijn php bestand ziet er zo uit. Ik heb in het formulier nog dit stukje:
PHP:
<?php echo $message; ?>

FILTER_VALIDATE_EMAIL kun je beter niet meer gebruiken. sommige e-mailadressen valideert hij niet goed.
je kunt beter regex: preg_match gebruiken want daarmee kun je precies aangeven waar het email adres aan moet voldoen.
(araf!a@live.nl volgens mij mag wel maar wordt niet door gelaten door de functie)

Hoe moet ik dat toepassen dan?

@arjan96s:

Ik kwam dit tegen op http://php.net/manual/en/function.preg-match.php
PHP:
<?php 
function email_valid($temp_email) { 
######## Three functions to HELP ######## 
        function valid_dot_pos($email) { 
            $str_len = strlen($email); 
            for($i=0; $i<$str_len; $i++) { 
                $current_element = $email[$i]; 
                if($current_element == "." && ($email[$i+1] == ".")) { 
                    return false; 
                    break; 
                } 
                else { 

                } 
            } 
            return true; 
        } 
        function valid_local_part($local_part) { 
            if(preg_match("/[^a-zA-Z0-9-_@.!#$%&'*\/+=?^`{\|}~]/", $local_part)) {
                 return false; 
            } 
            else { 
                return true; 
            } 
        } 
        function valid_domain_part($domain_part) { 
            if(preg_match("/[^a-zA-Z0-9@#\[\].]/", $domain_part)) { 
                return false; 
            } 
            elseif(preg_match("/[@]/", $domain_part) && preg_match("/[#]/", $domain_part)) {
                 return false; 
            } 
            elseif(preg_match("/[\[]/", $domain_part) || preg_match("/[\]]/", $domain_part)) {
                 $dot_pos = strrpos($domain_part, "."); 
                if(($dot_pos < strrpos($domain_part, "]")) || (strrpos($domain_part, "]") < strrpos($domain_part, "["))) {
                     return true; 
                } 
                elseif(preg_match("/[^0-9.]/", $domain_part)) { 
                    return false; 
                } 
                else { 
                    return false; 
                } 
            } 
            else { 
                return true; 
            } 
        } 
        // trim() the entered E-Mail 
        $str_trimmed = trim($temp_email); 
        // find the @ position 
        $at_pos = strrpos($str_trimmed, "@"); 
        // find the . position 
        $dot_pos = strrpos($str_trimmed, "."); 
        // this will cut the local part and return it in $local_part 
        $local_part = substr($str_trimmed, 0, $at_pos); 
        // this will cut the domain part and return it in $domain_part 
        $domain_part = substr($str_trimmed, $at_pos); 
        if(!isset($str_trimmed) || is_null($str_trimmed) || empty($str_trimmed) || $str_trimmed == "") {
             $this->email_status = "You must insert something"; 
            return false; 
        } 
        elseif(!valid_local_part($local_part)) { 
            $this->email_status = "Invalid E-Mail Address"; 
            return false; 
        } 
        elseif(!valid_domain_part($domain_part)) { 
            $this->email_status = "Invalid E-Mail Address"; 
            return false; 
        } 
        elseif($at_pos > $dot_pos) { 
            $this->email_status = "Invalid E-Mail Address"; 
            return false; 
        } 
        elseif(!valid_local_part($local_part)) { 
            $this->email_status = "Invalid E-Mail Address"; 
            return false; 
        } 
        elseif(($str_trimmed[$at_pos + 1]) == ".") { 
            $this->email_status = "Invalid E-Mail Address"; 
            return false; 
        } 
        elseif(!preg_match("/[(@)]/", $str_trimmed) || !preg_match("/[(.)]/", $str_trimmed)) {
             $this->email_status = "Invalid E-Mail Address"; 
            return false; 
        } 
        else { 
            $this->email_status = ""; 
            return true; 
        } 
} 
?>

Overigens heb ik geen idee wat het script uitvoert. Ja iets met email valideren, maar wat precies?
 
Laatst bewerkt door een moderator:
Ook hebben wij liever dat je de knop "Bericht aanpassen" gebruikt wanneer je wat wilt toevoegen aan je bericht zonder dat er iemand op gereageerd heeft.
 
preg_match zou een goeie zijn.
zoek maar eens op email validation php preg_match

of
PHP:
<?php
$email = $_POST['email'];
$fout = false;
if($email = explode("@",$email))
{
if(!strlen($email[0])>2)
{
$fout = true;
}
}
if($extensie = explode(".",$email[2]))
{
if(!strlen($extensie[1])=>2)
{
$fout = true;
}
if(!strlen($extensie[0])>2)
{
$fout = true;
}
}
if($fout)
{
echo 'er was een fout. vul een geldig email adres in.';
}
else
{
echo 'goed email adres';
}
?>
zoiets kan ook. is iets minder goed gecontroleerd maar wel snel.
je controleerd of er een @ in zit en een .
dat is de eerste vereiste van een email adres.
 
Hij geeft nu de volgende foutmelding:
Parse error: syntax error, unexpected T_DOUBLE_ARROW in C:\xampp\htdocs\BOM\send.php on line 13

En, waar moet ik deze code tussen/voor/achter plaatsen, bij mijn bestaande php script die de andere velden controleert?
 
Laatst bewerkt:
De preg match zal dan zoiets zijn:

deze moet je wegzetten inplaats van de filter_validate_email

PHP:
preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])
  ↪*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/",
               $email)
 
PHP:
<?php
$email = $_POST['email'];
$fout = false;
if($email = explode("@",$email))
{
if(!strlen($email[0])>2)
{
$fout = true;
}
}
if($extensie = explode(".",$email[1]))
{
if(!strlen($extensie[1])=>2)
{
$fout = true;
}
if(!strlen($extensie[0])>2)
{
$fout = true;
}
}
if($fout)
{
echo 'er was een fout. vul een geldig email adres in.';
}
else
{
echo 'goed email adres';
}
?>
zo moet hij wel werken. die preg_match van klaaspeter is ook goed. die controleert beter maar is langzamer.
 
De preg match zal dan zoiets zijn:

deze moet je wegzetten inplaats van de filter_validate_email

PHP:
preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])
  ↪*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/",
               $email)

Ik heb nu dit script:
PHP:
<?php
	$message = '';
	if($_SERVER['REQUEST_METHOD'] == 'POST'){
	$name = htmlentities($_POST['naam']);
	$email = htmlentities($_POST['email']);
	$bericht = htmlentities($_POST['bericht']);
	
	// && == and
	// || == or , deze heb ik niet gebruikt maar vertel het er even bij
	if (!empty($name) && !empty($bericht) && preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])?*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $email) {
		$to = 'a.wal16@chello.nl';
		$subject = '';
		$msg = "Naam: $name\n" .
		"E-mail: $email\n" .
		"Bericht: $other";
		mail($to, $subject, $msg, 'From:' . $email);
	} else {
		$message = 'De gegevens zijn niet correct ingevuld.';
	}}
?>

Ik krijg dan de volgende foutmelding:
Parse error: syntax error, unexpected '{' in C:\xampp\htdocs\BOM\send.php on line 10
 
Je bent vergeten het IF-statement van regel 10 af te sluiten :) (Er mist een haakje sluiten op het eind)
 
Oke, ik heb een extra haakje sluiten toegevoegd op lijn 10. Nu krijg ik weer die lege pagina als ik het formulier correct en onjuist invul.

PHP:
<?php
	$message = '';
	if($_SERVER['REQUEST_METHOD'] == 'POST'){
	$name = htmlentities($_POST['naam']);
	$email = htmlentities($_POST['email']);
	$bericht = htmlentities($_POST['bericht']);
	
	// && == and
	// || == or , deze heb ik niet gebruikt maar vertel het er even bij
	if (!empty($name) && !empty($bericht) && preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])?*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $email)) {
		$to = '{e-mailadres}';
		$subject = '';
		$msg = "Naam: $name\n" .
		"E-mail: $email\n" .
		"Bericht: $other";
		mail($to, $subject, $msg, 'From:' . $email);
	} else {
		$message = 'De gegevens zijn niet correct ingevuld.';
	}}
?>

Als ik de laatste $message aanpas naar echo, dan zegt ie bij een leeg formulier: De gegevens zijn niet correct ingevuld. Bij het correct invullen, geeft ie deze melding:
Warning: preg_match() [function.preg-match]: Compilation failed: nothing to repeat at offset 33 in C:\xampp\htdocs\BOM\send.php on line 10
De gegevens zijn niet correct ingevuld.
 
Laatst bewerkt door een moderator:
Mijn php ziet er nu als volgt uit:

PHP:
<?php
	function checkEmail($email)
	{
		return preg_match('/^[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\.-][a-z0-9]+)*)+\\.[a-z]{2,}$/i', $email);
	}

	$name = '';
	$email = '';
	$bericht = '';

	if(isset($_POST['submit'])) {
		//vanaf hier weet je zeker dat het formulier is verstuurd

		$naam = $_POST['naam'];
		$email = $_POST['email'];
		$bericht = $_POST['bericht'];

		if(!empty($_POST['naam']) && !empty($_POST['email']) && !empty($_POST['bericht']) && !empty($_POST['code'])) {
			//hier weet ik dat alles gevuld is

			if(checkEmail($email)) {
				if($_POST['code'] == $_SESSION['rand_code']) {
			
					// send email
					$to = '{e-mailadres}';
					$subject = 'Contactformulier';
					$msg = "Naam: $naam\n" .
					"E-mail:$email\n" .
					"Bericht: $bericht";
					mail($to, $subject, $msg, 'From:' . $email);
					
					$accept = "Formulier is verstuurd!.";
				
				} else {
					$error = "Foute code.";
				}
			}
			else {
				$error = "Ongeldig e-mailadres";
			}
		} else {
			$error = "Vul het hele formulier in.";
		}
}

Het contact.php ziet er zo uit:
PHP:
<?php if(!empty($error)) echo '<div class="error">'.$error.'</div>'; ?>
<?php if(!empty($accept)) echo '<div class="accept">'.$accept.'</div>'; ?>
			
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<label for="naam">Naam*:</label>
<input class="text" type="text" id="naam" name="naam" /><br />
<label for="email">E-mail*:</label>
<input class="text" type="text" id="email" name="email" /><br />
<label for="bericht">Bericht*:</label>
<textarea id="bericht" name="bericht"></textarea><br /><br />
<label for="code">Typ de code:</label>
<input class="text" type="text" id="code" name="code" /><br />
<img src="captcha.php" /><br /><br /><br />
		
Velden met een * zijn verplicht.<br /><br />
				
<input class="verz" type="submit" value="Verzenden" name="submit" />
</form>

En de captcha.php ziet er zo uit:
PHP:
<?php
	session_start();	
	
	$string = '';
	
	for ($i = 0; $i <5; $i++) {
		$string .= chr(rand(97, 122));
	}
	$_SESSION['random_code'] = $string;
	
	$dir = 'Fonts/';
	
	$image = imagecreatetruecolor(170, 60);
	$black = imagecolorallocate($image, 0, 0, 0);
	$color = imagecolorallocate($image, 200, 100, 90); // red
	$white = imagecolorallocate($image, 255, 255, 255);
	imagefilledrectangle($image, 0, 0, 399, 99, $white);
	imagettftext ($image, 30, 0, 10, 40, $color, $dir."arial.ttf", $_SESSION['random_code']);
	
	header("Content-type: image/png");
	imagepng($image);
?>

Alles werkt, behalve de captcha. Hij zegt "Foute code", bij het correct invullen. Wat doe ik fout?
Wie kan mij helpen? Het moet van het weekend online.
 
Laatst bewerkt door een moderator:
PHP:
if(isset($_POST['submit'])) {
        //vanaf hier weet je zeker dat het formulier is verstuurd
Dit is niet de juiste methode, het geeft alleen maar aan dat er een formulier-veld genaamd "submit" bestaat.
Wil je controleren of een formulier verzonden is doe je dat op deze manier (Die je overigens in een vorig script wel had staan)
PHP:
if($_SERVER['REQUEST_METHOD'] == 'POST'){

Verder is het een kwestie van debuggen, de waardes komen blijkbaar niet overeen. Wat doe je dan?
Juist: controleren wat er dan in die waardes zit:

PHP:
if($_SERVER['REQUEST_METHOD'] == 'POST') {
    echo $_POST['code'] .' == '. $_SESSION['rand_code'];
    exit; // Stop met het uitvoeren van de rest
    
    $naam = $_POST['naam'];
    $email = $_POST['email'];
    $bericht = $_POST['bericht'];
// ... etc

Overigens is de oplossing eenvoudig: Kijk eens welke sessie-variabele je aanmaakt in captcha.php en welke je opvraagt bij je controle? :)

Het moet van het weekend online.
:(
 
Ik heb nu dit:
PHP:
<?php
	function checkEmail($email)
	{
		return preg_match('/^[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\.-][a-z0-9]+)*)+\\.[a-z]{2,}$/i', $email);
	}

	$name = '';
	$email = '';
	$bericht = '';

	if(isset($_POST['submit'])) {
		//vanaf hier weet je zeker dat het formulier is verstuurd
		if($_SERVER['REQUEST_METHOD'] == 'POST') {
			echo $_POST['code'] . ' == ' . $_SESSION['rand_code']; {
			exit; // Stop met het uitvoeren van de rest
			
			$naam = htmlentities($_POST['naam']);
			$email = htmlentities($_POST['email']);
			$bericht = htmlentities($_POST['bericht']);

			if(!empty($_POST['naam']) && !empty($_POST['email']) && !empty($_POST['bericht']) && !empty($_POST['code'])) {
				//hier weet ik dat alles gevuld is

				if(checkEmail($email)) {
						// send email
						$to = '{e-mailadres}';
						$subject = 'Contactformulier';
						$msg = "Naam: $naam\n" .
						"E-mail:$email\n" .
						"Bericht: $bericht";
						mail($to, $subject, $msg, 'From:' . $email);
						
						$accept = "Formulier is verstuurd!.";
					
					} else {
						$error = "Foute code.";
					}
				}
				else {
					$error = "Ongeldig e-mailadres";
				}
			} else {
				$error = "Vul het hele formulier in.";
			}
} }
?>

Krijg de volgende foutmelding:
Parse error: syntax error, unexpected T_ELSE in C:\xampp\htdocs\BOM\send.php on line 42
 
Laatst bewerkt door een moderator:
De bedoeling was ook dat je dit:
PHP:
if(isset($_POST['submit'])) {
    //vanaf hier weet je zeker dat het formulier is verstuurd

    $naam = $_POST['naam'];
zou vervangen door dit:
PHP:
if($_SERVER['REQUEST_METHOD'] == 'POST') {
    echo $_POST['code'] . ' == ' . $_SESSION['rand_code'];
    exit; // Stop met het uitvoeren van de rest

    $naam = $_POST['naam'];
:)
 
Laatst bewerkt:
Dan krijg ik deze foutmelding:
Parse error: syntax error, unexpected T_ELSE in C:\xampp\htdocs\BOM\send.php on line 40
 
Heb je alle IF- en ELSE-statements goed afgesloten?

Dus voor elke "{" is er ook een "}"?
Als het goed is kun je dit aan de hand van het inspringen van de code ook zien.

Elke keer als je een statement start is kun je het beste (lees: moet) hetgeen binnen dat statement in laten springen.
Op die manier breng je een goede structuur in je code aan.
 
Ja, ik heb alles goed afgesloten. Als ik erbij ga staan met de type-cursor worden ze rood.

PHP:
<?php
	function checkEmail($email)
	{
		return preg_match('/^[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\.-][a-z0-9]+)*)+\\.[a-z]{2,}$/i', $email);
	}

	$name = '';
	$email = '';
	$bericht = '';

	if($_SERVER['REQUEST_METHOD'] == 'POST') {
		echo $_POST['code'] . ' == ' . $_SESSION['rand_code']; {
		exit; // Stop met het uitvoeren van de rest
		
		$naam = htmlentities($_POST['naam']);
		$email = htmlentities($_POST['email']);
		$bericht = htmlentities($_POST['bericht']);

		if(!empty($_POST['naam']) && !empty($_POST['email']) && !empty($_POST['bericht']) && !empty($_POST['code'])) {
			//hier weet ik dat alles gevuld is

			if(checkEmail($email)) {
					// send email
					$to = '{e-mailadres}';
					$subject = 'Contactformulier';
					$msg = "Naam: $naam\n" .
					"E-mail:$email\n" .
					"Bericht: $bericht";
					mail($to, $subject, $msg, 'From:' . $email);
					
					$accept = "Formulier is verstuurd!.";
				
				} else {
					$error = "Foute code.";
				}
			} else {
				$error = "Ongeldig e-mailadres";
			}
		} else {
			$error = "Vul het hele formulier in.";
		}
	}
?>
 
Laatst bewerkt door een moderator:
Ik merk dat er door mijn kopieer en plakwerk een foutje in is geslopen.

Regel 12:
PHP:
echo $_POST['code'] . ' == ' . $_SESSION['rand_code']; {
Moet zijn
PHP:
echo $_POST['code'] . ' == ' . $_SESSION['rand_code'];

Heb je hier trouwens niks aan gehad?
Overigens is de oplossing eenvoudig: Kijk eens welke sessie-variabele je aanmaakt in captcha.php en welke je opvraagt bij je controle? :)
 
Kan gebeuren. Na het aanpassen, krijg ik deze foutmelding:
Parse error: syntax error, unexpected T_ELSE in C:\xampp\htdocs\BOM\send.php on line 38

PHP:
<?php
	function checkEmail($email)
	{
		return preg_match('/^[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\.-][a-z0-9]+)*)+\\.[a-z]{2,}$/i', $email);
	}

	$name = '';
	$email = '';
	$bericht = '';

	if($_SERVER['REQUEST_METHOD'] == 'POST') {
		echo $_POST['code'] . ' == ' . $_SESSION['rand_code']; 
		exit; // Stop met het uitvoeren van de rest
		
		$naam = htmlentities($_POST['naam']);
		$email = htmlentities($_POST['email']);
		$bericht = htmlentities($_POST['bericht']);

		if(!empty($_POST['naam']) && !empty($_POST['email']) && !empty($_POST['bericht']) && !empty($_POST['code'])) {
			//hier weet ik dat alles gevuld is

			if(checkEmail($email)) {
					// send email
					$to = '{e-mailadres}';
					$subject = 'Contactformulier';
					$msg = "Naam: $naam\n" .
					"E-mail:$email\n" .
					"Bericht: $bericht";
					mail($to, $subject, $msg, 'From:' . $email);
					
					$accept = "Formulier is verstuurd!.";
				
				} else {
					$error = "Foute code.";
				}
		} else {
			$error = "Ongeldig e-mailadres";
		} else {
			$error = "Vul het hele formulier in.";
		}
	}
?>

Wat is een sessie variabele?
En moet de melding "Foute code" en "Ongeldig e-mailadres" ook omgeruild worden?
 
Laatst bewerkt door een moderator:
De melding komt voort uit de twee ELSE statements op regel 36 t/m 40.
Je kunt maar 1 ELSE-statement bij een IF gebruiken.

Je wilt eerst controleren of de code geldig is, dan controleren of de velden niet leeg zijn en dan controleren of er een geldig e-mailadres is ingevoerd dus:
PHP:
<?php
function checkEmail($email)
{
	return preg_match('/^[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\.-][a-z0-9]+)*)+\\.[a-z]{2,}$/i', $email);
}

$name = '';
$email = '';
$bericht = '';

if($_SERVER['REQUEST_METHOD'] == 'POST')
{
	echo $_POST['code'] . ' == ' . $_SESSION['rand_code']; 
	exit; // Stop met het uitvoeren van de rest
	
	// Controleer of CAPTCHA code overeenkomt
	if($_POST['code'] ==  $_SESSION['rand_code'])
	{
		$naam = htmlentities($_POST['naam']);
		$email = htmlentities($_POST['email']);
		$bericht = htmlentities($_POST['bericht']);
		
		// Controleer of er lege velden tussen zitten
		if(!empty($_POST['naam']) && !empty($_POST['email']) && !empty($_POST['bericht']) && !empty($_POST['code']))
		{
			// Controleer of er een geldig e-mailadres is ingevoerd
			if(checkEmail($email))
			{
				// send email
				$to = '{e-mailadres}';
				$subject = 'Contactformulier';
				$msg = "Naam: $naam\n" .
				"E-mail:$email\n" .
				"Bericht: $bericht";
				mail($to, $subject, $msg, 'From:' . $email);
				$accept = "Formulier is verstuurd!.";
			}
			else
			{
				$error = "Ongeldig e-mailadres";
			}
		}
		else
		{
			$error = "Vul het hele formulier in.";
		}
	}
	else
	{
		$error = "Foute code.";
	}
}
else
{
	$error = 'Er is geen formulier verzonden.';
}
?>
Let wel, deze zal nog steeds niet werken. Aangezien het script niet verder gaat dan regel 13 hoop ik dat de output die je krijgt je op de juiste weg helpt.

Zo niet, dan raad ik aan eerst meer met de basis van PHP5 bezig te gaan.
Het gebruik van variabelen en het debuggen van je code zijn vaardigheden die je absoluut moet kennen.
Wat is een sessie variabele?
Een variable met prefix $_SESSION wordt bijgehouden gedurende de hele sessie van de gebruiker en kan dus op verschillende pagina's gebruikt worden. (In dit geval wordt er een aangemaakt in de captcha.php en gebruikt in send.php)

Overigens heb ik uit privacy overwegingen je e-mailadres uit alle code gehaald
 
Laatst bewerkt:
Hij echo't de captcha nu met == erachter.
Als ik de echo vervang door $error, dan laat ie weer een lege pagina zien. Als ik alleen de code geef zonder echo of $error geeft ie ook een lege pagina, maar blijft wel in contact.php
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan