Zur Navigation

Kontaktformular: Fehleingabe==>Felder rot & Daten erhalten?!

idiotensicheres Kontaktformular

1 mibu

Hallo zusammen,

ich habe ein Kontaktformular (email, message,...) in HTML erstellt und mit einen mailform (PHP-script) verlinkt. Funktioniert soweit. Aber ich würde es gerne optisch verbessern.

(1) Bei Fehleingabe möchte ich zurück zum Formular und die bisher eingegeben Daten sollen angezeigt werden.
(2) Die fehlerhaften Eingabefelder sollen rot unterlegt werden.

Kann mir einer einen möglichst konkreten Tipp geben. Da ich nicht besonders fitt in WEB-Programmierung bin, wäre ich für Beispiele besonders dankbar.

Gruss und vorab vielen Dank

mibu

01.06.2008 20:06

2 Jörg Kruse

Hallo mibu,

(1) Bei Fehleingabe möchte ich zurück zum Formular und die bisher eingegeben Daten sollen angezeigt werden.

So etwas wird auch Affenformular genannt - ein Beispiel in PHP ist hier beschrieben:

http://www.php-faq.de/q/q-stil-normalform.html

(2) Die fehlerhaften Eingabefelder sollen rot unterlegt werden.

Das könnte mit einer CSS-Klasse realisiert werden. Bei einer fehlerhaften Eingabe erhält das Eingabefeld z.B. solch ein Klassen-Attribut.

if (!isset($_POST['bla'])) {
    $fehler = 'class="fehler"';
} else {
    $fehler = '';
}

<input type="text" name="bla" value="<?php echo $_POST['bla'] ?>">" <?php echo $fehler ?> / >

Die betreffende Klasse kann dann zentral in der CSS-Datei definiert werden

.fehler {
background-color:red;
}

01.06.2008 20:37

3 mibu

Hallo Jörg,

Dein Vorschlag war prima. Das Ganze hat soweit geklappt. Jetzt stellt sich aber ein neues Problem.

(1) Das Formular soll nur im Fehlerfall erneut aufgerufen werden.
(2) Ist alles OK, sollen die Daten per Email verschickt werden. Das habe ich bisher mittels formmailer gemacht.

Weisst Du, welche Änderungen ich dazu machen muss? Im Moment ruft sich die Seite auch im OK-Fall selber auf.

Gruss und vorab vielen Dank

mibu

04.06.2008 16:22

4 Jörg Kruse

(1) Das Formular soll nur im Fehlerfall erneut aufgerufen werden.

Du hast das von mir verlinkte Beispiel-Script von Kristian Köhntopp verwendet? In dem Fall kannst du die letzte Bedingung durch einen else Abschnitt erweitern und das Formular dorthinein verschieben

<?php if ($valid and isset($_REQUEST["do_form_x"])) { ?>
<!-- Nutzlast -->
<?php } else { ?>
<!-- hier das Formular hinein -->
<?php } ?>

(2) Ist alles OK, sollen die Daten per Email verschickt werden. Das habe ich bisher mittels formmailer gemacht.

In dem if Abschnitt der letzten Bedingung kannst du die Email versenden

<?php if ($valid and isset($_REQUEST["do_form_x"])) {
/* Versenden der Email */
 ?>
<!-- Nutzlast -->
<?php } else { ?>
<!-- hier das Formular hinein -->
<?php } ?>

Dazu überträgst du in diesen Abschnitt die entsprechenden Code-Abschnitte des Formmailers. Gegebenfalls könnstest du letzteren auch einfach dorthin inkludieren (ausprobieren, ob dies so funktioniert)

<?php if ($valid and isset($_REQUEST["do_form_x"])) {
include("formmailer.php");
 ?>
<?php } else { ?>
<!-- hier das Formular hinein -->
<?php } ?>

PS: du solltest auf jeden Fall auch noch sicherstellen, dass der Formmailer gegen E-Mail-Injektion gesichert ist

04.06.2008 17:17

5 mibu

Hallo Jörg,

