[GELÖST] Kontaktformular funktioniert nicht

Hallo,

ich habe seit einigen Tagen Probleme mit meinem Kontaktformular.
Ich habe gelesen dass auf bplaced der Dienst Emails zu versenden gewährt ist.
Auch dass die Funktion “mail” funktioniert.
Habe die Datei auch formmail.php genannt, alles kein Erfolg.
Habe es nun so ähnlich wie aus einem anderen Thread gemacht.

----formmail.php—
Hier nun der Code:

[code]<?php
error_reporting(-1);
ini_set(‘display_errors’, true);

$name = $_POST[‘name’];
$email = $_POST[‘email’];
$betreff = $_POST[‘betreff’];
$text = $_POST[‘text’];
$strasse = $_POST[‘strasse’];
$plz = $_POST[‘plz’];
$ort = $_POST[‘ort’];
$land = $_POST[‘land’];
$handy = $_POST[‘handy’];
$fax = $_POST[‘fax’];

$nl = "\r\n";
$dnl = "\r\n\r\n";

$nachricht = "Name: $name $nl";
$nachricht .= "Email: $email $nl";
$nachricht .= "Betreff: $betreff $nl";
$nachricht .= "Text: $text $nl";
$nachricht .= "Straße: $strasse $nl";
$nachricht .= "PLZ: $plz $nl";
$nachricht .= "Ort: $ort $nl";
$nachricht .= "Land: $land $dnl";
$nachricht .= "Handy: $handy";
$nachricht .= "Fax: $fax";

$zieladresse = '';   // rausgenommen aus sicherheitsgründen
$betreff = 'Kontaktformular';

mail($zieladresse, $betreff, $nachricht, ‘From:’ . $email); //Mail versenden

?>

usw…
[/code]

Eine weitere Frage:
Warum funktioniert es nicht im formmail.php ein Array zu erstellen wie unten angegeben:
$nachricht = array(
$name,
$email,
$betreff,
);

Wenn ich es so mache wird der code nach dem array im Content meiner Homepage ausgegeben.

MfG,
Danny77.

Name (*):
Wenn das Formular nicht auf die php Datei abgesendet wird, die es auswerten soll (in dem Fall wohl die Datei in der auch das Formular notiert ist, also formmail.php), kann da auch nicht viel passieren.

Zum Array: Hast du den Code denn innerhalb von <?php und ?> platziert?

Wenn das Formular nicht auf die php Datei abgesendet wird, die es auswerten soll (in dem Fall wohl die Datei in der auch das Formular notiert ist, also formmail.php), kann da auch nicht viel passieren.

Zum Array: Hast du den Code denn innerhalb von <?php und ?> platziert?

[quote=“heavygale”]<form action="index.php?site=kontaktformular-danke" method="post">
Wenn das Formular nicht auf die php Datei abgesendet wird, die es auswerten soll (in dem Fall wohl die Datei in der auch das Formular notiert ist, also formmail.php), kann da auch nicht viel passieren.

Zum Array: Hast du den Code denn innerhalb von <?php und ?> platziert?[/quote]

Hallo heavygale :wink: ,

danke für die Rückmeldung.

Ich habe nun die action=“index.php?site=kontaktformular-danke” mit action=“index.php?site=formmail” ausgetauscht, aber es funktioniert immer noch nicht.

Ja des Array habe ich innerhalb <?php und ?> gesetzt.

MfG,
Danny77.

“funktioniert nicht” macht es nicht leicht, das Problem zu erraten.
Wenn du die Datei in einem Ordner hast, also nicht im Wurzelverzeichnis deiner Webseite, dann musst du die Ordnerstruktur in der URL mit berücksichtigen.
Schreibe doch einmal den Link, damit wir das “funktioniert nicht” auch selbst anschauen können.

[quote=“heavygale”]“funktioniert nicht” macht es nicht leicht, das Problem zu erraten.
Wenn du die Datei in einem Ordner hast, also nicht im Wurzelverzeichnis deiner Webseite, dann musst du die Ordnerstruktur in der URL mit berücksichtigen.
Schreibe doch einmal den Link, damit wir das “funktioniert nicht” auch selbst anschauen können.[/quote]

Hallo heavygale,

danke für die Rückmeldung.
Die Formmail Datei liegt im Wurzelverzeichnis.

Der gesamte PHP Teil ist oben beschrieben.

MfG,
Danny77.

bindet die index.php die formmail.php ein?
Ein blick in den Seitenquelltext der Seite (Mit dem Browser), verrät mir, dass du die PHP datei irgendwie nicht korrekt eingebunden hast. Der PHP Code sollte normal niemals im Browser sichtbar sein. Auch nicht im Seitenquelltext.

Können wir vllt mal die index.php sehen?

[quote=“Balmung”]bindet die index.php die formmail.php ein?
Ein blick in den Seitenquelltext der Seite (Mit dem Browser), verrät mir, dass du die PHP datei irgendwie nicht korrekt eingebunden hast. Der PHP Code sollte normal niemals im Browser sichtbar sein. Auch nicht im Seitenquelltext.

Können wir vllt mal die index.php sehen?[/quote]

Hallo Balmung,

die gesamte Formmail wird mit einer Whitelist eingebunden.

Wo kannst du denn php Code sehen ?

Index.php zum downloaden als txt Datei:
http://www.file-upload.net/download-9246320/index.txt.html

Formmail:
http://www.file-upload.net/download-9246335/formmail.txt.html

Edit:
Ach ja tatsächlich. Der PHP Teil in der Formmail.php wird immer angezeigt.
MfG,
Danny77.

Für solche Dinge kannst du eine der vielen Pastebin Seiten nutzen, z.B. bpaste.net/
Oder einfach hier im Forum den code-tag.

An der index.php erkenne ich jetzt nichts auffälliges, also vermute ich mal, dass es an der whitelist.php liegt.

Ich will nicht wirklich rumraten.

Warum zeigst du nicht den Code, der die formmail.php tatsächlich einbindet?

[quote=“Balmung”]Für solche Dinge kannst du eine der vielen Pastebin Seiten nutzen, z.B. bpaste.net/
Oder einfach hier im Forum den code-tag.

An der index.php erkenne ich jetzt nichts auffälliges, also vermute ich mal, dass es an der whitelist.php liegt.

Ich will nicht wirklich rumraten.

Warum zeigst du nicht den Code, der die formmail.php tatsächlich einbindet?[/quote]

Hallo Balmung,

danke für die Rückmeldung.

Tut mir Leid dass ich die Whitelist nicht gleich angehängt habe, dachte mir dass es gar nicht möglich wäre ein Fehler dort zu finden wenn der Formmailer schon eingebunden ist.

Hier der Code für die Whitelist:
http://www.file-upload.net/download-9246747/whitelist.txt.html

MfG,
Danny77.

if(in_array($site, $whitelist)&& file_exists('seiten/'.$site.'.php')) { readfile('seiten/'.$site.'.php'); } else { if(in_array($site, $whitelist)&& file_exists($site.'.php')) { readfile($site.'.php'); } else { readfile("seiten/error404.php"); } }

Da liegt schon mal ein Problem.

readfile() macht etwas ganz anderes als include() (bzw. require())

Um es kurz zu sagen: readfile() liest den Inhalt der Datei ein und gibt es einfach an den Browser weiter, ohne dass eventuell vorhandene PHP Blöcke ausgeführt werden. Möchtest du, dass PHP Code ausgeführt wird, nutze include().

Von der Kleinigkeit mal abgesehen, gibt es noch eine ganze Menge Probleme mit deinen bisherigen Scripten, über die man reden könnte. :slight_smile:

mfg Balmung

[quote=“Balmung”] if(in_array($site, $whitelist)&& file_exists('seiten/'.$site.'.php')) { readfile('seiten/'.$site.'.php'); } else { if(in_array($site, $whitelist)&& file_exists($site.'.php')) { readfile($site.'.php'); } else { readfile("seiten/error404.php"); } }

Da liegt schon mal ein Problem.

readfile() macht etwas ganz anderes als include() (bzw. require())

Um es kurz zu sagen: readfile() liest den Inhalt der Datei ein und gibt es einfach an den Browser weiter, ohne dass eventuell vorhandene PHP Blöcke ausgeführt werden. Möchtest du, dass PHP Code ausgeführt wird, nutze include().

Von der Kleinigkeit mal abgesehen, gibt es noch eine ganze Menge Probleme mit deinen bisherigen Scripten, über die man reden könnte. :slight_smile:

mfg Balmung[/quote]

Hallo Balmung,

vielen Dank!
Nun funktioniert es wie gewollt.

Welchen Nachteil hätte ich wenn ich alle Textseiten mit “include” einfügen würde?
//Ich weiß nicht in welchen Textseiten noch PHP Scripte enthalten sind.

Bitte teile mir eventuell über PN mit, welche Probleme du meinst.
Bin erst Neuling in diesem Gebiet. Vor allem PHP, MYSQL programmiere ich erst seit 1-2 Monaten.

Edit: Ich habe noch ein Problem mit der Weiterleitung nach erfolgreichen Senden der Email.
Fehlermeldung: Cannot modify header information - headers already sent by…

http://bpaste.net/show/5xzd0SEK9RrI7aR1k2QF/

Fehler ist auf Zeile 43.

MfG,
Danny77.

[quote=“danny77”]Welchen Nachteil hätte ich wenn ich alle Textseiten mit “include” einfügen würde?
//Ich weiß nicht in welchen Textseiten noch PHP Scripte enthalten sind.[/quote]

include() führt PHP Code aus. Wenn du den Seiten vertraust (d.h. wenn es nur von dir erstellte Seiten sind und nichts vom Benutzer generiertes oder ähnliches), dann sollte es keine Bedenken geben.

[quote=“danny77”]Edit: Ich habe noch ein Problem mit der Weiterleitung nach erfolgreichen Senden der Email.
Fehlermeldung: Cannot modify header information - headers already sent by…[/quote]

Es ist nicht möglich den HTTP Header mit dem header() Befehl zu ändern, wenn du bereits die Ausgabe (HTML Code und ähnliches) gestartet hast.

Um zu verstehen warum das so ist, musst du dich wohl mit HTTP allgemein ein bisschen auseinander setzen.

Das ist übrigens ein sehr üblicher Fehler.

…und auch eines der Probleme, auf die ich aufmerksam gemacht hätte. Wegen der Struktur deiner Seite wirst du nämlich früher oder später auf solche Probleme stoßen.

mfg Balmung

Hallo Balmung,

danke für die Rückmeldung.

Gut dann werde ich auch für die restlichen Seiten “include” anstatt “readfile” nehmen, wenn es sonst keinen Nachteil gibt.

[quote=“Balmung”]

Es ist nicht möglich den HTTP Header mit dem header() Befehl zu ändern, wenn du bereits die Ausgabe (HTML Code und ähnliches) gestartet hast.

Um zu verstehen warum das so ist, musst du dich wohl mit HTTP allgemein ein bisschen auseinander setzen.

Das ist übrigens ein sehr üblicher Fehler.

…und auch eines der Probleme, auf die ich aufmerksam gemacht hätte. Wegen der Struktur deiner Seite wirst du nämlich früher oder später auf solche Probleme stoßen.

mfg Balmung[/quote]

Könntest du vielleicht genauer werden welche Probleme du meinst ?
Hast du vielleicht dazu einige Seiten die ich mir ansehen könnte um meine Struktur zu verbessern ? Oder eine Beispiel Code wo ich vergleichen könnte ?

Edit:
Gäbe es keine andere Möglichkeit eine Weiterleitung zu machen.

MfG,
Danny77.

Naja, dein Grundproblem ist, dass du Ausgabe und Verarbeitung miteinander vermischst.
Diese sollte man strikt voneinander trennen. In der Regel arbeitet man da nach dem EVA Prinzip: Eingabe -> Verarbeitung -> Ausgabe.

Im Falle von PHP ist alles, was außerhalb der <?php ... ?> Blöcke ist, eine Ausgabe, d.h. der gesamte HTML code und auch alle Leerfelder/Leerzeilen außerhalb der PHP Blöcke sind Ausgaben. Und Ausgaben mit echo/print/printf etc. sind natürlich auch Ausgaben.

Wenn wir uns deine index.php anschauen, sehen wir, dass du gleich mit dem folgendem beginnst:

Dies ist eine Ausgabe. Und etwas später kommt dein erster PHP-Block, bei dem du mit der Verarbeitung beginnst. D.h. du hast Ausgabe vor der Verarbeitung. Dann hast du danach noch mehr Ausgaben und in dann wird die whitelist.php geladen, welche mit weiteren Verarbeitungen kommt.

Üblicherweise hat man als PHP Entwickler ganz zu beginn der Datei einen PHP Block. Das schaut dann grob meist so aus:

[code]<?php

// Verarbeitung hier

$pageTitle = ‘hello world’;

// ab hier startet die erste Ausgabe.
?>

<?php echo htmlspecialchars($pageTitle) ?> …[/code]

Dabei erstellt man im Verarbeitungsbereich in der Regel einen Satz von Ausgabedaten, die in Arrays/Hashmaps zwischengespeichert werden, und dann im Ausgabe Bereich mit einfachen PHP Befehlen (echo, for, if, while, etc.) ausgegeben werden können.

Idealerweise trennt man die Verarbeitung und Ausgabe in separate Dateien. Das kommt dem Konzept der “Templates” schon recht nahe.

Jede Verarbeitungs-Datei hat dann nur einen einzigen großen <?php … ?> Block, und keine einzige Ausgabe. Die index.php wäre dann dafür zuständig, anhand des (in deinem Fall) site-Parameters eine entsprechende “unter-” Verarbeitungs-Datei zu laden, diese hat ebenfalls nur einen einzigen <?php … ?> Block. In der index.php und der eingebundenen Datei(en), könnte man in einem einheitlichen Array Ausgabedaten sammeln (nennen wir das einfach mal $template).

Dieses $template, welches zum Ende hin mit allen möglichen Daten gefüllt ist, kann jetzt an eine “Template” Datei weitergereicht werden (diese packt man häufig in ein Unterverzeichnis “templates”, oder ähnlich). “Weiterreichen” heißt hier, dass zu einem Zeitpunkt der Verarbeitung (z.b. von einem der Unter-Seiten) entschieden wurde, welches “Template” benötigt wurde. Und dieses wird dann einfach mit include o.ä. eingebunden.

Eine minimale Struktur wie sowas aussehen könnte ist hier:

index.php Beispiel:
bpaste.net/show/kurq05ngUf4sBsqKFKME/

sites/formmail.php Beispiel:
bpaste.net/show/jE3u8aGFHCVlF4aM2WLG/

templates/main_header.php Beispiel:
bpaste.net/show/BdcJiP9lu9Q9cwek1tkk/

templates/main_footer.php Beispiel:
bpaste.net/show/mRN48tA8lWHCy73dK31Z/

Die “templates/formmail_formular.php” wird dann zwischen main_header und main_footer eingebunden. Dort fügst du dann das HTML für das Formular ein.

Die main_header.php kannst du natürlich auch um die Navigation und den ganzen Schnickschnack um den “Mittelteil” der Seiten herum erweitern.

Das ganze ist ein sehr grober entwurf, der nur aufzeigen soll, wie man die Ausgabe “nach hinten” verlagert. Es gibt sicher eine paar Dinge zu kritisieren (z.B. sollte man die Verwendung von “global” in Funktionen generell vermeiden - hier schien es mir aber vernünftig - wobei man in so einem Fall eher schon Objektorientierter arbeiten würde).

Der ganze Code ist übrigens absolut ungetestet. Fehler können (und werden wahrscheinlich auch) auftreten.

Ich hoffe ich konnte dir ein bisschen helfen :slight_smile:

mfg Balmung

Edit: ich bin viel zu nett

Hallo Balmung,

vielen vielen Dank :slight_smile: .

[quote=„Balmung“]
Edit: ich bin viel zu nett[/quote]

Das stimmt wohl, habe lange nicht mehr eine solch ausführliche Antwort in einem Forum bekommen.

Jetzt habe ich verstanden was du gemeint hast.
Da werde ich mich noch ein wenig einarbeiten und gleich damit anfangen meine index.php auf zuräumen :p .

MfG,
Danny77.