PHP Contact Formulier (Één van de Twéé velden verplicht maken)

Status
Niet open voor verdere reacties.

JeffreyvEmpel

Gebruiker
Lid geworden
29 mrt 2013
Berichten
21
Hallo,

Ik heb een contact formulier.
In dit contact formulier staan o.a. de volgende twee velden, Telefoonnummer & E-mail adres.
Nu moet het volgende met deze twee velden gebeuren en ik krijg dat zelf niet voor elkaar.
Wanneer iemand (correct) het E-mail adres veld invult dan is het veld met Telefoonnummer niet verplicht en andersom vice versa.

Het script ziet er als volgt uit:

PHP:
<?php
$naar = 'hier-stond-een@mail.adres'; // Waar moet het naartoe? 
$onderwerp = 'Contactformulier hier-stond-een-bedrijf'; // Het onderwerp van het bericht

 
// Header instellen, zodat nl2br() werkt
$headers = "MIME-version: 1.0\r\n"; 
$headers .= "content-type: text/html;charset=utf-8\r\n";
 
if(isset($_POST['versturen'])) // Als het formulier verzonden is door op de verzend knop te klikken
{
	$voornaam = trim($_POST['voornaam']); // Alle overbodige spaties uit het voornaam veld verwijderen
	$telnr = trim($_POST['telnr']); // Alle overbodige spaties uit het telnr veld verwijderen
	$kenteken = trim($_POST['kenteken']); // Alle overbodige spaties uit het kenteken veld verwijderen
	$email = trim($_POST['email']); // Alle overbodige spaties uit het email veld verwijderen
	$bericht = trim($_POST['bericht']); // Alle overbodige spaties uit het bericht veld verwijderen
	$fout = false; // Om te kijken straks of er wat fout is
 	
	
	
	
	if(empty($voornaam)) // Als het voornaam veld niet is ingevuld
	{
		print '<p>U bent uw voornaam vergeten in te vullen, klik <a href = "javascript:history.back();">hier</a> om terug te gaan.</p>';
		$fout = true; // Zorgen dat het script zometeen weet dat er wat fout is
	}
	
	
	
	
	if(empty($telnr)) // Als het telnr veld niet is ingevuld
	{
		print '<p>U bent uw telefoonnummer vergeten in te vullen, klik <a href = "javascript:history.back();">hier</a> om terug te gaan.</p>';
		$fout = true; 
	}
	
	
	
	
	elseif( !preg_match('/^[0-9\-]{10,11}$/', $telnr)) // Als het telefoonnummer niet correct is ingevuld.
	{
		print '<p>U hebt uw telefoonnummer verkeerd of onvolledig ingevuld, klik <a href = "javascript:history.back();">hier</a> om terug te gaan.</p>';
		$fout = true;
	}	
	
	
	
	
	if(empty($kenteken)) // Als het kenteken veld niet is ingevuld
	{
		$fout = false;
	}
	elseif( !(preg_match('/^[0-9\-\A-Z\a-z]{6}$/', $kenteken) || preg_match('/^[0-9\-\A-Z\a-z]{8}$/', $kenteken) ) ) // Als het kenteken niet correct is ingevuld.
	{
		print '<p>U hebt uw kenteken verkeerd of onvolledig ingevuld, klik <a href = "javascript:history.back();">hier</a> om terug te gaan.</p>';
		$fout = true;
	}
	
	
	
	
	if(empty($email)) // Als het email veld niet is ingevuld
	{
		print '<p>U bent uw e-mail adres vergeten in te vullen, klik <a href = "javascript:history.back();">hier</a> om terug te gaan.</p>';
		$fout = true;
	}
	
	
	
	
	elseif(!filter_var($email, FILTER_VALIDATE_EMAIL)) // Als het email adres niet correct is
	{
		print '<p>U hebt uw e-mail adres verkeerd of onvolledig ingevuld, klik <a href = "javascript:history.back();">hier</a> om terug te gaan.</p>';
		$fout = true;
	}
	
	
	
	
	if(empty($bericht)) // Als het bericht veld niet is ingevuld
	{
		print '<p>U heeft geen bericht ingevuld, klik <a href = "javascript:history.back();">hier</a> om terug te gaan.</p>';
		$fout = true;
	}
 	
	
	
	
	if($fout == false) // Als er niks fout is (alles is dus netjes ingevuld)
	{
		$headers .= 'From: ' . $voornaam . ' ' . $telnr . ' ' . $kenteken . '<' . $email . '>'; // Een afzender instellen zodat je kan reageren.
 
		if(mail($naar, $onderwerp, nl2br($bericht), $headers))
		{
			print '<p>Uw bericht is succesvol verzonden! Klik <a href = home.htm>hier</a> om verder te gaan.</p>';
		}
		else
		{
			print '<p>Er is iets mis gegaan. Uw bericht is niet verzonden, klik <a href = "javascript:history.back();">hier</a> om terug te gaan en het opnieuw te proberen.</p>';
		}
	}
}
?>

