Fehler "Headers already sent"

Der php parser geht den Code von oben nach unten durch, d.h. er geht immer in deine if Abfrage am Anfang rein, weil ja $fehler_nachricht immer false ist. Dadurch wird immer wieder, praktisch unendlich weitergeleitet.
 
Gut, ich habe nun das ob_start() wieder rausgenommen.
und die action="" leer gesetzt.
Trotzdem wird kein Mail versendet, wenn ich alle Felder ausfuelle. Lasse ich zB E-Mail frei, dann wird es verschickt. Eigentlich habe ich es ja genau umgekehrt geschrieben, dass kein Feld frei bleiben darf.

ad hoctar:
gehst du von der Version, die ich am Anfang gepostet habe aus oder von der editierten, die von KD3 gepostet wurde?
Wenn du von meiner Ursprungsversion ausgehst wuerde das heissen, dass ich da eine Abfrage habe, die immer erfuellt wird und deswegen wird alles auch ohne Ausfuellen gleich auf die Seite weitergeleitet?
 
Ja, genau
Am besten ist es, wenn der Logik-teil eines Scriptes immer am Anfang geschieht.

Probiers mal mit
PHP:
<?php

// include die Formularvalidierungsdatei

include ("form_validation.php");


if ($_POST['gesendet']){

    $vorname = $_POST['vorname'];

    $nachname = $_POST['nachname'];

    $email = $_POST['email'];

    $nachricht = $_POST['nachricht'];



// Ausgabe nur fuer Test beim Schreiben des Formulars

// echo $vorname;

// echo $nachname;

// echo $email;

// echo $nachricht;



// Schaltet Magic Quotes aus, wenn ein ist (Backslash)

if ( get_magic_quotes_gpc() ) {

    //Print "Magic Quotes sind an";

    $vorname = stripslashes($vorname);

    $nachname = stripslashes($nachname);

    $email = stripslashes($email);

    $nachricht = stripslashes($nachricht);

}



// Pruefung auf leere Felder

// $fehler_nachricht=0;

// if ($vorname=="") {

//     $fehler_nachricht="Bitte geben Sie Ihren Vornamen ein";

// }



// Fehlermeldung nur ausgeben, wenn Feld leer ist

// if ($fehler_nachricht) {

//     echo ($fehler_nachricht);

// }





//  bei mehreren Fehlern: Fehlermeldungen in einem Array sammeln


// Deklaration hier nicht notwendig, da [] bereits aus $fehler_nachricht ein array macht
//$fehler_nachricht=array();

    // wird ersetzt mit Prüfung auf falsches Zeichen

    // if ($vorname=="") {

    // $fehler_nachricht[] ="Bitte geben Sie Ihren Vornamen ein";

    // }

    $gueltig = verifiziereAlphaNum ($vorname);

    if (!$gueltig) {

        $fehler_nachricht[]="Der Vorname darf nur aus Buchstaben, Zahlen, Leerzeichen, Bindestrichen und # bestehen.";

    }



    // wird ersetzt mit Prüfung auf falsche Zeichen

    // if ($nachname=="") {

    // $fehler_nachricht[] ="Bitte geben Sie Ihren Nachnamen ein";

    // }

    $gueltig = verifiziereAlphaNum ($nachname);

    if (!$gueltig) {

        $fehler_nachricht[]="Der Nachname darf nur aus Buchstaben, Zahlen, Leerzeichen, Bindestrichen und ' bestehen.";

    }



    // wird ersetzt mit Pruefung auf falsches Zeichen

    // if ($email=="") {

    //$fehler_nachricht[] ="Bitte geben Sie Ihre E-Mail-Adresse ein";

    //}

    // wird ersetzt mit Prüfung auf mehrere falsche Zeichen

    // if (!strpo($email, "@")) {

    //     $fehler_nachricht[] ="Bitte geben Sie eine gültige E-Mail-Adresse ein";

    // }

    $gueltig = verifiziereEmail ($email);

    if (!$gueltig) {

        $fehler_nachricht[]="Die E-Mail muss ein gültiges Format besitzen z.B. mustermann@gmx.at.";

    }



    // wird ersetzt mit Prüfung auf falsche Zeichen

    // if ($nachricht=="") {

    // $fehler_nachricht[] ="Sie haben keine Nachricht hinterlassen";

    // }

    $gueltig = verifiziereText ($nachricht);

    if (!$gueltig) {

        $fehler_nachricht[]="Die Nachricht darf nur Buchstaben, Zahlen und folgende Zeichen: \" ' - ? ! enthalten";

    }



// gibt Fehlermeldung aus, nur zum testen

// foreach ($fehler_nachricht as $fehler) {

//    echo ("$fehler <br>");

//    }







$ziel_email="necronomicon@gmx.at";

$email_betreff="Mein Kontaktformular von der HP";

$email_hauptteil="$vorname\n$nachname\n$nachricht\n$email";

// nur zum Testen, dann weg

//echo $email_hauptteil;

  // nun unten bei weiterleitung: mail ($ziel_email, $email_betreff, $email_hauptteil);

// nur zum testen nun auf neue Seite leiten

// print "E-mail versendet";







}


if (!$fehler_nachricht) { // wenn keine Fehler

    mail ($ziel_email, $email_betreff, $email_hauptteil); // Email verschicken

    header ('Location: form_confirm.php'); // auf neue Seite weiterleiten

    exit(); // Skript hier anhalten,

}

?>

<?php

// nur fuer Test?

// if ($_POST['gesendet']){

//    echo "Formular gesendet!";

//    }

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

<meta name="keywords" content="">

<meta name="description" content="">

<link rel="stylesheet" type="text/css" href="style.css" media="screen">

<link rel="stylesheet" type="text/css" href="style_print.css" media="print">

<link rel="alternate stylesheet" type="text/css" title="smaller" href="smaller_style.css"> <!-- kleinere Schrift -->

<link rel="alternate stylesheet" type="text/css" title="bigger" href="bigger_style.css"> <!-- groessere Schrift -->

<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">





<title>Kontakt ::</title>



</head>

<body>



<div id="wrapper" class="clearfix">

     <div id="header">

             <img src="img/logo_weiss_sm.gif" width="400" height="56"></div>

     <div id="leftCol">



                 <ul id="nav1">

                    <li class="mainmenu"><a href="index.html"><span>Home</span></a></li>



                    </ul>



                </div>



     <div id="rightCol">

     </div>



    <div id="centerCol">





        <table cellpadding="0" cellspacing="5" border="0" width="735">



            <tr>

                <td valign="top">

                <h1>Kontaktformular</h1>

                <div>





                <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">

                <!-- <form action="kontakt.php" method="POST"> -->





                <?php

                // Ausgabe Fehlernachrichten fuer leere Felder damit Ausgabe selbst platzieren kann

                if ($fehler_nachricht) {

                    echo "<ul>\n";

                        foreach ($fehler_nachricht as $fehler) {

                        echo "<li>".$fehler."</li>\n";

                        }

                    echo "</ul>\n";

                }

                ?>



                <label for="vorname">Vorname*</label>

                <input name="vorname" type="text" size="20" id="vorname" value="<?php echo $vorname ?>">

                <br>



                <label for="nachname">Nachname*</label>

                <input name="nachname" type="text" size="20" id="nachname" value="<?php echo $nachname ?>">

                <br>



                <label for="email">E-Mail*</label>

                <input name="email" type="text" size="20" id="email" value="<?php echo $email ?>">

                <br>



                <label for="nachricht">Nachricht</label>

                <textarea name="nachricht" rows="3" cols="20" id="nachricht"><?php echo $nachricht ?></textarea>

                <br>



                <input type="submit" name="gesendet" value="Senden">

                </form>

                </div>







            </td></tr></table>







  </div>

     <div id="footer">


FOOTER

                </div>





  </div>

</div>







</body>

</html>

Was ich dir noch empfehlen kann, ist diese Seite -> http://schattenbaum.net/php/mail.php bzw. http://schattenbaum.net/php/
hier findest du alles was du für den Anfang fürs PHP lernen brauchst kurz, knapp und, meiner Meinung nach, echt gut erklärt.
 
Zuletzt bearbeitet:
Danke fuer deine Links! Sind wirklich gute Erklaerungen:)

Leider bekommen ich bei dem von dir umgeschriebenen Code folgende Fehlermeldung:
Warning: Cannot modify header information - headers already sent by (output started at -/form_validation.php:41) in -/kontakt_erweitert2.php on line 203

