PHP Contact Fomulier - Header Location werkt niet

Status
Niet open voor verdere reacties.

Chazz09

Gebruiker
Lid geworden
17 mei 2013
Berichten
5
Hallo,

Ik ben bezig met het bouwen van een php formulier met validatie het versturen van een email en het redirecten naar een bedankpagina.
Alles behalve het redirecten naar een bedanktpagina werkt

Het probleem zit in dit gedeelte van de code:
PHP:
header('Location: http://roadhouse.nl/bedankt.html');

Na het submitten van het formulier krijg ik de volgende error: Warning: Cannot modify header information - headers already sent by...
De regel waarin de header al zou zijn verstuurd is mijn openende <?php tag.

Zie hieronder de volledige code van het formulier:
PHP:
<?php
if ($_POST['_submit_check']) {
// If validate_form() returns errors, pass them to show_form()
if ($form_errors = validate_form()) {show_form($form_errors);} 
else { process_form(); }
} else { show_form(); }
// Do something when the form is submitted
function process_form() {
header('Location: /bedankt.html');
/* Set e-mail recipient */
$myemail = "mijnemail@email.com";
$naam = $_POST['naam'];
$emailadres = $_POST['emailadres'];
$telefoonnummer = $_POST['telefoonnummer'];
$opmerking = $_POST['opmerking'];
/* Let's prepare the message for the e-mail */
$message = "
Het contact formulier is ingevuld door:
Naam: $naam
Emailadres: $emailadres
Telefoonnummer: $telefoonnummer
Opmerking: $opmerking
";
$subject = "Verzoek tot contact";
$headers = "From: $emailadres";
/* Send the message using mail() function */
mail($myemail, $subject, $message, $headers);
}
 // Display the form
function show_form($errors = '') {
    // If some errors were passed in, print them out
    if ($errors) {
        echo 'Please correct these errors: <ul><li>';
        echo implode('</li><li>', $errors);
        echo '</li></ul>';
    }
	echo "<form class=\"contactform\" name=\"contactform\" method=\"post\" action=\"\">";
	echo "<input id=\"contact_name\" type=\"text\" name=\"naam\" placeholder=\"Naam\" value=\"".  $_POST['naam'] . "\">";
	echo "<input id=\"contact_email\" type=\"text\" name=\"emailadres\" placeholder=\"Emailadres\" value=\"". $_POST['emailadres'] . "\">";
	echo "<input id=\"contact_phone\" type=\"text\" name=\"telefoonnummer\" placeholder=\"Telefoonnummer\" value=\"". $_POST['telefoonnummer'] . "\">";
	echo "<textarea id=\"contact_enquiry\" name=\"opmerking\" placeholder=\"Uw vraag of opmerking\">". $_POST['opmerking'] . "</textarea>";
	echo "<input class=\"formbutton\" type=\"submit\" name=\"submit\" value=\"Verzenden\">";
	echo "<input type=\"hidden\" name=\"_submit_check\" value=\"1\">";
	echo "</form>";
}
// Check the form data
function validate_form() {
    // Start with an empty array of error messages
    $errors = array();
    // Add an error message if the name is too short
 $_POST['naam'] = trim($_POST['naam']);
    if (empty($_POST['naam'])) {
        $errors[] = 'Naam'; }
 	if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/", $_POST['emailadres'])) { 
		$errors[]='Geldig emailadres'; }
 	if (empty($_POST['telefoonnummer'])) { 
		$errors[]='Telefoonnummer'; }
	if (empty($_POST['opmerking'])) { 
		$errors[]='Opmerking'; }
    // Return the (possibly empty) array of error messages
    return $errors;
}
?>

Ik ben nu al lange tijd aan het zoeken naar een oplossing maar krijg het script maar niet werkend....
Wie o wie kan mij helpen met dit zeer frustrerende probleem?
 
Headers moeten altijd aan het begin van een script staan
anders werken ze niet.
(misschien is het correcter om te zeggen: anders heb je een grote kans dat ze niet werken)

Hier lees je meer
 
Bedankt voor je antwoord tecsman, dit klinkt als inderdaad als een logische oplossing na alles wat ik over dit probleem gelezen heb. Ben zelf nieuw met PHP.
Ben tot nu toe bezig geweest met het proberen te fixen door gebruik te maken van ob_* functions, zonder succes.

Zou je een suggestie kunnen geven hoe ik de code kan aanpassen door de header('Location: /bedankt.html'); bovenin het script te plaatsen?
 
Ik heb geen enkele practische ervaring met PHP, wel eens een boek gelezen. En dit kon ik me toevallig herinneren.
 
Ten eerste, wat is er mis met een expliciete redirect?

Ik snap sowieso niet wat je wil bereiken, want ook al zou dit werken wordt de rest van je code niet meer uitgevoerd na de redirect. Je browser gaat meteen naar bedankt.html en de rest van je script wordt gescrapped.
 
Wampier, wat bedoel je met een expliciete redirect?
Het enige wat ik voor elkaar probeer te krijgen is dat bezoekers na het succesvol invullen van het formulier worden doorgestuurd naar de pagina /bedankt.html. Dat hoeft zeker niet perse met de huidige header('Location:..) redirect.
 
Je hebt 2 keuzes: doorsturen via javascript of de rest van de code uitvoeren op "bedankt.html"

of de code eerst uitvoeren op je "submit.php" en vervolgens met de header functie zoals je nu hebt doorsturen. Wat niet gaat is redirecten met header en vervolgens de code uitvoeren.
 
Het probleem van output is already sent is dat er geen enkele output mag komen voordat je een header verstuurd. Een tip voor je in de toekomst wanneer je met sessies gaat werken: zet session_start() altijd als eerste in je code.
 
Inderdaad wat GuyT al zegt: Geen enkele output. Dit betekent dus dat je die header('location: ') kunt gebruiken zolang er nog niets naar het scherm is gestuurd. Dus geen echo, printf etc..

Code:
// dit werkt
if ( $formIsValid ){
        header('location: bedankt.html');
}

// dit werkt niet ivm de echo naar het scherm
if( $formIsValid ){
       echo "Formulier is geldig";
       header('location: bedankt.html');
}
 
Inderdaad wat GuyT al zegt: Geen enkele output. Dit betekent dus dat je die header('location: ') kunt gebruiken zolang er nog niets naar het scherm is gestuurd. Dus geen echo, printf etc..

Waar veel beginners ook mee te kampen hebben is een enkele spatie/witruimte aan het begin van een file. Dit kan ook voor zo'n soort fouten zorgen.
 
Laatst bewerkt door een moderator:
Opgelost met een javascript redirect:

echo '<script type="text/javascript">' . "\n";
echo 'window.location="/bedankt.html";';
echo '</script>';

ipv header('Location: /bedankt.html');
 
Beste Chazz09 dit is een oplossing, maar geen goede. Zeker niet als je PHP wil leren. Je moet uitzoeken waar je fout zit en dit corrigeren in plaats van alternatieven te gebruiken. Wanneer een gebruiker Javascript uit heeft staan wordt hij ook niet geredirect.
 
Mee eens GuyT, het is me nog niet gelukt om dit zo te fixen. Het werkt voor nu, zal deze post updaten zodra het is opgelost met PHP
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan