PHP email form - headers already sent
selfuser
- html
- php
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!
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
Hallo Der,
was zum Geier ist iWeb?
eine Software zum erstellen von Webseiten ähnlich wie Dreamweaver und Co. Das ganze wurde von Apple entwickelt.
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.
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\"> </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\"> </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\"> </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\"> </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\"> </td></tr>\n\n";
// button
echo "<tr><td colspan=\"2\"> </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.
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
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!
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.
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...
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