max: kantakt-formular

hallo,
habe mir folgendes Kontakt-Formular erstellt:
PHP Code:

<html>

<head>
<title>Kontakt-Formular</title>
<style type="text/css">
<!--
input,textarea { border: 1px solid black }
-->
</style>
<?php
function formmailer($gesendet,$n_name,$email,$nachricht)
{

if(trim($n_name)=="") $error_text .= 'Bitte Namen eingeben!<br>';
    if(trim($email)=="") $error_text .= 'Bitte E-Mail-Adresse eingeben!<br>';
    else if(!ereg("[1]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,6})$",$email))
          $error_text .= 'Bitte gültige E-Mail-Adresse eingeben!<br>';
    if(trim($nachricht)=="") $error_text .= 'Bitte Nachricht eingeben!';
    if(isset($error_text))
    {
        echo 'Fehler:<p>';
        echo $error_text;
    }
    else
    {
        $mail_to = "torsten-zindel@gmx.de";
        $mailnachricht .= "von $n_name:\n\n";
        $mailnachricht .= $nachricht;
        mail($mail_to, $betreff, $mailnachricht, "From: $email");
        echo '<div class="text">Nachricht wurde erfolgreich gesendet!</div>';
    }
}
?>
</head>

<body>
<h1>Kontakt-Formular</h1>
Die mit <span style="color:#FF0000">*</span> gekennzeichneten Felder müssen ausgefüllt sein!<p>
<form action="kontakt.php" method="post" style="margin-top:0px">
<table>
  <tr>
    <td>Name:<span style="color:#FF0000">*</span></td>
    <td><input name="n_name" size="33" maxlength="30"></td>
  </tr>
  <tr>
    <td>Vorname:</td>
    <td><input name="v_name" size="33" maxlength="30"></td>
  </tr>
  <tr>
    <td>eMail-Adresse:<span style="color:#FF0000">*</span></td>
    <td><input name="email" size="33" maxlength="30"></td>
  </tr>
  <tr>
    <td>Betreff:</td>
    <td><select name="betreff"><option value="Allgemeines">Allgemeines</option></select></td>
  </tr>
  <tr>
    <td>Ihr Anliegen:<span style="color:#FF0000">*</span></td>
    <td><textarea name="nachricht" cols="40" rows="10"></textarea></td>
  </tr>
  <tr>
    <td></td>
    <td><input type="submit" value="Absenden" name="gesendet"> <input type="reset" value="Löschen"></td>
  </tr>
  <tr>
    <td></td>
    <td><?php
    if (isset($gesendet))
    {
        formmailer($gesendet,$n_name,$email,$nachricht);
    }
    ?></td>
  </tr>
</table>
</form>
</body>

</html>

für die realisierung sollten folgende punkte gewehrleistet sein:
das Kontakt-Formular soll nur aus einer datei bestehen(kontakt.php),
das eigentlich php-programm soll über eine funktion aufgerufen werden.

jetzt entstand dadurch allerdings ein unschönes problem, wenn der besucher, z.b. den namen vergessen hat einzugeben, erscheint zunächst eine fehlermeldung. zugleich verschwindet aber auch die nachricht die er zuvor eingegeben hat. das sollte aber nicht so sein. ich verstehe nicht wo der fehler liegt. da ich nicht soviel erfahrung mit php und der programmierung habe, würde ich mich freuen wenn mir da jemand einen tipp geben könnte wie man so etwas professionell lösen könnte. meine oben genannten kriterien sollten allerdings erfüllt bleiben, wenn es irgendwie möglich ist!?

gruß
max


  1. _a-z0-9- ↩︎

  1. Hallo Max!

    jetzt entstand dadurch allerdings ein unschönes problem, wenn der besucher, z.b. den namen vergessen hat einzugeben, erscheint zunächst eine fehlermeldung. zugleich verschwindet aber auch die nachricht die er zuvor eingegeben hat. das sollte aber nicht so sein.

    Also, ich hab mir Deinen ganzen Code nicht durchgelesen, aber grundsätzlich würde ich das wie folgt machen:
    Bei den Formularfeldern grundsätzlich prüfen, ob z.B. $_GET['name']/$_POST['name'] gesetzt ist, und wenn ja es mit diesem Wert vorausfüllen.
    Im Fehlerfall würde ich einfach auf das Formular weiterleiten, und dabei per GET die schon gesetzen Variablen übergeben. Fehlermeldungen kannst du ja genauso per GET übergeben und im Formular einfach prüfen, ob die Fehlervariable gesetzt ist, und wenn ja diese ausgeben.

    Ich hoffe, Du hast es einigermaßen verstanden, sonst kann ich vielleicht noch ein wenig Beispielcode dazuschreiben.

    MfG
    Götz

    --
    Losung für Donnerstag, 16. September 2004
    Du bist mein Gott von meiner Mutter Schoß an. (Psalm 22,11)
    Es gefiel Gott wohl, der mich von meiner Mutter Leib an ausgesondert und durch seine Gnade berufen hat, dass er seinen Sohn offenbarte in mir, damit ich ihn durchs Evangelium verkündigen sollte. (Galater 1,15-16)
    (http://www.losungen.de/heute.php3)
    1. hi Götz

      Ich hoffe, Du hast es einigermaßen verstanden, sonst kann ich vielleicht noch ein wenig Beispielcode dazuschreiben.

      etwas beispielcode währe mir sehr recht.

      gruß
      max

      1. Hallo max!

        etwas beispielcode währe mir sehr recht.

        Das meiste, was ich geschrieben hätte wurde inzwischen eh schon gepostet, und bisher gepostetes muß ich ja nicht wiederholen ;) - Also lies einfach in den anderen Antworten nach, da steht eigentlich alles wichtige drin bzw. ist verlinkt.

        MfG
        Götz

        --
        Losung für Donnerstag, 16. September 2004
        Du bist mein Gott von meiner Mutter Schoß an. (Psalm 22,11)
        Es gefiel Gott wohl, der mich von meiner Mutter Leib an ausgesondert und durch seine Gnade berufen hat, dass er seinen Sohn offenbarte in mir, damit ich ihn durchs Evangelium verkündigen sollte. (Galater 1,15-16)
        (http://www.losungen.de/heute.php3)
  2. Hello,

    1.) Eine Funktion sollte keine direkte Bedienung des Ausgabekanals (echo) betreiben,
        sondern einen Rückgabewert erzeugen, der dann an geeigneter Stelle augegeben wird.

    2.) Vorbelegungswerte in <input>-Feldern siehe http://de.selfhtml.org/formulare

    3.) Wahrscheinlich musst Du Werte, die aus dem Formular kommen, erst wieder von Maskierungs-
        Backslashes befreien. siehe
        http://de2.php.net/manual/de/function.get-magic-quotes-gpc.php und
        http://de2.php.net/manual/de/function.stripslashes.php

    4.) für die Wiederausgabe der Variablen aus $_POST musst Du htmlentities() für die input-
        Felder und die Textarea einsetzen.

    Und dann such hier im Archiv mal nach "Affenformular". Da steht der Rest drin, den Du wissen solltest

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Hallo Tom.

      Gerade habe ich geäußert, dass du bestimmt noch in diesem Thread vorbeikommst, da warst du schon da :)

      Freundschaft!
      Siechfred

      --
      Wissen bedeutet zu wissen, wo es steht.
  3. Hallo Max.

    wenn der besucher, z.b. den namen vergessen hat einzugeben, erscheint zunächst eine fehlermeldung. zugleich verschwindet aber auch die nachricht die er zuvor eingegeben hat. das sollte aber nicht so sein.

    Was du willst, nennt man Affenformular. Wenn der Besucher auf 'Absenden' klickt, wird das Script nochmal aufgerufen, diesmal aber mit Parametern. Dies sind die getätigten Eingaben. Diese Parameter holst du dir mit Hilfe von $_POST und fügst sie im Fehlerfall dynamisch in dein Formular ein, z.B. so:

    <input type="text" name="email" value="<?php echo htmlentities(trim($_POST['email'])) ?>">

    Dabei stellen die Funktionen htmlentities() und trim() sicher, dass kein Blödsinn in deinem Formular steht, $_POST['email'] schreibt die im vorhergehenden Formular gemachten Eingaben in das neu aufgerufene Formular. Tom hatte das mal etwas näher ausgeführt, vielleicht liest er das hier und kann dazu noch mehr sagen. Bis dahin empfehle ich als Lektüre http://de2.php.net/manual/de/ (die DCLP-FAQ scheinen momentan nicht erreichbar zu sein).

    Freundschaft!
    Siechfred

    --
    Wissen bedeutet zu wissen, wo es steht.
  4. Moin.

    Dein Textfeld wird ja jedes mal, wenn die Seite angezeigt wird, leer angezeigt, weil Du nichts reinschreibst. Das muß Dein PHP-Script tun, wenn z.B. so ein Fehler aufgetreten ist. Einfachste Variante:

    <textarea name="nachricht" cols="40" rows="10">
    <?php
       if (isset($nachricht))
       {
          echo $nachricht;
       }
    ?>
    </textarea>

    Damit wird natürlich IMMER der letzte Inhalt des Textfeldes wieder eingetragen. Du kannst jetzt die Abfrage so ändern, daß das nur passiert, wenn ein Fehler aufgetreten ist.

    Gruß Frank

  5. Versuch es mal mit dem unten stehenden Quellcode. Wenn ein Besucher vergisst eine Eingabe zu machen, so wird er darauf hingewiesen. Das Script ist voll funktionsfähig es ist in PHP geschrieben darum Mus auf deinen Webserver PHP ab Version 4 laufen. Zudem musst du noch die Zeile <input type=hidden name=ToMail value=e-mail@adresse.de> mit deiner Mail Adresse versehen. Die beiden anderen Zeilen kannst du ändern wie du möchtest es handelt sich dabei um dem Formular titel $body="<html><head><title>Schreiben Sie uns!</title></head>

    <title>Schreiben Sie uns!</title>

    <?php $body="<html><head><title>Schreiben Sie uns!</title></head><body bgcolor=#FFFFFF Link=#FF0080 ALink=#FFFFFF VLink=#400040 >"; if ($_POST[ToMail]=="") {

    echo("<html><head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

    <title>Schreiben Sie uns!</title> </head> <body bgcolor=#FFFFFF Link=#FF0080 ALink=#FFFFFF VLink=#400040 >

    <style type="text/css"> <!-- .PS_2{ top:459px; width:100px; height:30px; border-width:1px; font-size:8pt; border-color:#000000; color:#000000; background-color:#C0C0C0; border-style:solid; font-weight:; font-family:Verdana; cursor:pointer; font-style:;

    } .PC_2{ top:459px; width:100px; height:30px; border-width:1px; font-size:8pt; border-color:#0000FF; color:#0000FF; background-color:#C0C0C0; border-style:solid; font-weight:; font-family:Verdana; cursor:pointer; font-style:;

    } .TED1_2{ top:140px; width:200px; height:22px; border-width:1px; font-size:10pt; border-color:#0000FF; color:#0000FF; background-color:#80FFFF; border-style:solid; font-weight:; font-family:Verdana; cursor:text; font-style:;

    } .TED2_2{ top:180px; width:200px; height:22px; border-width:1px; font-size:10pt; border-color:#0000FF; color:#0000FF; background-color:#80FFFF; border-style:solid; font-weight:; font-family:Verdana; cursor:text; font-style:;

    } .TED3_2{ top:220px; width:200px; height:22px; border-width:1px; font-size:10pt; border-color:#0000FF; color:#0000FF; background-color:#80FFFF; border-style:solid; font-weight:; font-family:Verdana; cursor:text; font-style:;

    } .TME4_2{ top:319px; width:308px; height:128px; border-width:1px; font-size:10pt; border-color:#0000FF; color:#0000FF; background-color:#80FFFF; border-style:solid; font-weight:; font-family:Verdana; cursor:text; font-style:;

    } .TTE5_2{ top:139px; width:80px; height:20px; border-width:0px; font-size:10pt; border-color:#000000; color:#0000A0; background-color:#FFFFFF; border-style:none; font-weight:; font-family:Verdana; cursor:text; font-style:;

    } .TTE6_2{ top:179px; width:80px; height:20px; border-width:0px; font-size:10pt; border-color:#000000; color:#0000A0; background-color:#FFFFFF; border-style:none; font-weight:; font-family:Verdana; cursor:text; font-style:;

    } .TTE7_2{ top:219px; width:90px; height:20px; border-width:0px; font-size:10pt; border-color:#000000; color:#0000A0; background-color:#FFFFFF; border-style:none; font-weight:; font-family:Verdana; cursor:text; font-style:;

    } .TTE8_2{ top:279px; width:100px; height:20px; border-width:0px; font-size:10pt; border-color:#000000; color:#0000A0; background-color:#FFFFFF; border-style:none; font-weight:; font-family:Verdana; cursor:text; font-style:;

    } .TTE9_2{ top:49px; width:310px; height:50px; border-width:0px; font-size:28pt; border-color:#000000; color:#0000A0; background-color:#FFFFFF; border-style:none; font-weight:; font-family:Verdana; cursor:text; font-style:;

    } .TTE10_2{ top:99px; width:520px; height:30px; border-width:0px; font-size:10pt; border-color:#000000; color:#0000A0; background-color:#FFFFFF; border-style:none; font-weight:; font-family:Verdana; cursor:text; font-style:;

    } .TMT11_2{ top:140px; width:170px; height:190px; border-width:0px; font-size:10pt; border-color:#808080; color:#0000A0; background-color:#FFFFFF; border-style:none; font-weight:; font-family:Verdana; cursor:text; font-style:;

    } .TCH12_2{ top:430px; width:15px; height:15px; border-width:0px; font-size:10pt; border-color:#C0C0C0; color:#0000FF; background-color:#C0C0C0; border-style:solid; font-weight:; font-family:MS Sans Serif; cursor:text; font-style:;

    } .TTE13_2{ top:429px; width:152px; height:15px; border-width:0px; font-size:8pt; border-color:#000000; color:#0000A0; background-color:#FFFFFF; border-style:none; font-weight:; font-family:Verdana; cursor:text; font-style:;

    } --></style>

    <script language=javascript> function check_form() { var error,i,set,str,ele,elenam,zeichen; ele=3; elenam='Name';

    set='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZß '; str=window.document.forms[0].elements[ele].value; if (str.length<1) { alert('Bitte machen Sie eine Eingabe in Element '+elenam); return false; }

    ele=5; elenam='Message';

    set='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZß '; str=window.document.forms[0].elements[ele].value; if (str.length<1) { alert('Bitte machen Sie eine Eingabe in Element '+elenam); return false; }

    ele=6; elenam='Kommentar';

    set='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZß '; str=window.document.forms[0].elements[ele].value; if (str.length<1) { alert('Bitte machen Sie eine Eingabe in Element '+elenam); return false; }

    } </script>

    <form action=kontaktform.php method=post> <input type=hidden name=ToMail value=e-mail@adresse.de> <DIV ID=EL1 style="position:absolute; left:229px;top:459px;z-index:1"> <input class=PS_2 type=Submit value=Senden onclick="return check_form()"> </DIV> <DIV ID=EL2 style="position:absolute; left:19px;top:459px;z-index:2"> <input class=PC_2 type=Reset value=Reset> </DIV> <DIV ID=EL3 style="position:absolute; left:130px;top:140px;z-index:3"> <input class=TED1_2 type=text name=Name value=> </DIV> <DIV ID=EL4 style="position:absolute; left:130px;top:180px;z-index:4"> <input class=TED2_2 type=text name=E-Mail_Absender value=> </DIV> <DIV ID=EL5 style="position:absolute; left:130px;top:220px;z-index:5"> <input class=TED3_2 type=text name=Message value=> </DIV> <DIV ID=EL6 style="position:absolute; left:19px;top:319px;z-index:6"> <textarea class=TME4_2 name=Kommentar></textarea> </DIV> <DIV ID=EL7 style="position:absolute; left:19px;top:139px;z-index:7"> <font class=TTE5_2>Ihr Name</font> </DIV> <DIV ID=EL8 style="position:absolute; left:19px;top:179px;z-index:8"> <font class=TTE6_2>E-Mail</font> </DIV> <DIV ID=EL9 style="position:absolute; left:19px;top:219px;z-index:9"> <font class=TTE7_2>Überschrift</font> </DIV> <DIV ID=EL10 style="position:absolute; left:19px;top:279px;z-index:10"> <font class=TTE8_2>Kommentar</font> </DIV> <DIV ID=EL11 style="position:absolute; left:17px;top:49px;z-index:11"> <font class=TTE9_2>Kontaktformular</font> </DIV> <DIV ID=EL12 style="position:absolute; left:19px;top:99px;z-index:12"> <font class=TTE10_2>___________________________________________________________</font> </DIV> <DIV ID=EL13 style="position:absolute; left:350px;top:140px;z-index:13"> <table  class=TMT11_2> <tr><td valign=top> <span style="font-family:Verdana;font-size:10pt;font-style:;font-weight:;color:#0000A0"> Für Ihre Anfrage oder <br>Meinung, nutzen <br>Sie bitte dieses <br>Formular!<br>&#160;<br>Vergessen Sie nicht eine<br>Kontaktadresse <br>(E-Mail oder Tel.)<br>anzugeben, wenn Sie <br>eine Antwort wünschen.<br> </span> </td></tr> </table> </DIV> <DIV ID=EL14 style="position:absolute; left:360px;top:430px;z-index:14"> <input class=TCH12_2 type=Checkbox name=Antwort value=JA> </DIV> <DIV ID=EL15 style="position:absolute; left:379px;top:429px;z-index:15"> <font class=TTE13_2>Ich bitte um Rückantwort</font> </DIV>

    <input type=hidden name=FormularTitel value=Schreiben#Sie#uns!> </form></body></html>"); } else { $message=""; foreach($_POST as $key => $value) {

    if (is_array($_POST[$key]))

    {

    $merk=$key;         $liste="";

    foreach($_POST[$key] as $key => $value)                 {                      $liste="$liste\n$value";                 }         $message="$message\n\n$merk\n$liste";

    } else

    {         if ($key == "ToMail") {$email=$value;}         if ($key == "FormularTitel") {          $titel=str_replace("#", " ", $value);         }         $message="$message\n\n$key\n$value";         } }

    echo($body); mail($email,$titel,$message,"From: <$email>"); echo("<font face=verdana size=2>Vielen Dank!  Das Formular wurde gesendet.</font>");

    echo("<p><font face=verdana size=2><a href=kontaktform.php>Zurück zum Kontaktformular</a></font>"); }

    ?>

    </body> </html>

    1. Hello,

      <form action=kontaktform.php method=post>
      <input type=hidden name=ToMail value=e-mail@adresse.de>

      [...]

      {
              if ($key == "ToMail") {$email=$value;}
              if ($key == "FormularTitel") {
               $titel=str_replace("#", " ", $value);
              }

      [...]

      mail($email,$titel,$message,"From: <$email>");
      echo("<font face=verdana size=2>Vielen Dank!  Das Formular wurde gesendet.</font>");

      Dieses Script verwende auf gar keinen Fall.
      Die Gefahr, dass Dein Formmailer zur Spamschleuder wird, ist vorhanden.

      Alle Daten, die in die Header einer eMail einfließen, müssen gut genug geprüft werden. Hier findet das Feld [ToMail] --> $email direkt Einzug in die Mailfunktion.

      Da ist Dein eigener Code schon wesentlich sicherer. Und auich die Prüfung des "from:"-Felses sit bei Dir ausreichend. Denn es lässt durch die RegExp nur _eine_ eMail-Adresse zu und Injections-Möglichkeiten sollten durch Deine Kontrolle auch ausgeschlossen sein. Über From  könnte sonst ebenfalls der Header "umprogrammiert" werden.

      Und die Probleme mit dem Affenformular bekommen wir auch noch geregelt, wenn Du es nicht schon geschafft hast.

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau