Beste,

Bij het correct invullen van het contactformulier zou ik de klant willen doorsturen naar een bedankingspagina. (zo kan ik ook een doel instellen via Google Analytics).
Dit lukt me voorlopig niet. Contactformulier waarmee ik werk stuurt nu een echo berichtje bij het al dan niet correct invullen. Het doorsturen naar een bedankingspagina lukt me niet, heb al geprobeerd met header('Location: http://www.mijnsite.be/bedankt.html';); zonder succes.

contact.php:

<?php 
	if($_POST) {

		$to = "[email protected]"; // Your email here
		$subject = 'Bericht verstuurd van mijn site'; // Subject message here

	}

    //Send mail function
	function send_mail($to,$subject,$message,$headers){
		if(@mail($to,$subject,$message,$headers)){
			header('Location: http://www.mijnsite.be/bedankt.html');
			exit();
		} else {
			echo json_encode(array('info' => 'error', 'msg' => "Uw bericht is niet verzonden. Er is iets verkeerd gegaan. Probeer het nog eens."));
		}
	}	

	//Check e-mail validation
	function check_email($email){
		if(!preg_match("/^[_.\da-z-]+@[a-z\d][a-z\d-]+\.+[a-z]{2,6}$/i", $email)) {
			return false;
		} else {
			return true;
		}
	}

	//Get post data
	if(isset($_POST['name']) and isset($_POST['mail']) and isset($_POST['onderwerp']) and isset($_POST['comment'])){
		$name 	 = $_POST['name'];
		$mail 	 = $_POST['mail'];
		$onderwerp 	 = $_POST['onderwerp'];
		$website  = $_POST['website'];
		$comment = $_POST['comment'];

		if($name == '') {
			echo json_encode(array('info' => 'error', 'msg' => "Gelieve uw naam in te vullen."));
			exit();
		} else if($mail == '' or check_email($mail) == false){
			echo json_encode(array('info' => 'error', 'msg' => "Gelieve een geldig emailadres in te vullen."));
			exit();
		} else if($onderwerp == ''){
			echo json_encode(array('info' => 'error', 'msg' => "Gelieve uw onderwerp in te vullen."));
			exit();
		} else if($comment == ''){
			echo json_encode(array('info' => 'error', 'msg' => "Gelieve uw bericht in te vullen."));
			exit();
		} else {

			//Send Mail
			$headers = 'From: ' . $mail .''. "\r\n".
			'Reply-To: '.$mail.'' . "\r\n" .
			'X-Mailer: PHP/' . phpversion();

			send_mail($to, $subject, $comment . "\r\n\n"  .'Naam: '.$name. "\r\n" .'Onderwerp: '.$onderwerp. "\r\n" .'Email: '.$mail, $headers);
		}

	} else {
		echo json_encode(array('info' => 'error', 'msg' => "Gelieve alle velden in te vullen."));
	}   

 ?>



Html code contactform:

               <form id="contact-form" method="post" action="contact.php">
                <div class="row contact-row">
                  <div class="col-md-6 contact-name">
                    <input name="name" id="name" type="text" placeholder="Uw naam*" required>
                  </div>
                  <div class="col-md-6 contact-email">
                    <input name="mail" id="mail" type="email" placeholder="Uw emailadres*" required>
                  </div>
                </div>
                <input name="onderwerp" id="onderwerp" type="text" placeholder="Onderwerp*" required> 
                <textarea name="comment" id="comment" placeholder="Uw bericht*" required></textarea>
                  <input type="submit" class="btn btn-lg btn-color btn-submit" value="Verstuur uw vraag" id="submit-message">
                  <div id="msg" class="message"></div>
                </form>


Bedankt alvast voor de hulp!
Met die location-header is niks mis. De vraag is eigenlijk wat er niet aan werkt?
Zet de errors eens aan als die nog niet aan staan, en voet het eens uit?

Het enige wat er fout kan zijn is dat er HTML of witruimte voor je PHP-code zou staan. Maar zonder foutmeldingen is het nu nog gissen.
<?php
if(isset($_POST['name']) and isset($_POST['mail']) and isset($_POST['onderwerp']) and isset($_POST['comment'])){
?>
kan korter:
<?php
if(isset($_POST['name'],$_POST['mail'],$_POST['onderwerp'],$_POST['comment'])){
?>
$_POST['website'] => ik zie geen name="website" in het formulier.

Mailheaders zijn niet correct => http://wiki.phpbeginners.nl/index.php?title=De_juiste_mailheaders
Hoe zet ik die errors aan? Ik vind via phpinfo.php de versie 7.0.13 en waar het ini bestand staat, usr/local/php70/lib/php.ini, maar waar kan ik dit precies terug vinden? Moet ik hiervoor naar controlpanel / hosting kijken? Ini bestand zit niet in mijn mapje waar mijn website staat. Ik heb ook de display errors in mijn php bestand ingevuld, maar geen reactie te zien.

Ik heb de code aangepast en opgefrist, maar nog altijd geen actie bij het invullen van het mailform, zelfs de foutmeldingen bij het niet volledig invullen krijg ik niet te zien...

<?php
ini_set('display_errors', 'On');
ini_set('display_startup_errors', 'On');
error_reporting(E_ALL);
if($_POST) {
$to = "[email protected]"; // Your email here
$subject = 'Bericht verstuurd van mijn site'; // Subject message here
}
//Send mail function
function send_mail($to,$subject,$message,$headers){
if(@mail($to,$subject,$message,$headers)){
header('Location: http://www.mijnsite.be/bedankt.html';);
exit();
} else {
echo json_encode(array('info' => 'error', 'msg' => "Uw bericht is niet verzonden. Er is iets verkeerd gegaan. Probeer het nog eens."));
}
}
//Check e-mail validation
function check_email($email){
if(!preg_match("/^[_.\da-z-]+@[a-z\d][a-z\d-]+\.+[a-z]{2,6}$/i", $email)) {
return false;
} else {
return true;
}
}
//Get post data
if(isset($_POST['name'],$_POST['mail'],$_POST['onderwerp'],$_POST['comment'])){
$name = $_POST['name'];
$mail = $_POST['mail'];
$onderwerp = $_POST['onderwerp'];
$comment = $_POST['comment'];

if($name == '') {
echo json_encode(array('info' => 'error', 'msg' => "Gelieve uw naam in te vullen."));
exit();
} else if($mail == '' or check_email($mail) == false){
echo json_encode(array('info' => 'error', 'msg' => "Gelieve een geldig emailadres in te vullen."));
exit();
} else if($onderwerp == ''){
echo json_encode(array('info' => 'error', 'msg' => "Gelieve uw onderwerp in te vullen."));
exit();
} else if($comment == ''){
echo json_encode(array('info' => 'error', 'msg' => "Gelieve uw bericht in te vullen."));
exit();
} else {
//Send Mail
$headers = 'From: <' . $mail . '>' . "\r\n";
'Reply-To: ' . $name . ' <' .$mail. '>' . "\r\n";
'X-Mailer: PHP/' . phpversion() . "\r\n";

send_mail($to, $subject, $comment . "\r\n\n" .'Naam: '.$name. "\r\n" .'Onderwerp: '.$onderwerp. "\r\n" .'Email: '.$mail, $headers);
}
} else {
echo json_encode(array('info' => 'error', 'msg' => "Gelieve alle velden in te vullen."));
}
?>
Frederic D op 13/01/2017 09:21:45

Hoe zet ik die errors aan?

Met jouw ini_set's kan je dit voor jouw script aanzetten.

Ik vind via phpinfo.php de versie 7.0.13 en waar het ini bestand staat, usr/local/php70/lib/php.ini, maar waar kan ik dit precies terug vinden? Moet ik hiervoor naar controlpanel / hosting kijken? Ini bestand zit niet in mijn mapje waar mijn website staat.

Die genoemde locatie is alleen bereikbaar als je beheerder over de server bent, daar staan de globale instellingen van PHP over de hele server voor PHP 7 ingesteld. Als je shared-hosting hebt of geen beheerdersrechten hebt, dan kan je met .htaccess ook je error-reporting aan en uit zetten. Soms moet dit met aparte ini-bestanden, maar dat wordt dan wel duidelijk gemaakt in phpinfo() waarin staat in welke directories van jouw onder de 'additional directories' voor ini-files. In het eerste grote blokje staat dat daar vermeld.

Ik heb ook de display errors in mijn php bestand ingevuld, maar geen reactie te zien.

Roep het bestand wat alles verwerkt eens handmatig aan. Wat gebeurt er dan?
De vraag is eigenlijk of er echt wel een fout in de PHP-code zit die het uitvoeren verhindert. Als de opbouw okee is en er zit een fout in de structuur omdat er een variabele vergeten is, waarbij hij op een 'false' uitkomt, dan is dat iets wat je niet kan aanrekenen tot een fout die PHP zelf zal aangeven.
waarom echo't dit script zoveel json? Wordt het soms via Ajax aangeroepen?

Als ik het php bestand handmatig in de browser oproep, zie ik het volgende:
{"info":"error","msg":"Gelieve alle velden in te vullen."}
if(!preg_match("/^[_.\da-z-]+@[a-z\d][a-z\d-]+\.+[a-z]{2,6}$/i", $email))

PHP heeft zelf functies (filter_var, filter_input) om te controleren of het een emailadres lijkt.

Deze regel accepteert bijvoorbeeld [email protected]
Wat me geevn valide adres lijkt

Terwijl [email protected] niet geaccepteerd wordt, noch [email protected]
om maar te zwijgen over [email protected] of andere "nieuwe" domein-extensies

[size=xsmall]Toevoeging op 13/01/2017 11:38:42:[/size]

{"info":"error","msg":"Gelieve alle velden in te vullen."}

dan post je dus kennelijk niet alle velden?

Als ajax: je wilt niet de aanroeper van het huidige script (een javascript ajax proces) door verwijzen naar bedankt.html, maar de pagina waarin je de ajax call doet.
Ik heb eens alle files in js map doorlopen en vond dit terug. Wordt dus via Ajax aangeroepen. Wat dien ik te wijzigen zodat de foutmeldingen wel tevoorschijn komen na het invullen van het contactformulier, en bij correct invullen men doorverwezen wordt naar bedankingspagina. Het is ook zo dat er meerdere contactforms zijn op de site, en meerdere bedankingspagina's.


var submitContact = $('#submit-message'),
        message = $('#msg');

    submitContact.on('click', function(e){
        e.preventDefault();

        var $this = $(this);
        
        $.ajax({
            type: "POST",
            url: 'contact.php',
            dataType: 'json',
            cache: false,
            data: $('#contact-form').serialize(),
            success: function(data) {

                if(data.info !== 'error'){
                    $this.parents('form').find('input[type=text],input[type=email],textarea,select').filter(':visible').val('');
                    message.hide().removeClass('success').removeClass('error').addClass('success').html(data.msg).fadeIn('slow').delay(5000).fadeOut('slow');
                } else {
                    message.hide().removeClass('success').removeClass('error').addClass('error').html(data.msg).fadeIn('slow').delay(5000).fadeOut('slow');
                }
            }
        });
    });

})(jQuery);

Ik zou voor de proef eens dit tijdelijk neerzetten onderaan die foutmelding in je PHP-file:

<?php
echo "<pre>".print_r($_POST,1)."</pre>"; 
?>

Dan zie je meteen wat er allemaal verstuurd wordt.

Ik zou het dan eerst zonder je jQuery proberen, zodat direct ziet wat je formulier verstuurt.
gebruik Firebug om te zien wat er verstuurd wordt dor de ajaxcall en wat de response was.

De redirect zou ik plaatsen in het jquery script op de regel na 19


window.location('bedankt.html');

Reageren