:(( Also wieder diese "Headers already sent"-Meldung. Ich glaub, die Meldung kommt gleich mal auf Platz 1 von "was ich nicht hoeren will". *sigh*
 
Findet im form_validation.php auf Zeile 41 irgendwelche Ausgaben statt ?
Die header information, die gesendet werden wenn PHP etwas zurückgibt, dürfen nur einmal an den Browser gesendet werden. In diesem Falll geschieht dies zweimal. Irgendwo (auf Zeile 41, paar Zeilen später oder früher) und dann noch in der kontakt_erweitert2.php.

Versuchs mal mit:
form_validation.php
PHP:
<?php

// print "included OK";

// prüfe auf Buchstaben, Zahlen, Bindestriche, Punkte, Leerzeichen, einfache Anfuehrungszeichen

function verifiziereAlphaNum ($testString) {

    if (eregi ("^([[:alnum:]]|-|\.| |')+$", $testString)) {

        return 1;

        }

    else {

        return 0;

        }

    }

// prüfe valide Email Adresse

function verifiziereEmail ($testString) {

    if (eregi("^([[:alnum:]]|_|\.|-)+@([[:alnum:]]|\.|-)+(\.)([a-z]{2,4})$", $testString)) {

        return 1;

        }

    else {

        return 0;

        }

    }

// prüfe auf Buchstaben, Zahlen, Bindestriche, Leer-, Frage- und Ausrufezeichen, einfache und doppelte Anführungszeichen

function verifiziereText ($testString) {

    if (eregi("^([[:alnum:]]|-|\.| |\n|\r|\?|\!|\"|\'')+$", $testString)) {

        return 1;

        }

    else {

        return 0;

        }

    }

// prüfe auf valide Telefonnummer

function verifizierteTelefon ($testString) {

    if (eregi('^([[:digit:]]| |-)+$', $testString)) {

        return 1;

        }

    else {

        return 0;

        }

    }



?>

kontakt_erweitert2.php
PHP:
<?php

// include die Formularvalidierungsdatei

include ("form_validation.php");


if ($_POST['gesendet']){

    $vorname = $_POST['vorname'];

    $nachname = $_POST['nachname'];

    $email = $_POST['email'];

    $nachricht = $_POST['nachricht'];



// Ausgabe nur fuer Test beim Schreiben des Formulars

// echo $vorname;

// echo $nachname;

// echo $email;

// echo $nachricht;



// Schaltet Magic Quotes aus, wenn ein ist (Backslash)

    if ( get_magic_quotes_gpc() ) {

        //Print "Magic Quotes sind an";

        $vorname = stripslashes($vorname);

        $nachname = stripslashes($nachname);

        $email = stripslashes($email);

        $nachricht = stripslashes($nachricht);

    }



// Pruefung auf leere Felder

// $fehler_nachricht=0;

// if ($vorname=="") {

//     $fehler_nachricht="Bitte geben Sie Ihren Vornamen ein";

// }



// Fehlermeldung nur ausgeben, wenn Feld leer ist

// if ($fehler_nachricht) {

//     echo ($fehler_nachricht);

// }





//  bei mehreren Fehlern: Fehlermeldungen in einem Array sammeln


// Deklaration hier nicht notwendig, da [] bereits aus $fehler_nachricht ein array macht
//$fehler_nachricht=array();

    // wird ersetzt mit Prüfung auf falsches Zeichen

    // if ($vorname=="") {

    // $fehler_nachricht[] ="Bitte geben Sie Ihren Vornamen ein";

    // }

    $gueltig = verifiziereAlphaNum ($vorname);

    if (!$gueltig) {

        $fehler_nachricht[]="Der Vorname darf nur aus Buchstaben, Zahlen, Leerzeichen, Bindestrichen und # bestehen.";

    }



    // wird ersetzt mit Prüfung auf falsche Zeichen

    // if ($nachname=="") {

    // $fehler_nachricht[] ="Bitte geben Sie Ihren Nachnamen ein";

    // }

    $gueltig = verifiziereAlphaNum ($nachname);

    if (!$gueltig) {

        $fehler_nachricht[]="Der Nachname darf nur aus Buchstaben, Zahlen, Leerzeichen, Bindestrichen und ' bestehen.";

    }



    // wird ersetzt mit Pruefung auf falsches Zeichen

    // if ($email=="") {

    //$fehler_nachricht[] ="Bitte geben Sie Ihre E-Mail-Adresse ein";

    //}

    // wird ersetzt mit Prüfung auf mehrere falsche Zeichen

    // if (!strpo($email, "@")) {

    //     $fehler_nachricht[] ="Bitte geben Sie eine gültige E-Mail-Adresse ein";

    // }

    $gueltig = verifiziereEmail ($email);

    if (!$gueltig) {

        $fehler_nachricht[]="Die E-Mail muss ein gültiges Format besitzen z.B. mustermann@gmx.at.";

    }



    // wird ersetzt mit Prüfung auf falsche Zeichen

    // if ($nachricht=="") {

    // $fehler_nachricht[] ="Sie haben keine Nachricht hinterlassen";

    // }

    $gueltig = verifiziereText ($nachricht);

    if (!$gueltig) {

        $fehler_nachricht[]="Die Nachricht darf nur Buchstaben, Zahlen und folgende Zeichen: \" ' - ? ! enthalten";

    }



// gibt Fehlermeldung aus, nur zum testen

// foreach ($fehler_nachricht as $fehler) {

//    echo ("$fehler <br>");

//    }







    $ziel_email="antispam@e-mail.tl";//necronomicon@gmx.at";

    $email_betreff="Mein Kontaktformular von der HP";

    $email_hauptteil="$vorname\n$nachname\n$nachricht\n$email";

// nur zum Testen, dann weg

//echo $email_hauptteil;

  // nun unten bei weiterleitung: mail ($ziel_email, $email_betreff, $email_hauptteil);

// nur zum testen nun auf neue Seite leiten

// print "E-mail versendet";





    if (!$fehler_nachricht) { // wenn keine Fehler

        //mail ($ziel_email, $email_betreff, $email_hauptteil); // Email verschicken

        header ('Location: form_confirm.php'); // auf neue Seite weiterleiten

        exit(); // Skript hier anhalten,

    }



}


?>

<?php

// nur fuer Test?

// if ($_POST['gesendet']){

//    echo "Formular gesendet!";

//    }

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

<meta name="keywords" content="">

<meta name="description" content="">

<link rel="stylesheet" type="text/css" href="style.css" media="screen">

<link rel="stylesheet" type="text/css" href="style_print.css" media="print">

<link rel="alternate stylesheet" type="text/css" title="smaller" href="smaller_style.css"> <!-- kleinere Schrift -->

<link rel="alternate stylesheet" type="text/css" title="bigger" href="bigger_style.css"> <!-- groessere Schrift -->

<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">





<title>Kontakt ::</title>



</head>

<body>



<div id="wrapper" class="clearfix">

     <div id="header">

             <img src="img/logo_weiss_sm.gif" width="400" height="56"></div>

     <div id="leftCol">



                 <ul id="nav1">

                    <li class="mainmenu"><a href="index.html"><span>Home</span></a></li>



                    </ul>



                </div>



     <div id="rightCol">

     </div>



    <div id="centerCol">





        <table cellpadding="0" cellspacing="5" border="0" width="735">



            <tr>

                <td valign="top">

                <h1>Kontaktformular</h1>

                <div>





                <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">

                <!-- <form action="kontakt.php" method="POST"> -->





                <?php

                // Ausgabe Fehlernachrichten fuer leere Felder damit Ausgabe selbst platzieren kann

                if ($fehler_nachricht) {

                    echo "<ul>\n";

                        foreach ($fehler_nachricht as $fehler) {

                        echo "<li>".$fehler."</li>\n";

                        }

                    echo "</ul>\n";

                }

                ?>



                <label for="vorname">Vorname*</label>

                <input name="vorname" type="text" size="20" id="vorname" value="<?php echo $vorname ?>">

                <br>



                <label for="nachname">Nachname*</label>

                <input name="nachname" type="text" size="20" id="nachname" value="<?php echo $nachname ?>">

                <br>



                <label for="email">E-Mail*</label>

                <input name="email" type="text" size="20" id="email" value="<?php echo $email ?>">

                <br>



                <label for="nachricht">Nachricht</label>

                <textarea name="nachricht" rows="3" cols="20" id="nachricht"><?php echo $nachricht ?></textarea>

                <br>



                <input type="submit" name="gesendet" value="Senden">

                </form>

                </div>







            </td></tr></table>







  </div>

     <div id="footer">


FOOTER

                </div>





  </div>

</div>







</body>

</html>
 
Ich habe nun beide Dateien neu abgespeichert und raufgeladen.

Wenn beim Ausfuellen der Felder eines leer blieb, dann kam die gewuenschte Meldung, dass man das Feld ausfuellen muss. Das funktioniert jetzt also:) danke!

Beim verschicken jedoch kam folgende Fehlermeldung:
Warning: Cannot modify header information - headers already sent by (output started at /var/home/e-pages_at/www/form_validation.php:79) in /var/home/e-pages_at/www/kontakt_erweitert2.php on line 198

Die Zeile 198 (in kontakt_erweitert2.php) ist:
HTML:
        header ('Location: form_confirm.php'); // auf neue Seite weiterleiten

Die Zeile 79 (in form_validation.php) ist:
HTML:
?>
 
Vielen Danke!
Es war ein Leerzeichen nach dem ?>

genau wie du gesagt hast. Da waere ich im Leben nicht draufgekommen. Aber gut zu wissen, das sowas eine Fehlerquelle sein kann!

Ich finde es total nett, dass Du Dir die Zeit fuer mich und mein Problem genommen hast!
 
Zurück