dank Deiner Hilfe wird's immer besser. Sieht wirklich gut aus. Mein hoffentlich letztes Problem ist die Weiterleitung nach erfolgreicher Email-Übertragung an eine andere Site.

Das Ganze klappt weder mit:
...
mail($recipient,$_POST["subject"], $fmtMail);
header('Location: http://'.getenv('HTTP_HOST').'/ge/MainPage.htm');
...

noch mit:
header("Location: http://www.MyWeb.de/ge/MainPage.htm");

Bringe ich den header("Location... zu Beginn des Skrips werde ich zwar weitergeleitet, aber der Rest läuft nicht ab.

Hast Du noch einen Tipp für mich?

Gruß und vielen Dank

mibu

04.06.2008 19:00

6 Jörg Kruse

Eine Header-Weiterleitung funktioniert nur, wenn vorher noch kein HTML ausgegeben wurde. Am besten verschiebst du die HTML-Abschnitte vor und hinter dem Formular komplett in den else Abschnitt, z.B.:

<?php 
if ($valid and isset($_REQUEST["do_form_x"])) {
    mail($recipient,$_POST["subject"], $fmtMail);
    header('Location: http://'.getenv('HTTP_HOST').'/ge/MainPage.htm');
} else { 
    ?>
<!-- Anfang des HTML-Dokuments -->

<!-- hier das Formular hinein -->

<!-- Ende des HTML-Dokuments -->
<?php
}
?>

04.06.2008 19:20

7 mibu

Hallo Jörg,

das mit der header-Weiterleitung hat leider nicht geklappt. So wie ich es sehe habe ich den php-Code sauber im if-Zweig und den HTML-Code sauber im else-Zweig. Kann das Nichtfunktionieren eventuell daran liegen, das die Site zunächst in HTML dargestellt wird, sich dann selber aufruft aber ja zuvor HTML dargestellt wurde?

Wie auch immer. Ich habe in Java-Script folgende Möglichkeit gefunden.

Anstelle von

header('Location: http://'.getenv ('HTTP_HOST').'/ge/MainPage.htm');

verwende ich

echo '<script type="text/javascript">
<!--
document.location.href = "ge/MainPage.htm";
-->
</script>';

Damit klappts. Ist zwar etwas heterogen aber geht. Hast Du noch eine Idee? Ansonsten kann ich prima damit leben. Du hast mir wirlich sehr geholfen.

Gruß

mibu

05.06.2008 16:39

8 Jörg Kruse

Kann das Nichtfunktionieren eventuell daran liegen, das die Site zunächst in HTML dargestellt wird, sich dann selber aufruft aber ja zuvor HTML dargestellt wurde?

Inwiefern ruft die Seite sich selbst auf?

Du musst nur gewährleisten, dass am Anfang eines einzelnen Scriptaufrufes zuerst der HTTP-Header mit der Weiterleitung gesendet wird. Auch eine leere Zeile am Anfang des Scriptes außerhalb des PHP-Abschnittes (d.h. vor dem ersten "<?php") kann die Header-Weiterleitung bereits verhindern

Aber vielleicht zeigst du den Code als ganzes, dann kann man den Fehler leichter ausmachen

Die JavaScript-Weiterleitung hat den Nachteil, dass JavaScript-Muffel auf der leeren Seite hängen bleiben

Besser wäre da noch eine Weiterleitung per Meta-Refresh:

<meta http-equiv="refresh" content="1; URL=http://www.MyWeb.de/ge/MainPage.htm" />

05.06.2008 17:07 | geändert: 05.06.2008 17:08

9 mibu

Hallo Jörg,

Dein Tipp mit der Leerzeile war es. Ich hatte ursprünglich die Funktionen in einen php-Block und den Restcode in einen zweiten php-Block gepackt. Ich hielt das für übersichtlicher. Dazwischen war eine Leerzeile. Die beiden Blocks habe ich nun zusammengeführt und siehe da, es läuft perfekt. Alles prima. Nochmals vielen Dank. Ich bin happy.

Gruß

mibu

05.06.2008 22:28

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]