Lukas Schaufler: Formmailer - Rückgabe der Fehler in einem Formular

Hallöchen!

Ich habe mir dank diesen Forums und ein bischen Spielerei einen Formmailer mit PHP zusammengebastelt.

Nun geht es darum, dass manche Felder ausgefüllt sein müssen und bei leerlassen des Feldes eine Fehlermeldung vor dem Formular ausgegeben wird.
Funktioniert alles soweit gut, jedoch habe ich eine Frage zwecks ausgabe der Fehler.

Derzeit werden alle Fehler in die Variable $fehler geschrieben, wobei immer nur ein Fehler ausgegeben wird und nicht alle.

Wie kann ich das berichtigen, ohne für jeden Fehler eine eigene Variable und deren Ausgabe beschreiben zu müssen?!?

für eine online Besichtigung habe ich das Dokument auch unter folgenden Adresse online gestellt:
http://www.schaufler.cc/test/Buchen.php

anbei der Quellcode (gekürzt) des betreffenden Dokuments:
<?php

Konfiguration

Bitte passen Sie die folgenden Werte an, bevor Sie das Script benutzen!

An welche Adresse sollen die Mails gesendet werden?

$strEmpfaenger = 'cinemaster@XX.net';

Welche Adresse soll als Absender angegeben werden?

(Manche Hoster lassen diese Angabe vor dem Versenden der Mail ueberschreiben)

$strFrom       = '"C4Y Homepage" homepage@XX.com';

Welchen Betreff sollen die Mails erhalten?

$strSubject    = 'Anmeldung';

Zu welcher Seite soll als "Danke-Seite" weitergeleitet werden?

Wichtig: Sie muessen hier eine gueltige HTTP-Adresse angeben!

$strReturnhtml = 'http://www.schaufler.cc/test/AnmeldungFeedback.htm';

Welche(s) Zeichen soll(en) zwischen dem Feldnamen und dem angegebenen Wert stehen?

$strDelimiter  = ":\t";

Ende Konfiguration

$allesok     = "";
$fehler     = "";
$Nachname     = isset($_POST['nachname']) ? $_POST['nachname'] : '';
$Vorname     = isset($_POST['vorname']) ? $_POST['vorname'] : '';
$Adresse     = isset($_POST['adresse']) ? $_POST['adresse'] : '';
$PLZ     = isset($_POST['plz']) ? $_POST['plz'] : '';
$Ort     = isset($_POST['ort']) ? $_POST['ort'] : '';
$Telefon     = isset($_POST['tel']) ? $_POST['tel'] : '';
$Email     = isset($_POST['email']) ? $_POST['email'] : '';
$Geburtsdatum     = isset($_POST['geburtsdatum']) ? $_POST['geburtsdatum'] : '';
$Eltern     = isset($_POST['eltern']) ? $_POST['eltern'] : '';
$Abreiseort     = isset($_POST['abreiseort']) ? $_POST['abreiseort'] : '';
$Kurs     = isset($_POST['kurs']) ? $_POST['kurs'] : '';
// weitere Formularfelder
// Abfrage ob ein Senden gedrückt wurde
if($_POST)
{
$allesok = 1;
  // Button wurde gedrückt
 if     (empty($Vorname))     {$allesok=0;$fehler="Vorname fehlt! \n";}
 elseif (empty($Nachname))     {$allesok=0;$fehler="Nachname fehlt! \n";}
 elseif (empty($Adresse))     {$allesok=0;$fehler="Adresse fehlt! \n";}
 elseif (empty($PLZ))     {$allesok=0;$fehler="Postleitzahl fehlt! \n";}
 elseif (empty($Ort))     {$allesok=0;$fehler="Telefonnummer fehlt! \n";}
 elseif (empty($Telefon))     {$allesok=0;$fehler="Ort fehlt! \n";}
 elseif (empty($Email))     {$allesok=0;$fehler="E-Mail fehlt! \n";}
 elseif (empty($Geburtsdatum))     {$allesok=0;$fehler="Geburtsdatum fehlt! \n";}
 elseif (empty($Eltern))     {$allesok=0;$fehler="Erziehungsberechtigter fehlt! \n";}
 elseif (empty($Abreiseort))     {$allesok=0;$fehler="Abreiseort fehlt! \n";}
 elseif (empty($Kurs))     {$allesok=0;$fehler="Kurs fehlt! \n";}
 }

// wenn Überprüfung ok und Eingaben vorhanden dann
 if($allesok){

$strMailtext = "Buchungsformular \n \n \n";
    while(list($strName,$value) = each($_POST))
      {
        if(is_array($value)) {
          foreach($value as $value_array)
          {
            $strMailtext .= $strName.$strDelimiter.$value_array."\n \n";
          }
        } else {
          $strMailtext .= $strName.$strDelimiter.$value."\n \n";
        }
      }

if(get_magic_quotes_gpc()) {
      $strMailtext = stripslashes($strMailtext);
    }

mail($strEmpfaenger, $strSubject, $strMailtext, "Absender: ".$strFrom)
    or die("Die Mail konnte nicht versendet werden.");
    header("Location: $strReturnhtml");
    exit;
  } else {
  // ansonsten Anzeigen des Formulars
?>

....

<h2>Anmeldeformular!</h2>
   <p>Bitte f&uuml;lle alle Felder im Anmeldeformular aus und klicke auf &quot;Abschicken&quot;. Wir senden dir innerhalb einer Woche eine Buchungsbest&auml;tigung und einen Zahlschein f&uuml;r die Anzahlung. Mit dem Absenden des Formulars gelten die<a href="ElternAGB.htm" style="text-decoration:none; color:#ED171F"> AGBs</a> als aktzeptiert. </p>
   <p style="font-weight:bold; color:#ED171F; text-decoration:underline;"><?php print $fehler;?></p>
   <p style="font-weight:bold; color:#ED171F;">Sch&uuml;lerdaten</p>
          <form action="<?php print $_SERVER['PHP_SELF']; ?>" method="post">
           <label style="float:left; text-align:right; width:130px; margin-right:5px;">Vorname:</label><input type="text" name="vorname" value="<? echo $Vorname ?>" style="background-color:#B4D1E9; width:150px;"/>
                <label style="text-align:right; width:130px; margin-right:5px;">Nachname:</label><input type="text" name="nachname" value="<? echo $Nachname ?>" style="background-color:#B4D1E9; width:150px;"/>
                <p></p>
    <label style="float:left; text-align:right; width:130px; margin-right:5px;">Adresse:</label><input type="text" value="<? echo $Adresse ?>" name="adresse"style="background-color:#B4D1E9; width:376px;"/>
    <p></p>
    <label style="float:left; text-align:right; width:130px; margin-right:5px;">PLZ:</label><input type="text" name="plz" value="<? echo $PLZ ?>" style="background-color:#B4D1E9; width:150px;"/>
                <label style="text-align:right; width:130px; margin-right:5px; margin-left:45px;">Ort:</label><input type="text" name="ort" value="<? echo $Ort ?>" style="background-color:#B4D1E9;width:150px;"/>
    <p></p>
    <label style="float:left; text-align:right; width:130px; margin-right:5px;">Tel:</label><input type="text" name="tel" value="<? echo $Telefon ?>" style="background-color:#B4D1E9; width:150px;"/>
                <label style="text-align:right; width:130px; margin-right:5px; margin-left:27px;">E-Mail:</label><input type="text" name="email" value="<? echo $Email ?>" style="background-color:#B4D1E9;width:150px;"/>
    <p></p>
                <label style="float:left; text-align:right; width:130px; margin-right:5px;">Geboren am:</label><input type="text" name="geburtsdatum" value="<? echo $Geburtsdatum ?>" style="background-color:#B4D1E9;width:150px;"/>
    <label style="text-align:right; width:130px; margin-right:5px;">Geschlecht:</label><input type="radio" id="geschlecht" name="geschlecht" value="M&auml;nnlich" />M&auml;nnlich<input type="radio" name="sexus" value="Weiblich" />Weiblich
          <p></p>
    <label style="float:left; text-align:right; width:130px; margin-right:5px;">Besonderes:</label><input type="text" name="besonderes"style="background-color:#B4D1E9; margin-left:3px; width:376px;"/>
    <br/>(z.B: Allergien, Krankheiten, Essst&ouml;rungen, usw.)
    <p></p>
    <label style="float:left; text-align:right; width:130px; margin-right:5px;">Erm&auml;&szlig;igung f&uuml;r Geschwister:</label><input type="text" name="geschwister"style="background-color:#B4D1E9; margin-left:3px; width:376px;"/>
    <br/>(bitte gib die Namen deiner teilnehmenden Geschwister an)
    <p></p>
    <label style="float:left; text-align:right; width:130px; margin-right:5px;">Bring-a-friend Bonus:</label><input type="text" name="freunde"style="background-color:#B4D1E9; margin-left:3px; width:376px;"/>
       <br/>(bitte gib die Namen deiner teilnehmenden Freunde/innen an)
    <p style="font-weight:bold; color:#ED171F;">Elterndaten</p>
    <label style="float:left; text-align:right; width:130px; margin-right:5px;">Erziehungsberechtigter:</label><input type="text" name="eltern" value="<? echo $Eltern ?>" style="background-color:#B4D1E9; width:150px;"/>
                <label style="text-align:right; width:130px; margin-right:5px;margin-left:15px;">Tel. B&uuml;ro:</label>
                <input type="text" name="bueronummer" style="background-color:#B4D1E9; width:150px;"/>
    <p style="font-weight:bold; color:#ED171F;">Kursdaten</p>
    <label style="float:left; text-align:right; width:90px; margin-right:5px;">Abreiseort:</label>
    <select name="abreiseort" size="1" style="background-color:#B4D1E9; width:515px;">

...
        </form>

...

<?
// Schließen der Abfrage
} ?>

Danke & Lg.

--
Lukas Schaufler
  1. Moin,

    Derzeit werden alle Fehler in die Variable $fehler geschrieben, wobei immer nur ein Fehler ausgegeben wird und nicht alle.

    Wie kann ich das berichtigen, ohne für jeden Fehler eine eigene Variable und deren Ausgabe beschreiben zu müssen?!?

    wenn ich dich richtig verstehe, willst du alle Fehler auf einmal ausgeben, richtig?

    Wenn das so ist, dann solltest du in diesem Teil nicht $fehler jedesmal überschreiben, sondern könntest den nächsten Fehler einfach mittels $fehler .= "<br>Nachname fehlt!" an die Fehler-Variable anhängen.

    MfG,
      Juan

  2. Tag Lukas.

    Nun geht es darum, dass manche Felder ausgefüllt sein müssen und bei leerlassen des Feldes eine Fehlermeldung vor dem Formular ausgegeben wird. [...] Derzeit werden alle Fehler in die Variable $fehler geschrieben, wobei immer nur ein Fehler ausgegeben wird und nicht alle.

    Schau dir mal dein if..elsif-Konstrukt an, dabei insbesondere die Wertzuweisung zum String $fehler.

    Wie kann ich das berichtigen, ohne für jeden Fehler eine eigene Variable und deren Ausgabe beschreiben zu müssen?!?

    Verwende einen geeigneten Zeichenkettenoperator.

    Siechfred

  3. Hallo,

    schön, dass Du Dich um Trennung von Parameterübernahme, Kontrollen, Berechnungen und Ausgabe bemühst :-)

    $fehler = '';

    // Button wurde gedrückt

    if     (empty($Vorname))     {$allesok=0; $fehler .= "Vorname fehlt! \n";}

    if (empty($Nachname))     {$allesok=0; $fehler .= "Nachname fehlt! \n";}

    if (empty($Adresse))     {$allesok=0;$fehler .= "Adresse fehlt! \n";}

    #...

    Nun hast Du eine Variable $fehler, die alle Fehlermeldungen cder Reihe nach enthält.

    Vor der Ausgabe musst Du nur noch die RAW-Zeilenumbrüche mit <br /> ergänzen. das machtg die Funktion nl2br().

    LG
    Chris

    1. Danke für die vielen und äußerst schnellen Tipps!

      Ich habe den Code folgendermaßen verändert:

      if     (empty($Vorname))     {$allesok=0;$fehler .="Vorname fehlt! \n";}
       elseif (empty($Nachname))     {$allesok=0;$fehler .="Nachname fehlt! \n";}
       elseif (empty($Adresse))     {$allesok=0;$fehler .="Adresse fehlt! \n";}
       elseif (empty($PLZ))     {$allesok=0;$fehler .="Postleitzahl fehlt! \n";}
       elseif (empty($Ort))     {$allesok=0;$fehler .="Telefonnummer fehlt! \n";}
       elseif (empty($Telefon))     {$allesok=0;$fehler .="Ort fehlt! \n";}
       elseif (empty($Email))     {$allesok=0;$fehler .="E-Mail fehlt! \n";}
       elseif (empty($Geburtsdatum))     {$allesok=0;$fehler .="Geburtsdatum fehlt! \n";}
       elseif (empty($Eltern))     {$allesok=0;$fehler .="Erziehungsberechtigter fehlt! \n";}
       elseif (empty($Abreiseort))     {$allesok=0;$fehler .="Abreiseort fehlt! \n";}
       elseif (empty($Kurs))     {$allesok=0;$fehler .="Kurs fehlt! \n";}
       }

      und die Ausgabe erfolgt so:
      <?php print nl2br($fehler);?>

      Ich hoffe, dass ich die Funktionsreferenz so richtig gedeutet habe?!?

      Wenn ja, gibt das Script leider immer noch nur einen Fehler aus...

      1. Hallo,

        if     (empty($Vorname))     {$allesok=0;$fehler .="Vorname fehlt! \n";}
        elseif (empty($Nachname))     {$allesok=0;$fehler .="Nachname fehlt! \n";}
        elseif (empty($Adresse))     {$allesok=0;$fehler .="Adresse fehlt! \n";}
        elseif (empty($PLZ))     {$allesok=0;$fehler .="Postleitzahl fehlt! \n";}
        elseif (empty($Ort))     {$allesok=0;$fehler .="Telefonnummer fehlt! \n";}
        elseif (empty($Telefon))     {$allesok=0;$fehler .="Ort fehlt! \n";}
        elseif (empty($Email))     {$allesok=0;$fehler .="E-Mail fehlt! \n";}
        elseif (empty($Geburtsdatum))     {$allesok=0;$fehler .="Geburtsdatum fehlt! \n";}
        elseif (empty($Eltern))     {$allesok=0;$fehler .="Erziehungsberechtigter fehlt! \n";}
        elseif (empty($Abreiseort))     {$allesok=0;$fehler .="Abreiseort fehlt! \n";}
        elseif (empty($Kurs))     {$allesok=0;$fehler .="Kurs fehlt! \n";}
        }

        und die Ausgabe erfolgt so:
        <?php print nl2br($fehler);?>

        Ich hoffe, dass ich die Funktionsreferenz so richtig gedeutet habe?!?

        mach aus den elseif wieder ein if, damit er nicht gleich beim ersten gefundenen Fehler aufhört zu checken, dann solltest du auch mehrere Fehler sehen.

        MfG,
          Juan

        1. DANKESCHÖN!
          Nun funktioniert alles ganz so wie es sollte!
          Und ich muss es immer wieder sagen....EIN TOLLES FORUM!!!

      2. Hallo,

        Danke für die vielen und äußerst schnellen Tipps!

        bitte :-)

        [...] gibt das Script leider immer noch nur einen Fehler aus...

        Dann lies Dir die Vorschläge nochmal richtig durch. Da wurde explizit und implizit auf eine Wechsel von 'ifelse()' auf 'if()' hingewiwsen.

        Es handelt sich um angereihte, gleichzeitig mögliche (optionale) Bedingungen. IfElse() benutzt man nur für wechselweise (alternative) Bedingungen.

        LG
        Chris

  4. echo $begrüßung;

    Derzeit werden alle Fehler in die Variable $fehler geschrieben, wobei immer nur ein Fehler ausgegeben wird und nicht alle.

    Wie kann ich das berichtigen, ohne für jeden Fehler eine eigene Variable und deren Ausgabe beschreiben zu müssen?!?

    Die Fehlermeldungen bereits beim Erzeugen in einer bereits ausgabeformatierten Variable zusammenzufassen halte ich nicht für die beste Idee. Besser finde ich, die Fehlermeldungen in einem Array zu sammeln, das man dann am Ende für die Ausgabe vorbereitet oder ins Logfile schreibt oder ...

    $errors = array();
    if (fehler)
      $error[] = 'meldung';
    ...

    Für das Zusammenfügen/Ausgeben eigen sich implode(), foreach, ...

    echo "$verabschiedung $name";