• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

PHP in HTML/CSS-Layout einbinden erzeugt "Cannot modify header information"-Fehler

hightime

Neues Mitglied
Guten Abend allerseits :)

habe ein kleine Problem mit der Umsetzung meines PHP Formulars… nach ewigen probieren funktioniert auch fast alles.
Nachdem das Formular über einen Button auf der index.html gesendet wurde, wird einen neue Seite geöffnet (registriert.php) und dort wird dann eine Bestätigung angezeigt. Logischerweise wir diese auf einer weißen Seite angezeigt, da ja nur der PHP-Code in der Datei steht.

Ich möchte das Design der ersten Seite (index.html) auch in der zweiten Seite haben. Also eigentlich auf der registriert.php einfach nur da wo auf der index.html das Formular stand die Fehlermeldung oder Bestätigung für den Versand der Email stehen haben. Wenn ich aber den PHP-Code in den entsprechenden DIV einbinde, das Formular richtig ausfülle so dass keine meiner Fehlermeldungen generiert wird, funktioniert das ganze zwar aber es werden mir immer folgende Fehlermeldungen angezeigt:

PHP:
Warning: Cannot modify header information - headers already sent by (output started at /var/www/web1438/html/oertelphotography/private/vortrag2012/registriert.php:7) in/var/www/web1234/html/abcde/private/v12/registriert.php on line 169

Warning: Cannot modify header information - headers already sent by (output started at /var/www/web1438/html/oertelphotography/private/vortrag2012/registriert.php:7) in/var/www/web1234/html/abcde/private/v12/funktionen.inc.php on line

Wenn ich mit Absicht das Formular falsch ausfülle und somit eine Meldung generiert wird, werden die oben stehende Fehlermeldungen auch angezeigt und der nach dem PHP-Code stehende HTML-Code wird nicht angezeigt..


Hier den PHP-Code den ich in einen DIV in meinem HTML etwas ganz oder per "include ('filename.php');" versucht habe einzubinden:

Code:
<?php


header( 'Content-Type: text/html; charset=utf-8' );


// Empfänger Email
$empfaenger = '[email protected]';


//Betreff der Email
  $betreff = 'Anmeldung zum Vortrag 2012';


// Prüfen ob das Formular abgeschickt wurde
if (isset($_POST['senden']))
{
    // Funktionen einbinden
    include( 'funktionen.inc.php' );
    
    // Benutzereingaben bereinigen und auf Injection prüfen
    cleanInput();
    
    // Name prüfen
    $name = checkName( $_POST['name'] );
    // Email prüfen
    $email = checkEmail( $_POST['email'] );
    // Betreff und Nachricht prüfen
    if ((strlen( $_POST['betreff'] ) < 5) || (strlen( $_POST['nachricht'] ) < 5) || (strlen( $_POST['firma'] ) < 2) || (strlen( $_POST['anzahl'] ) < 1))
    {
        die( 'Bitte füllen Sie alle gekennzeichneten Felder aus.' );
    }
    else
    {
        $betreff   = $_POST['betreff'];
        $nachricht = $_POST['nachricht'];
        
        $firma = $_POST['firma'];
        $position = $_POST['position'];
        $anrede = $_POST['anrede'];
        $telefon = $_POST['telefon'];
        $adresse = $_POST['adresse'];
        $postleitzahl = $_POST['postleitzahl'];
        $ort = $_POST['ort'];
        $anzahl = $_POST['anzahl'];
    }
    
    // --------------------------------------------------------------------------------
    // Wurde das Script bisher nicht abgebrochen, wurde das Formular korrekt ausgefüllt
    // --------------------------------------------------------------------------------
    
    // Template mit dem Mailbody laden und für den Versand vorbereiten
    $mailbody = file_get_contents( 'mailbody.txt' );
    // Platzhalter mit den Benutzereingaben ersetzen
    $mailbody = str_replace( '###NAME###', htmlspecialchars( $name ), $mailbody );
    $mailbody = str_replace( '###EMAIL###', $email, $mailbody );
    $mailbody = str_replace( '###NACHRICHT###', htmlspecialchars( $nachricht ), $mailbody );
    $mailbody = str_replace( '###FIRMA###', htmlspecialchars( $firma ), $mailbody );
    $mailbody = str_replace( '###POSITION###', htmlspecialchars( $position ), $mailbody );
    $mailbody = str_replace( '###ANREDE###', htmlspecialchars( $anrede ), $mailbody );
    $mailbody = str_replace( '###TELEFON###', htmlspecialchars( $telefon ), $mailbody );
    $mailbody = str_replace( '###ADRESSE###', htmlspecialchars( $adresse ), $mailbody );
    $mailbody = str_replace( '###POSTLEITZAHL###', htmlspecialchars( $postleitzahl ), $mailbody );
    $mailbody = str_replace( '###ORT###', htmlspecialchars( $ort ), $mailbody );
    $mailbody = str_replace( '###ANZAHL###', htmlspecialchars( $anzahl ), $mailbody );
    
    // Mail Header erstellen
    $mailheader  = "From: Max Mustermann<[email protected]>\r\n";
    $mailheader .= "Reply-To: [email protected]\r\n";
    $mailheader .= "Return-Path: [email protected]\r\n";
    $mailheader .= "MIME-Version: 1.0\r\n";
    $mailheader .= "Content-Type: text/plain; charset=UTF-8\r\n";
    $mailheader .= "Content-Transfer-Encoding: 7bit\r\n";
    $mailheader .= "Message-ID: <" .time(). " noreply@" .$_SERVER['SERVER_NAME']. ">\r\n";
    $mailheader .= "X-Mailer: PHP v" .phpversion(). "\r\n\r\n";
    
    // Email versenden
    if (@mail( $empfaenger, htmlspecialchars( $betreff ), $mailbody, $mailheader ))
    {
        // Bei erfolgreichem Versand Danke-Seite anzeigen
        echo 'Danke, die Email wurde verschickt!';
    }
}


?>

Habt ihr eine Idee wie das gelöst werden kann? Wie gesagt, die Fehlermeldung falls das Formular falsch ausgefüllt wurde oder die Bestätigung soll einfach an der Stelle wo auf der vorigen Seite das Formular war angezeigt werden.


Danke euch im Voraus :)

mfG,

Hightime
 
Alle PHP-Header müssen vor der ersten HTML-Ausgabe verarbeitet werden.
Wenn du das im Nachhinein nicht mehr so einfach bewerkstelligt bekommst, kannst du alternativ einen Outputbuffer benutzen.
 
Danke dir - habe jetzt auf verschiedenen Seiten über den Output Buffer gelesen.

Habe das so verstanden, dass sowohl in die "registriert.php" als auch die "funktionen.inc.php" folgendes an den Anfang muss:
PHP:
<?php 
ob_start();
?>
dadurch wird der Output Buffer aktiviert - richtig?

Anschließend habe ich auf der "registriert.php" im HTML Code wo die Meldung erscheinen soll
PHP:
 <?
ob_end_flush();
?>
geschrieben.

Nur leider kommt am Ende immer eine Meldung (ohne HTML/CSS - also auf weisser Seite) eine Fehlermeldung aus der "funktionen.inc.php" raus.
Habe es auch mit ob_get_contents und einer Variabel probiert, immer das selbe Problem.

Hier der Code aus dieser Datei:

Code:
<?phpheader( 'Content-Type: text/html; charset=utf-8' );


// Benutzereingabe bereinigen (trimmen, Slashes entfernen)
function cleanInput()
{
    checkInjection();
    if (get_magic_quotes_gpc()) $_POST = array_map( 'stripslashes', $_POST );
    $_POST = array_map( 'trim', $_POST );
}




// Name auf Gültigkeit prüfen
function checkName( $name )
{
    $muster_name = '/^([a-zA-ZäÄöÖüÜß\xc0-\xc2\xc8-\xcf\xd2-\xd4\xd9-\xdb\xe0-\xe2\xe8-\xef\xf2-\xf4\xf9-\xfb\x9f\xff\.\'\-_]?(\s)?)+$/';
    if (preg_match( $muster_name, $name ))
    {
        return $name;
    }
    else
    {
        die( 'Der eingegebene Name enthält nicht erlaubte Zeichen!' );
    }
}




// Email auf korrektes Format prüfen
function checkEmail( $email )
{
    $nonascii      = "\x80-\xff";    
    $nqtext        = "[^\\\\$nonascii\015\012\"]";
    $qchar         = "\\\\[^$nonascii]";
    $normuser      = '[a-zA-Z0-9][a-zA-Z0-9_.-]*';
    $quotedstring  = "\"(?:$nqtext|$qchar)+\"";
    $user_part     = "(?:$normuser|$quotedstring)";
    $dom_mainpart  = '[a-zA-Z0-9][a-zA-Z0-9._-]*\\.';
    $dom_subpart   = '(?:[a-zA-Z0-9][a-zA-Z0-9._-]*\\.)*';
    $dom_tldpart   = '[a-zA-Z]{2,5}';
    $domain_part   = "$dom_subpart$dom_mainpart$dom_tldpart";
    $pattern       = "$user_part\@$domain_part";
    $muster_email  = "/^{$pattern}$/";
    if (preg_match( $muster_email, $email ))
    {
        return $email;
    }
    else
    {
        die( 'Die eingegebene Email-Adresse hat kein gültiges Format!' );
    }
}




// Benutzereingaben auf mögliche Injection prüfen
function checkInjection()
{
    $email_injection = array( 'bcc:', 'boundary', 'cc:', 'content-transfer-encoding:', 'content-type:', 'mime-version:', 'subject:' );


    // Auf potentielle Email Injections prüfen
    foreach ($email_injection as $injection)
    {
        foreach ($_POST as $feld => $inhalt)
        {
            if (preg_match( "/{$injection}/i", $inhalt ))
            {
                header( 'location: http://www.abcdefg.com);
                exit;
            }
        }
    }
    return true;
}


?>


Kannst du mir da weiterhelfen?


mfG
Hightime
 
ob_start() muss nur auf die vom Browser aufgerufene Seite und zwar ganz an den Anfang.
Es sei denn, du öffnest session_start() - dann kommt der buffer erst danach.
Auf ob_end() kannst du verzichten, sofern du den Buffer nicht vor Dokumentende ausgeben möchtest.
 
Wenn ich aber nur ob_start(); an den Anfang meiner registriert.php setzte, kommt immer wieder nur der aus der "funktionen.inc.php" generierte Fehler raus - und das auf einer weissen Seite: "Die eingegebene Email-Adresse hat kein gültiges Format!"

Der Sinn ist ja aber, dass das die Fehlermeldung oder Bestätigung in einem bestimmten <div class="ziel"></div> wiedergegeben wird - und das mit dem restlichen Design der Seite, nicht auf einer weissen Seite.


EDIT: Okay, habs durch probieren rausgefunden…

Code:
<?php 
  ob_start();
?>

<html> 
  <div class="ziel"
    <?php 
      [I]hier den ganzen php code
[/I]    ?>
  </div>
</html

Nun habe ich aber das Problem, dass wenn ein Fehler ausgegeben wird der Rest der HTML-Datei nicht geladen wird. In der Tat, liegt nach dem DIV in dem sich der PHP-Code befindet noch der ganze Footer.

Liegt es daran, dass wenn ein Fehler ausgegeben wird das mit "die" wie folgt gemacht wird? Wenn ich das richtig gelesen hab, beendet "die" den Code - richtig? Was kann ich da als alternative benutzen, so dass die Email nicht verschickt wird, der Fehler ausgegeben wird aber der Folter der HTML-Datei noch geladen wird?

Code:
[…]
else    {
        die( 'Der eingegebene Name enthält nicht erlaubte Zeichen.' );
    }
[…]
 
Zuletzt bearbeitet:
Gut, habs geschafft - musste nur die If und Else Konditionen umschreiben, dann hat es geklappt. Danke für die Hilfe :)
 
Zuletzt bearbeitet:
Zurück
Oben