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

str_replace funktioniert nicht bei Kontaktformular

ligoline

Neues Mitglied
Hallo Leute,

arbeite erst seit kurzem mit PHP und hab jetzt mein erstes Kontaktformular erstellt. Es arbeitet fehlerfrei und die Eintragungen kommen bei mir per Email an.

Da aber ja html die Umlaute etc. von PHP nicht erkennt, hab ich folgenden Code unmittelbar nach <?php und vor der if(§_POST... eingefügt:

PHP:
$von = str_replace("ä", "&auml;", $von);                
$von = str_replace("Ä", "&Auml;", $von);                
$von = str_replace("ö", "&ouml;", $von);                
$von = str_replace("Ö", "&Ouml;", $von);                
$von = str_replace("ü", "&uuml;", $von);                
$von = str_replace("Ü", "&Uuml;", $von);                
$von = str_replace("ß", "&szlig;", $von);                
$von = str_replace("&", "&amp;", $von);                
$von = str_replace("<", "<&nbsp;", $von);                
$von = str_replace(">", ">&nbsp;", $von);         
                       
$nachricht = str_replace("ä", "&auml;", $nachricht);                
$nachricht = str_replace("Ä", "&Auml;", $nachricht);                
$nachricht = str_replace("ö", "&ouml;", $nachricht);                
$nachricht = str_replace("Ö", "&Ouml;", $nachricht);                
$nachricht = str_replace("ü", "&uuml;", $nachricht);                
$nachricht = str_replace("Ü", "&Uuml;", $nachricht);                
$nachricht = str_replace("ß", "&szlig;", $nachricht);                
$nachricht = str_replace("&", "&amp;", $nachricht);                
$nachricht = str_replace("<", "<&nbsp;", $nachricht);                
$nachricht = str_replace(">", ">&nbsp;", $nachricht);                
$nachricht = str_replace("\r\n", "<br />", $nachricht);                                

$betreff = str_replace("ä", "&auml;", $betreff);                
$betreff = str_replace("Ä", "&Auml;", $betreff);                
$betreff = str_replace("ö", "&ouml;", $betreff);                
$betreff = str_replace("Ö", "&Ouml;", $betreff);                
$betreff = str_replace("ü", "&uuml;", $betreff);                
$betreff = str_replace("Ü", "&Uuml;", $betreff);                
$betreff = str_replace("ß", "&szlig;", $betreff);                
$betreff = str_replace("&", "&amp;", $betreff);                
$betreff = str_replace("<", "<&nbsp;", $betreff);                
$betreff = str_replace(">", ">&nbsp;", $betreff);                                

$mail = str_replace("ä", "&auml;", $mail);                
$mail = str_replace("Ä", "&Auml;", $mail);                
$mail = str_replace("ö", "&ouml;", $mail);                
$mail = str_replace("Ö", "&Ouml;", $mail);                
$mail = str_replace("ü", "&uuml;", $mail);                
$mail = str_replace("Ü", "&Uuml;", $mail);                
$mail = str_replace("ß", "&szlig;", $mail);                
$mail = str_replace("<", "<&nbsp;", $mail);                
$mail = str_replace(">", ">&nbsp;", $mail);

Die Website hat folgende Grundeinstellung (über Template): <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Ich habe auch folgende Einstellung versucht:

PHP:
$mail = htmlentities($_POST['mail']);                
$betreff  = htmlentities($_POST['betreff']);                
$nachricht  = htmlentities($_POST['nachricht']);                
$von  = htmlentities($_POST['von']);

aber auch das half nichts.

Hab dann auch eine Blankoseite ohne Layout hochgeladen - aber auch hier funktionierte das Umwandeln der Umlaute nicht (an meinem Weblayout ist also auch kein Hinderniss drin).
Mein ftp-server ist bei web.de, falls das noch von Bedeutung wäre.

Zur Sicherheit hier noch der vollständige php-text:

PHP:
<?php                
$von = str_replace("ä", "&auml;", $von);                
$von = str_replace("Ä", "&Auml;", $von);                
$von = str_replace("ö", "&ouml;", $von);                
$von = str_replace("Ö", "&Ouml;", $von);                
$von = str_replace("ü", "&uuml;", $von);                
$von = str_replace("Ü", "&Uuml;", $von);                
$von = str_replace("ß", "&szlig;", $von);                
$von = str_replace("&", "&amp;", $von);                
$von = str_replace("<", "<&nbsp;", $von);                
$von = str_replace(">", ">&nbsp;", $von);
                                
$nachricht = str_replace("ä", "&auml;", $nachricht);                
$nachricht = str_replace("Ä", "&Auml;", $nachricht);                
$nachricht = str_replace("ö", "&ouml;", $nachricht);                
$nachricht = str_replace("Ö", "&Ouml;", $nachricht);                
$nachricht = str_replace("ü", "&uuml;", $nachricht);                
$nachricht = str_replace("Ü", "&Uuml;", $nachricht);                
$nachricht = str_replace("ß", "&szlig;", $nachricht);                
$nachricht = str_replace("&", "&amp;", $nachricht);                
$nachricht = str_replace("<", "<&nbsp;", $nachricht);                
$nachricht = str_replace(">", ">&nbsp;", $nachricht);                
$nachricht = str_replace("\r\n", "<br />", $nachricht);                                

$betreff = str_replace("ä", "&auml;", $betreff);                
$betreff = str_replace("Ä", "&Auml;", $betreff);                
$betreff = str_replace("ö", "&ouml;", $betreff);                
$betreff = str_replace("Ö", "&Ouml;", $betreff);                
$betreff = str_replace("ü", "&uuml;", $betreff);                
$betreff = str_replace("Ü", "&Uuml;", $betreff);                
$betreff = str_replace("ß", "&szlig;", $betreff);                
$betreff = str_replace("&", "&amp;", $betreff);                
$betreff = str_replace("<", "<&nbsp;", $betreff);                
$betreff = str_replace(">", ">&nbsp;", $betreff);                                

$mail = str_replace("ä", "&auml;", $mail);                
$mail = str_replace("Ä", "&Auml;", $mail);                
$mail = str_replace("ö", "&ouml;", $mail);                
$mail = str_replace("Ö", "&Ouml;", $mail);                
$mail = str_replace("ü", "&uuml;", $mail);                
$mail = str_replace("Ü", "&Uuml;", $mail);                
$mail = str_replace("ß", "&szlig;", $mail);                
$mail = str_replace("<", "<&nbsp;", $mail);                
$mail = str_replace(">", ">&nbsp;", $mail); 

if($_POST['von']!="" and $_POST['mail']!="" and $_POST['betreff']!="" and $_POST['nachricht']!="" and $_POST['antwort']!="") {                                

$empf = "[email protected]";                
$betreff = $_POST['betreff'];                
$from = "From: ";                
$from .= $_POST['von'];                
$from .= " <";                
$from .= $_POST['mail'];                
$from .= ">\n";                
$from .= "Replay-Too: ";                
$from .= $_POST['mail'];                
$from .= "\n";                
$from .= "Content-Type: text/html\n";                
$text = $_POST['nachricht'];                                
mail($empf, $betreff, $text, $from);                
echo "Vielen Dank f&uuml;r Ihre Anfrage. &Uuml;ber einen G&auml;stebucheintrag w&uuml;rde ich mich ebenso freuen!";                } 
else 
{                
echo "Bitte f&uuml;lle alle Felder aus";                }        
?>

Die Fehlermeldungen klappen alle, wenn nicht die Pflichtfelder ausgefüllt sind, das übermitteln der Daten klappt wunderbar - nur diese Umlaute etc. werden kryptisch übermittelt.

Würd mich riesig freuen, wenn mir hier einer helfen kann. Ein Freund hat schon drüber geschaut und auch versucht zu helfen, er meinte, der php-code sei fehlerfrei - daher jetzt mein Post.

Danke und LG
Birgit
 
Zuletzt bearbeitet:
Die Angabe

HTML:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

sagt ja, dass alle Zeichen mit utf8 kodiert sind. Hast Du auch deine PHP-Dateien in diesem Zeichensatz gespeichert? Wenn nein, wird dein Ersetzungswahnsinn nicht funktionieren.

Tipp: wenn Du den Zeichensatz durchziehst, also von den Dateien über die Ausgabe der Webseiten im Browser bis hin zu E-Mails, dann brauchst Du diese Ersetzungen überhaupt nicht vornehmen. Dann reicht ein einfaches htmlspecialchars() um unbequemen HTML-Code aus den Eingabefeldern zu kodieren - mehr nicht.
 
Ergänzender Tip:

Wenn schon im Script, mach dir bei solchen Aufgaben eine Funktion, die die Ersetzung vornimmt, dann ersparst du dir das mehrfache Wiederholen deiner Ersetzung.

PHP:
function make_sonderzeichen($von)
{
  $von = str_replace("ä", "&auml;", $von);                
  $von = str_replace("Ä", "&Auml;", $von);                
  $von = str_replace("ö", "&ouml;", $von);                
  $von = str_replace("Ö", "&Ouml;", $von);                
  $von = str_replace("ü", "&uuml;", $von);                
  $von = str_replace("Ü", "&Uuml;", $von);                
  $von = str_replace("ß", "&szlig;", $von);                
  $von = str_replace("&", "&amp;", $von);                
  $von = str_replace("<", "<&nbsp;", $von);                
  $von = str_replace(">", ">&nbsp;", $von);

  return $von;
}

$von = make_sonderzeichen($von);
$nachricht = make_sonderzeichen($nachricht);
$betreff = make_sonderzeichen($betreff);
 
Danke für die Hilfe, versuche jetzt mal auf Eure Anmerkungen einzugehen:

Hast Du auch deine PHP-Dateien in diesem Zeichensatz gespeichert? Wenn nein, wird dein Ersetzungswahnsinn nicht funktionieren.

Ich arbeite mit Dreamweaver, bislang ausschließlich mit html. Hab für die Hauptmenüs "Templates" in denen alle Parameter (Layout, Navigation etc.) einheitlich hinterlegt sind. Wenn ich dann eine Unterseite (erstellt aus dem Template) in php umwandel, ändert sich ja an den Grundeinstellungen vom Layout nichts - also bleibt oben die Zeile ja immer erhalten: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Ich hab mich mal gespielt und die meta-Zeile gelöscht und bei $mail = htmlentities($_POST['mail']); hinten utf-8 ergänzt. Aber auch das half nichts - kamen weiterhin keine Umlaute an und zudem lauter Fehlermeldungen, dass er die entities nicht kennt.

Hab dann eine Test-Seite erstellt, um meine Einstellungen zu erfahren. Ist ja furchtbar lang, hau jetzt einfach mal ein paar Infos rein:
-> PHP Version 5.3.8
-> Configure Command: cscript /nologo configure.js "--enable-snapshot-build" "--disable-isapi" "--enable-debug-pack" "--disable-isapi" "--without-mssql" "--without-pdo-mssql" "--without-pi3web" "--with-pdo-oci=D:\php-sdk\oracle\instantclient10\sdk,shared" "--with-oci8=D:\php-sdk\oracle\instantclient10\sdk,shared" "--with-oci8-11g=D:\php-sdk\oracle\instantclient11\sdk,shared" "--enable-object-out-dir=../obj/" "--enable-com-dotnet" "--with-mcrypt=static" "--disable-static-analyze"
-> Server API: Apache 2.0 Handler
-> Registered Stream Filters: convert.iconv.*, mcrypt.*, mdecrypt.*, string.rot13, string.toupper, string.tolower, string.strip_tags, convert.*, consumed, dechunk, zlib.*, bzip2.*.
-> HTTP_ACCEPT_ENCODING: gzip, deflate
-> REQUEST_METHOD: GET
-> QUERY_STRING: no value
Tipp: wenn Du den Zeichensatz durchziehst, also von den Dateien über die Ausgabe der Webseiten im Browser bis hin zu E-Mails, dann brauchst Du diese Ersetzungen überhaupt nicht vornehmen. Dann reicht ein einfaches htmlspecialchars() um unbequemen HTML-Code aus den Eingabefeldern zu kodieren - mehr nicht.
Wie soll ich das denn umsetzen? Den meta-Code in den Templates entfernen und gegen einen anderen ersetzen? Eine reine php-Seite erstellen und includen? Bislang steht der php-Code im bearbeitbaren Bereich, davor und danach ist der html-Code aus den Templates.

Wenn schon im Script, mach dir bei solchen Aufgaben eine Funktion, die die Ersetzung vornimmt, dann ersparst du dir das mehrfache Wiederholen deiner Ersetzung.

Eure Antworten hören sich so an, als ob diese Vorgehensweise nicht üblich ist. Demnach scheint dieser Code hier:
$mail = htmlentities($_POST['mail']);
$betreff = htmlentities($_POST['betreff']);
$nachricht = htmlentities($_POST['nachricht']);
$von = htmlentities($_POST['von']);
wohl der sinnvollste zu sein, wird aber auch nicht erkannt bzw. umgesetzt.

Hier mal der Link zu dem genannten Kontaktformular (ist ziemlich einfach, derjenige der das Formular ausfüllt, bekommt keine Bestätigungsmail): Birgit´s Allerlei - Reiseberichte Schiffsberichte und Testberichte, Kontakt

Schon mal Danke für Eure Hilfe
LG Birgit
 
Zuletzt bearbeitet:
Ich muss dir das aus meinen Scripte leider etwas zusammenfrickeln, ich hoffe, ich vergesse nichts.

Mailaufbau sieht ca so aus:
PHP:
<?PHP
session_start();

$send_html = 0; // 1=Mail als html senden 0=als Text senden
$utf8decode = 1; // 1=content durch utf8_decode jagen 0=kein utf8_decode

/*
    nicht html-text nach belieben anpassen und ändern für dich nur \r\n durch <br> ersetzen
*/
function nlbr($text)
{
   return str_replace("\r\n", "<br>", $text);
}

/*
   html-texte (z.B. aus tiny) anpassen brakes, absatz etc in \r\n umwandeln
   und was du sonst noch brauchst und reinen text daraus machen
*/
function br_to_nl($text)
{
   $text = str_replace("<br>", "\r\n", $text);
   $text = str_replace("<br />", "\r\n", $text);
   $text = str_replace("<p>", "\r\n", $text);
   return $text;
}

// Umbrüche und Sonderzeichen entfernen, eventuelle gewünschte eigene Änderungen vornehmen
function clean($text)
{
   $text = str_replace("\r", "", $text);
   $text = str_replace("\n", "", $text);
   return $text;
}

//betreff, an, und von von unnützem Zeug befreien.
$subject = clean($_POST['subject']); // Betreff
$an = clean($_POST['mailadr']);
$von = clean($_POST['mailfrom']);

$mail_content = $_POST['mail_content'];

$mail_header = "From: <".$von.">";

if($utf8decode == 1)
{
   $mail_content = utf8_decode($mail_content);
}


// HTML-Mail senden
if($send_html == 1)
{
   $content_type_s = "text/html charset=utf-8";
   $mail_content = nlbr($mail_content);
   $mail_content = "<HTML>\n<BODY>\n".$mail_content."</BODY>\n</HTML>\n";
}

// textmail senden
else
{
   $content_type_s = "text/plain";
   $mail_content = br_to_nl($mail_content);
   $mail_content = strip_tags($mail_content);
}

$mail_header .= "\nContent-type: ".$content_type_s;
$mail_header .= "\nContent-Transfer-Encoding: 8bit";
$mail_header .= "\n\n".$mail_content;

if(mail($an,$subject,"",$mail_header))
{
   echo "Mailversandt hat geklappt";
}
else
{
   echo " Fehler beim Mailversandt";
}
?>

Aus deinen Mailformular müssen utf-8 kodierte Inhalte kommen, dein Formular muss also einen ordentlichen header haben und utf-8 kodiert sein.
Übergibst du aus deinem Formular die Felder

$_POST['subject'] = Btreff
$_POST['amiladr'] = an
$_POST['mailfrom'] = von
$_POST['mail_content'] = Text

kannst du das Script eigentlich sofort verwenden und nach deinen Bedürfnissen anpassen. Du musst noch einge Sicherheitschecks machen, aber es klappt erst mal.
 
Zuletzt bearbeitet von einem Moderator:
Ich arbeite mit Dreamweaver, bislang ausschließlich mit html. Hab für die Hauptmenüs "Templates" in denen alle Parameter (Layout, Navigation etc.) einheitlich hinterlegt sind. Wenn ich dann eine Unterseite (erstellt aus dem Template) in php umwandel, ändert sich ja an den Grundeinstellungen vom Layout nichts - also bleibt oben die Zeile ja immer erhalten: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Der Zeichensatz einer Datei hat nichts mit der meta-Angabe für den Charset zu tun. Den Zeichensatz konfiguriert man in den Eigenschaften der Datei. Wie und wo das bei Dreamweaver geht, weiß ich nicht da ich dieses Programm nicht verwende. Bei Notepad++ kann man das z.B. bei jeder Datei separat einstellen.

Da Du diese Einstellung nicht kennst und dir nicht bewusst ist, dass sie wichtig ist, wird dir auch jegliches "Zaubern" mit htmlentities nichts bringen.
 
Na toll - alles gelöscht, also von vorne :(

Danke für Deine Mühe sysop, nur funktioniert es leider nicht. Liegt wohl daran, dass ich andere Namen verwende (von, mail, betreff und nachricht). Wo muss ich sie gegen Deine Namen ersetzen?

Was bedeutet mail_content? Muss ich auch hier was ersetzen?

Auch wenn ich Deine Anleitung Stück für Stück einfüge, mit meinem Code für den Mail-Versand, bleiben die Umlaute leider weg.

Wo gebe ich den Empfänger ein, sprich meine email-adresse? Sobald ich mein if($_POST['von']!="" ... rauslösche, wird keine Mail mehr versandt.

$_POST['subject'] = Betreff
$_POST['amiladr'] = an
$_POST['mailfrom'] = von
$_POST['mail_content'] = Text

Muss ich hier auch eine Anpassung der Namen vornehmen? Namen wie amiladr oder mailfrom oder mail_content, kommen bei mir ja nirgends vor. Einfügen würde ich es gleich nach <?PHP

Für Euch wahrscheinlich ganz banale Fragen, aber für mich noch Neuland.

Ich möchte mich erst an weiteren Sachen probieren, wenn ich diese einfache Sache eines Kontaktformulars voll erfasst und umgesetzt habe.


@threadi,
Der Zeichensatz einer Datei hat nichts mit der meta-Angabe für den Charset zu tun. Den Zeichensatz konfiguriert man in den Eigenschaften der Datei. Wie und wo das bei Dreamweaver geht, weiß ich nicht da ich dieses Programm nicht verwende. Bei Notepad++ kann man das z.B. bei jeder Datei separat einstellen.

Bin meine Templates-Datei durchgegangen. Es gibt im head-Bereich die meta-Daten, css-Angaben, function MM..-Angaben etc. (ist ja über den Quelltext ersichtlich). Weitere Dateien gibt es nicht, die ich durchsuchen könnte, also gehe ich davon aus, dass es keinen vordefinierten Zeichensatz gibt.
 
Doch, jede Datei hat einen Zeichensatz. Den "siehst" Du natürlich nicht im Quellcode. Wie gesagt muss er in dem Editor den man für die Bearbeitung verwendet eingestellt werden.

Und auch wenn ich Dreamweaver nicht verwende, habe ich auch für dieses Programm nach 10 Sekunden Suche eine Möglichkeit gefunden wie man den Zeichensatz der Dateien einstellen kann: How to change Character set - Macromedia Dreamweaver
 
Du musst ja irgendwo ein Formular erstellt haben, wo man die Inhalte des Mails eingibt oder es müssen irgendwo die wesentlichen Informationen für ein Mail herkommen. Jedes Mail hat zumindest die 4 Inhalte, Mailadresse, Absender, Betreff und Mailinhalt. Diese Informationen übergibst du an das eigentliche Mailscript (mein Bsp. oben). Wie diese Felder bei dir heissen, weiss ich nicht, ich sehe dein Formular nicht.

PHP:
$subject = clean($_POST['subject']); // Betreff
$an = clean($_POST['mailadr']);
$von = clean($_POST['mailfrom']);
$mail_content = $_POST['mail_content'];
entsprechen hier deinen Variablen aus dem ersten Codebeispiel.
PHP:
$subject = clean($betreff);
$an = clean($mail);
$von = clean($von);
$mail_content = clean($nachricht);
Das war's.
 
Zurück
Oben