Is dit mogelijk? Ik ben benieuwd! Alvast bedankt!
 
Laatst bewerkt:
Voeg bovenaan een variable toe:
Code:
$goed = 0;
Bij het goed invullen van een telefoon nummer:
Code:
$goed++;
Hetzelfde bij het goed invullen van een e-mail adres.

Nu kun je ergens checken:
Code:
if ($goed>0)
{
    //Verstuur?
}

Heel simpel eigenlijk. Als de naam en email niet goed ingevuld zijn blijft $goed op 0 staan.
 
Laatst bewerkt:
Oké, klinkt logisch..

Echter ben ik niet super bekend met PHP. Dit script heb ik aardig een eigen draai aan kunnen geven maar is oorspronkelijk niet door mij gemaakt.
Kun je jou oplossing misschien verwerken in het script dat ik in mijn eerste bericht heb geplaatst?

Bedankt in ieder geval!
 
Wanneer iemand (correct) het E-mail adres veld invult dan is het veld met Telefoonnummer niet verplicht en andersom vice versa.

Met andere woorden; één van de twee *moet* ingevuld worden; dus het is alleen fout als ze allebei niet ingevuld zijn:
if (empty($email) and empty($telnr)) then $fout=true;

Wat Tim voorstelt kan opzich ook, maar dan krijg je drie IF's waar er maar één nodig is.

Dit soort formulieren wordt vaak een stuk overzichtelijker als je het printen van het formulier en het verwerken ervan in hetzelfde script doet. Dan kun je namelijk de ingevulde waarde direct weer in het formulier printen, want zeer gebruiktsvriendelijk is, en als er een fout is dan kun je die direct naast het veld printen. Dat scheelt voor de gebruiker een hoop heen-en-weer geklik. Je weet al hoe je kunt herkennen dat er gesubmit is dus je weet al wanneer je wel en niet moet controleren op ingevulde data, het is niet eens zo'n ingewikkeld ding om te proberen.
 
Hallo PgVincent,

Klopt inderdaad wat je zegt en inderdaad het zou makkelijker zijn als alles in één script zou staan. Echter voldoet het script zoals het nu werkt aan mijn eisen en ben ik altijd een beetje bang om dan weer met een ander script opnieuw te beginnen. Maar suggesties daarin zijn altijd welkom..

Alleen hoe pas ik de regel die je hierboven hebt staan toe in mijn script? Wanneer ik deze ertussen ga zetten controleert het script nog steeds of één van de velden leeg blijft. Haal ik die regels weg en laat ik hem alleen op de regel controleren die jij hierboven hebt neergezet gaat hij op elke mogelijk manier fout op die regel.
 
Wanneer ik deze ertussen ga zetten controleert het script nog steeds of één van de velden leeg blijft

De losse controles van email en telnr worden vervangen door één nieuwe die email en telnr tegelijk controleert.

PHP:
if (!preg_match('/^[0-9\-]{10,11}$/', $telnr) and  !filter_var($email, FILTER_VALIDATE_EMAIL))
    {
        print '<p>U moet een email-adres of een telefoonnummer invullen.';
        $fout = true;

        // Plaats hier eventuele vervolgregels om aan te geven welke van de twee velden de fout bevat
        // Dat kan pas hier omdat je hier pas weet dat er niet aan de "minimaal een van de twee" regel wordt voldaan.
    }
 
Laatst bewerkt door een moderator:
Zojuist het script aangepast maar het lijkt niet te werken, wanneer nu beide velden leeg blijven kan ik het formulier gewoon verzenden, de melding komt er wel te staan maar daaronder direct dat het bericht verzonden is.

PHP:
<?php
$naar = 'hier-stond-een@mail.adres'; // Waar moet het naartoe? 
$onderwerp = 'Contactformulier hier-stond-een-bedrijf'; // Het onderwerp van het bericht

 
// Header instellen, zodat nl2br() werkt
$headers = "MIME-version: 1.0\r\n"; 
$headers .= "content-type: text/html;charset=utf-8\r\n";
 
if(isset($_POST['versturen'])) // Als het formulier verzonden is door op de verzend knop te klikken
{
	$voornaam = trim($_POST['voornaam']); // Alle overbodige spaties uit het voornaam veld verwijderen
	$telnr = trim($_POST['telnr']); // Alle overbodige spaties uit het telnr veld verwijderen
	$kenteken = trim($_POST['kenteken']); // Alle overbodige spaties uit het kenteken veld verwijderen
	$email = trim($_POST['email']); // Alle overbodige spaties uit het email veld verwijderen
	$bericht = trim($_POST['bericht']); // Alle overbodige spaties uit het bericht veld verwijderen
	$fout = false; // Om te kijken straks of er wat fout is
 	
	
	
	
	if(empty($voornaam)) // Als het voornaam veld niet is ingevuld
	{
		print '<p>U bent uw voornaam vergeten in te vullen, klik <a href = "javascript:history.back();">hier</a> om terug te gaan.</p>';
		$fout = true; // Zorgen dat het script zometeen weet dat er wat fout is
	}
	
	
	
	if (!preg_match('/^[0-9\-]{10,11}$/', $telnr) and !filter_var($email, FILTER_VALIDATE_EMAIL))
	{
	print '<p>U bent uw e-Mail adres en/of Telefoonnummer vergeten in te vullen, klik <a href = "javascript:history.back();">hier</a> om terug te gaan.</p>';
	$fout = true;
	
	// Plaats hier eventuele vervolgregels om aan te geven welke van de twee velden de fout bevat
	// Dat kan pas hier omdat je hier pas weet dat er niet aan de "minimaal een van de twee" regel wordt voldaan.
	} 
	
	
	
	
	if(empty($kenteken)) // Als het kenteken veld niet is ingevuld
	{
		$fout = false;
	}
	elseif( !(preg_match('/^[0-9\-\A-Z\a-z]{6}$/', $kenteken) || preg_match('/^[0-9\-\A-Z\a-z]{8}$/', $kenteken) ) ) // Als het kenteken niet correct is ingevuld.
	{
		print '<p>U hebt uw kenteken verkeerd of onvolledig ingevuld, klik <a href = "javascript:history.back();">hier</a> om terug te gaan.</p>';
		$fout = true;
	}
	
	
	
	
	if(empty($bericht)) // Als het bericht veld niet is ingevuld
	{
		print '<p>U heeft geen bericht ingevuld, klik <a href = "javascript:history.back();">hier</a> om terug te gaan.</p>';
		$fout = true;
	}
 	
	
	
	
	if($fout == false) // Als er niks fout is (alles is dus netjes ingevuld)
	{
		$headers .= 'From: ' . $voornaam . ' ' . $telnr . ' ' . $kenteken . '<' . $email . '>'; // Een afzender instellen zodat je kan reageren.
 
		if(mail($naar, $onderwerp, nl2br($bericht), $headers))
		{
			print '<p>Uw bericht is succesvol verzonden! Klik <a href = home.htm>hier</a> om verder te gaan.</p>';
		}
		else
		{
			print '<p>Er is iets mis gegaan. Uw bericht is niet verzonden, klik <a href = "javascript:history.back();">hier</a> om terug te gaan en het opnieuw te proberen.</p>';
		}
	}
}
?>
 
Laatst bewerkt door een moderator:
Dan is doen die preg_match en filter_var niet wat ze moeten doen, een lege string is geen geldig tenr en geen geldig email adres...
 
Het idee van TimVN is een mooi begin, ik zou zelf eerder een array gebruiken en alleen controleren op fouten.

Scheelt ten eerste extra variabelen voor je meldingen en je kunt daarna direct de lijst opvragen ;)

PHP:
$errors = array();

if('' === $_POST['name']) {
    // Voeg een nieuwe element aan de array toe
    $errors[] = 'Een naam is verplicht';
}

if( count($errors) > 0) {
    // Er zijn fouten, dus tonen
    foreach($errors AS $error) {
        echo $error .'<br />';
    }
} else {
    // Geen fouten, verdere afhandeling
}
 
Dat kan, maar gezien er toch al niets met de errors wordt gedaan buiten printen, is het een beetje overbodig.
 
In ieder geval allemaal bedankt voor de reacties, ik ben in ieder geval weer een stuk wijzer geworden.
Echter heb ik in mijn script nog steeds niet wat ik wil, is er iemand die zijn idee kan verwerken in het script dat ik bovenaan heb gepost??

Ik ben maar een "beginner" in php en wat ik ook probeer, ik krijg het niet werkend zoals ik wil..

Alvast bedankt!
 
Zoiets denk ik.

Ik heb bovenaan een array gemaakt die doet alsof het een gesubmit formulier is, zodat je email en telnr kunt invullen zonder te klieren met het echte formulier.

PHP:
<?php

// Spoof de $_POST array om snel te kunnen testen.
$_POST = array('versturen' => 1,
               'email'     => '',
               'telnr'     => '',
               'voornaam'  => 'Kees',
               'bericht'   => "ik ben blij.",
               'kenteken'  => '69-XXX-0');

$naar = 'hier-stond-een@mail.adres'; // Waar moet het naartoe?
$onderwerp = 'Contactformulier hier-stond-een-bedrijf'; // Het onderwerp van het bericht


// Header instellen, zodat nl2br() werkt
$headers = "MIME-version: 1.0\r\n";
$headers .= "content-type: text/html;charset=utf-8\r\n";

if (isset($_POST['versturen'])) // Als het formulier verzonden is door op de verzend knop te klikken
{
    $voornaam = trim($_POST['voornaam']); // Alle overbodige spaties uit het voornaam veld verwijderen
    $telnr    = trim($_POST['telnr']); // Alle overbodige spaties uit het telnr veld verwijderen
    $kenteken = trim($_POST['kenteken']); // Alle overbodige spaties uit het kenteken veld verwijderen
    $email    = trim($_POST['email']); // Alle overbodige spaties uit het email veld verwijderen
    $bericht  = trim($_POST['bericht']); // Alle overbodige spaties uit het bericht veld verwijderen

    $arrFouten = array(); // Sla alle foutmeldingen hierin op, zodat ze verderop geprint kunnen worden.

    if (empty($email) and empty($telnr)) {
        $arrFouten[] = 'U moet een email adres of een telefoonnummer invullen';
    }
    else {
        // Als het email adres niet leeg is moet het geldig zijn ingevuld.
        if (!empty($email) and !filter_var($email, FILTER_VALIDATE_EMAIL)) // Als het email adres niet correct is
        {
            $arrFouten[] = 'U hebt uw e-mail adres verkeerd of onvolledig ingevuld';
        }

        // Als het telnr niet leeg is moet het geldig zijn ingevuld.
        if (!empty($telnr) and !preg_match('/^[0-9\-]{10,11}$/', $telnr)) // Als het telefoonnummer niet correct is ingevuld.
        {
            $arrFouten[] = 'U hebt uw telefoonnummer verkeerd of onvolledig ingevuld.';
        }
    }

    if (empty($voornaam)) // Als het voornaam veld niet is ingevuld
    {
        $arrFouten[] = 'U bent uw voornaam vergeten in te vullen';
    }


    if (empty($kenteken)) // Als het kenteken veld niet is ingevuld
    {
        $arrFouten[] = 'U hebt geen kenteken ingevuld';
    }
    elseif (!(preg_match('/^[0-9\-\A-Z\a-z]{6}$/', $kenteken) || preg_match('/^[0-9\-\A-Z\a-z]{8}$/', $kenteken))) // Als het kenteken niet correct is ingevuld.
    {
        $arrFouten[] = 'U hebt uw kenteken verkeerd of onvolledig ingevuld';
    }


    if (empty($bericht)) // Als het bericht veld niet is ingevuld
    {
        $arrFouten[] = 'U heeft geen bericht ingevuld';
        $fout        = true;
    }


    if (count($arrFouten) <> 0) {
        // Er zijn fouten, print ze en geef de backlink.
        echo implode('<br/>', $arrFouten);
        echo '<p> klik <a href = "javascript:history.back();">hier</a> om terug te gaan.</p>';
    }
    else // Als er niks fout is (alles is dus netjes ingevuld)
    {
        $headers .= 'From: ' . $voornaam . ' ' . $telnr . ' ' . $kenteken . '<' . $email . '>'; // Een afzender instellen zodat je kan reageren.

        // Verstuur de mail niet echt, want dit is een test.
//        if (mail($naar, $onderwerp, nl2br($bericht), $headers)) {
        if (true) {
            print '<p>Uw bericht is succesvol verzonden! Klik <a href = home.htm>hier</a> om verder te gaan.</p>';
        }
        else {
            print '<p>Er is iets mis gegaan. Uw bericht is niet verzonden, klik <a href = "javascript:history.back();">hier</a> om terug te gaan en het opnieuw te proberen.</p>';
        }
    }
}
?>
 
Zojuist geprobeerd, hij blijft bij wat ik ook invul altijd de melding "U moet een email adres of een telefoonnummer invullen" geven. Ook als ik alles wel correct invul. Het zou dus ergens in dit stukje script niet goed gaan:

PHP:
    if (empty($email) and empty($telnr)) {
        $arrFouten[] = 'U moet een email adres of een telefoonnummer invullen';
    }
 
Kloppen de velden vanuit het formulier? Is er een veld met name="telnr" en name="email"?
 
PHP:
<td><form method="post" action="formulierverzenden.php">
					Naam*:<br>
		<input type="text" name="voornaam" size="40" /> <br>
					E-mail adres*:<br>
		<input type="text" name="email" size="40" /> <br>
					Telefoonnummer*:<br>
		<input type="text" name="telnr" size="40" /> <br>
					Kenteken:<br>
		<input type="text" name="kenteken" size="40" /> <br>
					Uw bericht*:<br>
		<textarea cols="50" rows="12" name="bericht"></textarea><br>
		<input type="reset" value="Wis" /> <input type="submit" name="versturen" value="Verzenden" />
 
Je hebt regel 3 tot en met 9 uit PgVincent z'n code ook wel verwijderd?
 
Daar heb ik niets aan veranderd, wat moet daar komen te staan dan? Gewoon niets?

PHP:
// Spoof de $_POST array om snel te kunnen testen.
$_POST = array('versturen' => 1,
               'email'     => '',
               'telnr'     => '',
               'voornaam'  => '',
               'bericht'   => "",
               'kenteken'  => '');

Zo???
 
De regels verwijderen, anders worden de waardes uit het formulier namelijk altijd overschreven ;)
 
Ik snap er nu niets meer van, iemand maakt een script waarin ik weer regels moet verwijderen!?! Kan iemand gewoon eens het script wat ik bovenaan heb gepost aanpassen zodat mijn wens werkelijk wordt en die ik dmv kopiëren en plakken kan gebruiken..?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan