selfuser: PHP email form - headers already sent

Guten Abend,

Ich habe dieses PHP email form (der Download funktioniert noch immer) seit Jahren innerhalb eines iframes auf einer iWeb-Seite ohne Probleme verwendet. Ich finde es wirklich gut!

Nun wollte ich es ohne iWeb, solo, als page (nur mit den beiden button Dateien) verwenden, aber ich bekomme die Fehlermeldung:

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at .../contact/index.php:47) in .../contact/index.php on line 49

Nicht dass das Formular nicht funktionieren würde - es läuft perfekt - ich habe nur diese Fehlermeldung über dem Formular, was doch etwas stört.

Könnte bitte jemand mal einen Blick darauf werfen?

Wahrscheinlich ist eine Kleinigkeit nicht mehr "kompatibel".

Ich habe den ganzen Nachmittag damit verbracht eine Lösung zu finden, aber ohne Erfolg. Diese Seite habe ich gefunden, aber die Diskussion ist für mich etwas "over the top". :-(

Vielen Dank!

  1. Hallo,

    Ich habe dieses PHP email form (der Download funktioniert noch immer) seit Jahren innerhalb eines iframes auf einer iWeb-Seite ohne Probleme verwendet. Ich finde es wirklich gut!

    Nun wollte ich es ohne iWeb, solo, als page (nur mit den beiden button Dateien) verwenden, aber ich bekomme die Fehlermeldung:

    was zum Geier ist iWeb?

    Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at .../contact/index.php:47) in .../contact/index.php on line 49
    

    Nun, das Wesentliche steht doch da im Klartext: In Zeile 47 des Scripts fand die erste Ausgabe statt, damit wurden also sämtliche HTTP-Header gesendet; in Zeile 49 möchtest du aber eine Session starten, was in aller Regel das Setzen eines Cookies impliziert. Das geht zu dem Zeitpunkt natürlich nicht mehr.

    Könnte bitte jemand mal einen Blick darauf werfen?

    Ja, du. Ersatzweise zeig uns den relevanten Quellcode.

    So long,
     Martin

    1. Hallo Der,

      was zum Geier ist iWeb?

      eine Software zum erstellen von Webseiten ähnlich wie Dreamweaver und Co. Das ganze wurde von Apple entwickelt.

      1. was zum Geier ist iWeb?

        eine Software zum erstellen von Webseiten ähnlich wie Dreamweaver und Co. Das ganze wurde von Apple entwickelt.

        iWeb gibt's nicht mehr. Ich verwende HyperEdit (Mac) für manuelles Editieren. Für meine Bedürfnisse völlig ausreichend.

    2. Hallo Martin,

      Ersatzweise zeig uns den relevanten Quellcode.

      So long

      Ja, es ist tatsächlich etwas long!

      mailform.php: (ich weiß nicht, was davon alles wichtig ist - also lasse ich es komplett)

      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
      
      <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="nl" lang="nl">
      
      <head>
      
      <title>Email formulier</title>
      
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      
      <style type="text/css">
      <!--
      html {font-size: 18px; font-family: Lucida Sans, sans-serif;}
      
      body {background-color: transparent; color: gray; padding: 0px; margin: 0px; font-size: .7em;}
      
      p {padding: 0px; margin: 5px; padding-bottom: 5px;}
      
      a {color: navy; background-color: transparent;}
      
      code {color: red;}
      
      td, input, textarea, p {
      	font-family: Georgia;
      	font-size: 1.2em;
      }
      
      h3 {
      	font-family: Georgia;
      	font-size: 2.0em;
      }
      
      #container {
      	width: 634px;
      	height: 580px;
      }
      -->
      </style>
      
      </head>
      
      <body>
      
      <div id="container">
      
      <?php
      
      session_start();
      
      // ENTER YOUR OWN EMAIL ADDRESS AS RECIPIENT.
      
      $mail_ontv = "YOURNAME@YOURDOMAIN.COM";
      
      // Check if email address is correct!!!
      
      function checkmail($mail)
      {
      	$email_host = explode("@", $mail);
      	$email_host = $email_host['1'];
      	$email_resolved = gethostbyname($email_host);
      
      	if ($email_resolved != $email_host && eregi("^[0-9a-z]([-_.~]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-z]{2,4}$",$mail))
      		$valid = 1;
      
      	return $valid;
      } 
      
      function display()
      {
      
      	// form + tabel 
      	echo "<form method=\"post\" action=\"" . $_SERVER['PHP_SELF'] . "\">\n\n";
      	echo "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n\n";
      
      	// naam
      	echo "<tr><td colspan=\"2\">Your name:</td></tr>\n\n";
      	echo "<tr><td colspan=\"2\"><input type=\"text\" name=\"naam\" value=\"" . $_POST['naam'] . "\" tabindex=1  /></td></tr>\n\n";
      
      	// space
      	echo "<tr><td colspan=\"2\">&nbsp;</td></tr>\n\n";
      
      	// mail
      	echo "<tr><td colspan=\"2\">E-mail address:</td></tr>\n\n";
      	echo "<tr><td colspan=\"2\"><input type=\"text\" name=\"mail\" value=\"" . $_POST['mail'] . "\" tabindex=2 /></td></tr>\n\n";
      
      	// space
      	echo "<tr><td colspan=\"2\">&nbsp;</td></tr>\n\n";
      
      	// subject
      	echo "<tr><td colspan=\"2\">Subject:</td></tr>\n\n";
      	echo "<tr><td colspan=\"2\"><input type=\"text\" name=\"subject\" value=\"" . $_POST['subject'] . "\" tabindex=3 /></td></tr>\n\n";
      
      	// space
      	echo "<tr><td colspan=\"2\">&nbsp;</td></tr>\n\n";
      
          // Bericht
      	echo "<tr><td colspan=\"2\">Message:</td></tr>\n\n";
      	echo "<tr><td colspan=\"2\"><textarea name=\"msggs\" rows=\"6\" cols=\"45\" tabindex=4 >" . htmlentities($_POST['msggs']) . "</textarea></td></tr>\n\n";
      
      	// space
      	echo "<tr><td colspan=\"2\">&nbsp;</td></tr>\n\n";
      	
         // Security
      	echo "<tr><td>Security Code:</td>\n\n";
      	echo "<td rowspan=\"2\" style=\"width: 280px\"><img src=\"button.php\" width=\"100\" height=\"40\" alt=\"captcha\" /></td></tr>\n\n";
      	echo "<tr><td><input id=\"security_code\" name=\"security_code\" type=\"text\" tabindex=5 /></td></tr>\n\n";
      
      	// space
      	echo "<tr><td colspan=\"2\">&nbsp;</td></tr>\n\n";
      
      	// button
      	echo "<tr><td colspan=\"2\">&nbsp;</td></tr>\n\n";
      	echo "<tr><td colspan=\"2\"><input type=\"submit\" name=\"submit\" value=\"Send\" tabindex=6 /></td></tr>\n\n";
            
      	// sluit form + tabel
      	echo "</table>\n\n";
      	echo "</form>\n";
      
      }
      
      // als er niet op submit is gedrukt, of als er wel op is gedrukt maar niet alles ingevoerd is
      
      if( isset($_POST['submit'])) {
         if( $_SESSION['security_code'] == $_POST['security_code'] && !empty($_SESSION['security_code'] ) ) {
         	
      		if (!$_POST['naam'] || !$_POST['mail'] || !checkmail($_POST['mail']) || !$_POST['msggs'] || !$_POST['subject']) {
      			display();
      			echo "<p>You forgot to enter text in one of the fields.<br />";
      			echo "Also, you may have misspelled your e-mail address.</p>";
      
      		} else {
      
      	// set datum
      	$datum = date("d.m.Y H:i");
      
      	// set ip
      	$ip = $_SERVER['REMOTE_ADDR'];
      
      	$inhoud_mail = "===================================================\n";
      	$inhoud_mail .= "Email contact formulier www.YOURDOMAIN.com\n";
      	$inhoud_mail .= "===================================================\n\n";
      
      	$inhoud_mail .= "Name: " . $_POST['naam'] . "\n";
      	$inhoud_mail .= "E-mail address: " . $_POST['mail'] . "\n";
      	$inhoud_mail .= "Message: " . $_POST['msggs'] . "\n\n";
      
      	$inhoud_mail .= "Sent on $datum via ip " . $ip . "\n\n";
      
      	$inhoud_mail .= "===================================================\n\n";
      
          // --------------------
          // spambot protectie !!
          // --------------------
      
      	$headers = "From: " . $_POST['naam'] . " <" . $_POST['mail'] . ">";
      
      	$headers = stripslashes($headers);
      	$headers = str_replace("\n", "", $headers); // Verwijder \n
      	$headers = str_replace("\r", "", $headers); // Verwijder \r
      	$headers = str_replace("\"", "\\\"", str_replace("\\", "\\\\", $headers)); // Slashes van quotes
      
      	$_POST['subject'] = str_replace("\n", "", $_POST['subject']); // Verwijder \n
      	$_POST['subject'] = str_replace("\r", "", $_POST['subject']); // Verwijder \r
      	$_POST['subject'] = str_replace("\"", "\\\"", str_replace("\\", "\\\\", $_POST['subject'])); // Slashes van quotes
      
      	mail($mail_ontv, $_POST['subject'], $inhoud_mail, $headers);
      	echo "<h3>Message has been sent</h3>\n\n";
      	echo "<p>Thank you for your message!</p>\n\n";
      	echo "<p><a href=\"" . $_SERVER['PHP_SELF'] . "\" target=\"_self\" style=\"color: navy;\">Send another...</a></p>";
      	}
      
      	} else {
      		display();
      		echo "<p>The Security code is wrong</p>";
      	}
      
      } else {
      
      	display();
      
      }
      
      ?>
      
      </div>
      
      </body>
      
      </html>
      

      Ich habe jetzt extra nichts geändert, auch die Leerzeilen drin gelassen. Wie gesagt, es funktionierte perfekt. Es verwendet auch noch button.php:

      <?php
      session_start();
      
      class createCaptcha {
      
      	function generateCode($characters) {
      
      		/* list all possible characters, similar looking characters and vowels have been removed */
      		$possible = '23456789bcdfghjkmnpqrstvwxyz';
      		$code = '';
      		$i = 0;
      		while ($i < $characters) { 
      			$code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
      			$i++;
      		}
      		return $code;
      
      	}
      
      	function createCaptcha() {
      
      		$code = $this->generateCode(5);
      		$my_img = imagecreatefrompng('button.png');
      
      		$background = imagecolorallocate( $my_img, 0, 0, 255 );
      		$text_colour = imagecolorallocate( $my_img, 255, 255, 0 );
      
      		imagestring( $my_img, 4, 20, 3, $code, $text_colour );
      
      		header( "Content-type: image/png" );
      
      		imagepng($my_img);
      		imagecolordeallocate($text_color);
      		imagedestroy( $my_img );
      
      		$_SESSION['security_code'] = $code;
      
      	}
      
      }
      
      $captcha = new createCaptcha();
      
      ?>
      

      Dazu gehört als letztes button.png (93 x 23 pixel, farbe: 444444)

      Ich hoffe das hilft.

      1. Hi,

        Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at .../contact/index.php:47) in .../contact/index.php on line 49
        

        bedeutet: Warnung bei session_start(): eine Ausgabe hat bereits stattgefunden (ab Zeile 47 in .../contact/index.php), daher kann session_start() nicht den session cache limiter senden (in Zeile 49 in .../contact/index.php).

        Merke, gewisse Funktionen wie session_start() oder header() müssen ausgeführt werden, bevor eine Ausgabe stattgefunden hat. Eine Ausgabe ist echo "<html>"; ebenso wie <html>, etc.

        Also, statt:

        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
        
        <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="nl" lang="nl">
        
        <head>
        
        <title>Email formulier</title>
        
        <!-- abgekürzt -->
        
        </head>
        
        <body>
        
        <div id="container">
        
        <?php
        
        session_start();
        

        tue dies:

        <?php 
        session_start();
        ?>
        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
        
        <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="nl" lang="nl">
        
        <head>
        
        <title>Email formulier</title>
        
        <!-- abgekürzt -->
        
        </head>
        
        <body>
        
        <div id="container">
        
        <?php
        
        
        

        Cheers,
        BaBa

        --
        BaBa kommt von Basketball
        1. Great! Es läuft!!

          Danke Baba für die konkrete Hilfe. Ich habe die 3 Zeilen nach oben kopiert und die Fehlermeldung ist weg.

          Es ist im log des button scripts (für Captcha) noch eine andere Fehlermeldung erschienen, imagecolordeallocate würde zwei Parameter benötigen, und auch das konnte ich lösen.

          Irgendwie seltsam, dass früher alles ohne diese Fehler im iframe lief. Kann es sein, dass imagecolordeallocate früher nur einen Parameter benötigte?

          Ich habe nun noch die Schriftart ersetzt, margins und background color definiert, und jetzt sieht alles OK aus.

          Danke nochmals!

  2. Tach!

    Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at .../contact/index.php:47) in .../contact/index.php on line 49
    

    Diese "headers already sent"-Fehlermeldung ist wohlbekannt und Fragen dazu wurden schon so oft beantwortet. Auch hier im Forum.

    Wahrscheinlich ist eine Kleinigkeit nicht mehr "kompatibel".

    Nein, das Problem ist ein generelles und daran hat sich nichts geändert.

    Ich habe den ganzen Nachmittag damit verbracht eine Lösung zu finden, aber ohne Erfolg. Diese Seite habe ich gefunden, aber die Diskussion ist für mich etwas "over the top". :-(

    Dann hast du sicher auch viele andere Seiten gefunden. Wenn auch diese Seite sehr ausführlich all die Möglichkeiten darstellt, wo Ausgaben gestartet sein können und sogar Umgehungsmöglichkeiten anbietet, gibt es auch genügend Antworten in Kurzform: Keine Ausgabe vor header-sendenden Funktionen! Strukturier dein Script um, geh nach dem EVA-Prinzip (Eingabe, Verarbeitung, Ausgabe) vor. Erst die Eingabe entgegennehmen und verarbeiten, dann die Ausgabe durchführen.

    dedlfix.

    1. Danke Dedlfix,

      das Problem und die wahrscheinlichen Ursachen wurden zwar beschrieben, aber es selbst zu lösen setzt Spezialwissen zu php voraus, das ich nicht habe (ich brauche das einfach zu selten).

      Aber ich sehe Baba hat noch etwas Konkretes geschrieben, das helfen könnte...

  3. Hallo selfuser,

    Dieser Thread war zwischenzeitlich gelöscht, der TO hatte versehentlich persönliche Daten veröffentlicht. Eventuell gibt es noch weitere Beiträge.

    Bis demnächst
    Matthias

    --
    Signaturen sind bloed (Steel) und Markdown ist mächtig.