Jo: Prüfen ob alle Felder ausgefüllt sind

Vorab muss ich gleich mal sagen das ich mit html ganz gut klar komme, doch bei php meine Kenntnisse gleich 0 sind. Deshalb nutze ich auch ein freies php-script. Nun habe ich im Kontakt Formular folgendes Problem, es kommt zwar eine Bestätigung wenn die Mail erfolgreich versendet wurde aber nur eine Fehlermeldung wenn z.B. das @ bei Mail fehlt. Sind aber nicht alle Felder ausgefüllt und es wird auf Absenden geklickt verschwinden alle Eingaben und es ist nicht ersichtlich das die Mail nicht versendet wurde.
Nun meine Frage, was muss ich wo einfügen, damit die Fehlermeldung ($lang['emailcouldnotsend') auch im Falle von nicht ausgefüllten Feldern ausgegeben wird.

Hier der Code:

<?php

defined ('main') or die ( 'no direct access' );

$title = $allgAr['title'].' :: Kontakt';
$hmenu = 'Kontakt';
$design = new design ( $title , $hmenu );
$design->header();

$erg = db_query("SELECT v2,t1,v1 FROM prefix_allg WHERE k = 'kontakt'");
$row = db_fetch_assoc($erg);
$k = explode('#',$row['t1']);

$name = '';
$mail = '';
$subject = '';
$wer  = '';
$text = '';
if (!empty($_POST['wer']) AND !empty($_POST['mail']) AND !empty($_POST['txt']) AND !empty($_POST['name']) AND !empty($_POST['subject']) AND chk_antispam('contact')) {
  $name = escape_for_email($_POST['name']);
  $mail = escape_for_email($_POST['mail']);
  $subject = escape_for_email($_POST['subject'], true);
  $wer  = escape_for_email($_POST['wer']);
  $text = $_POST['txt'];
  $wero = FALSE;
  foreach($k as $a) {
    $e = explode('|',$a);
    if (md5($e[0]) == $wer) {
      $wero = TRUE;
      $wer  = $e[0];
      break;
    }
  }

if (strpos ($text, 'Content-Type:') === FALSE
  AND strpos($text, 'MIME-Version:') === FALSE
  AND strpos($mail, '@') !== FALSE AND $wero === TRUE
  AND strlen($name) <= 30 AND strlen($mail) <= 30
  AND strlen($text) <= 5000
  AND $mail != $name AND $name != $text AND $text != $mail) {

$subject = "Kontakt: " . $subject;
    icmail ($wer,$subject,$text, $name." <".$mail.">");
    echo $lang['emailsuccessfullsend'];
    $name = '';
    $mail = '';
    $subject = '';
    $wer  = '';
    $text = '';
  } else {
    echo $lang['emailcouldnotsend'];
  }
}

$tpl = new tpl ( 'contact.htm' );
$tpl->out(0);

$i = 1;
foreach($k as $a) {
  $e = explode('|',$a);
  if ($e[0] == '' OR $e[1] == '' ) { continue; }
  if ($i == 1) { $c = 'checked'; } else { $c = ''; }
  $tpl->set_ar_out( array ('KEY' => md5($e[0]), 'VAL' => $e[1], 'c' => $c) , 1 );
  $i++;
}

$tpl->set('name', $name);
$tpl->set('mail', $mail);
$tpl->set('subject', $subject);
$tpl->set('text', $text);
$tpl->set('ANTISPAM', get_antispam('contact',100));
$tpl->out(2);

?>

  1. Hallo Jo,

    Nun meine Frage, was muss ich wo einfügen, damit die Fehlermeldung ($lang['emailcouldnotsend') auch im Falle von nicht ausgefüllten Feldern ausgegeben wird.

    erstmal wäre wohl error_reporting(E_ALL) am Anfang der Datei, zumindest während der Entwicklung, eine gute Idee. Dann bekommst Du Fehler und Warnungen angezeigt, was auch zur Lösung Deines Problems beitragen könnte.

    Um die Fehlermeldung in weiteren Fällen auszugeben mußt Du im Abschnitt:

    if (strpos ($text, 'Content-Type:') === FALSE  
      AND strpos($text, 'MIME-Version:') === FALSE  
      AND strpos($mail, '@') !== FALSE AND $wero === TRUE  
      AND strlen($name) <= 30 AND strlen($mail) <= 30  
      AND strlen($text) <= 5000  
      AND $mail != $name AND $name != $text AND $text != $mail) {
    

    weitere Bedingungen hinzufügen.

    Ich würde Dir aber empfehlen, daß Du wenigstens verstehst, was Du da machst Dir den SELFHTML Artikel "Einfacher PHP-Formmailer" durchzulesen und evtl. diesen anzupassen anstatt dieses halbgare Script notdürftig zu flicken.

    Grüße aus Stockholm,
    Götz

    --
    Losung für Freitag, 18. April 2008
    Meine Seele hängt an dir; deine rechte Hand hält mich. (Psalm 63,9)
    Der Aussätzige jammerte Jesus und er streckte die Hand aus, rührte ihn an und sprach zu ihm: Ich will's tun; sei rein! (Markus 1,41)
    (zur aktuellen Losung)
    1. Hallo Götz,

      danke für Deine schnelle Antwort.
      Es ist ja nicht so, dass ich mich nicht bemühe selbst eine Lösung zu finden und ich denke ich habe auch schon herausgefunden das nachfolgendes, so oder in ähnlich Form, in dem von Dir abgeführten Abschnitt rein müsste.

        
      !isset($_POST['z.B. mail']) or strlen(trim($_POST['z.B. mail']))==0  
      
      

      Nur leider ist mir nicht klar wie ich das einfügen muss damit es auch fehlerfrei funktioniert und in diesem Fall würde ich ja auch nur das Feld mail prüfen.

      Gruß
      Jo

      1. Hallo Jo,

        !isset($_POST['z.B. mail']) or strlen(trim($_POST['z.B. mail']))==0

        
        > Nur leider ist mir nicht klar wie ich das einfügen muss damit es auch fehlerfrei funktioniert und in diesem Fall würde ich ja auch nur das Feld mail prüfen.  
          
        Ja, das ist schon kein schlechter Ansatz.  
        Jedoch willst Du ja, daß sowohl die alten Bedingungen, als auch neuen erfüllt sein müssen. Also mußt Du diese noch mit AND verknüpfen.  
          
        Ich würde einfach nur folgendes schreiben:  
        `if (!empty($_POST['mail']) AND ... ) {`{:.language-php}  
        Siehe auch [PHP Manual: empty()](http://de.php.net/empty). Das mit trim() kann man natürlich auch machen.  
          
        Das mußt Du nun eben für jede Variable, die du als Pflichtangabe haben willst, in die Bedingung schreiben.  
          
          
        Grüße aus Stockholm,  
        Götz  
        
        -- 
        Losung für Freitag, 18. April 2008  
        Meine Seele hängt an dir; deine rechte Hand hält mich. (Psalm 63,9)  
        Der Aussätzige jammerte Jesus und er streckte die Hand aus, rührte ihn an und sprach zu ihm: Ich will's tun; sei rein! (Markus 1,41)  
        ([zur aktuellen Losung](http://www.losungen.de/heute.php))
        
        1. Hallo Götz,

          Ich würde einfach nur folgendes schreiben:
          if (!empty($_POST['mail']) AND ... ) {
          Siehe auch PHP Manual: empty(). Das mit trim() kann man natürlich auch machen.

          Das mußt Du nun eben für jede Variable, die du als Pflichtangabe haben willst, in die Bedingung schreiben.

          Ich hatte es schon mit

          if (!isset($_POST['mail']) or strlen(trim($_POST['mail']))==0 AND ... ) {

          auf die Art, wie Du es vorgeschlagen hast, versucht und jetzt auch mit

          if (!empty($_POST['mail']) AND ... ) {

          doch leider funktioniert es nicht so wie es sollte oder ich mache etwas falsch. Die Mail wird zwar nicht versendet, aber die Fehlermeldung die wie bei

          strpos($mail, '@') !== FALSE AND $wero === TRUE

          mit

          echo $lang['emailcouldnotsend'];

          ausgegeben werden sollte kommt nicht.
          Oder wird das vielleicht durch etwas anderes in diesem Script verhindert?

          Gruß
          Jo

          1. Hallo Jo,

            Oder wird das vielleicht durch etwas anderes in diesem Script verhindert?

            wenn Du mal die vollständige Bedingung mit Deinen Änderungen postest, kann man vielleicht sehen, wo das Problem ist.

            Grüße aus Stockholm,
            Götz

            --
            Losung für Freitag, 18. April 2008
            Meine Seele hängt an dir; deine rechte Hand hält mich. (Psalm 63,9)
            Der Aussätzige jammerte Jesus und er streckte die Hand aus, rührte ihn an und sprach zu ihm: Ich will's tun; sei rein! (Markus 1,41)
            (zur aktuellen Losung)
            1. Hallo Götz,

              Oder wird das vielleicht durch etwas anderes in diesem Script verhindert?

              Ich bin vielleicht ein Depp, hab mich so sehr auf das konzentriert was ich in der php-Dukumentation und in verschiedenen Foren gefunden hatte "Das mit trim()", das ich gar nicht gemerkt habe das im Abschnitt darüber schon

              if (!empty($_POST['wer']) AND ... ) {

              steht. Allerdings ist es ja so das die Mail, nach anklicken von Absenden, zwar nicht versendet wird aber auch keine Fehlermeldung ausgegeben wird und die Felder alle wieder ohne Inhalt erscheinen.

              wenn Du mal die vollständige Bedingung mit Deinen Änderungen postest, kann man vielleicht sehen, wo das Problem ist.

              Hier noch mal der vollständige Code wie im ersten Post ohne Änderungen von mir, da ja !empty() schon gesetzt ist.

                
              <?php  
                
              defined ('main') or die ( 'no direct access' );  
                
                
              $title = $allgAr['title'].' :: Kontakt';  
              $hmenu = 'Kontakt';  
              $design = new design ( $title , $hmenu );  
              $design->header();  
                
                
              $erg = db_query("SELECT v2,t1,v1 FROM prefix_allg WHERE k = 'kontakt'");  
              $row = db_fetch_assoc($erg);  
              $k = explode('#',$row['t1']);  
                
              $name = '';  
              $mail = '';  
              $subject = '';  
              $wer  = '';  
              $text = '';  
              if (!empty($_POST['wer']) AND !empty($_POST['mail']) AND !empty($_POST['txt']) AND !empty($_POST['name']) AND !empty($_POST['subject']) AND chk_antispam('contact')) {  
                $name = escape_for_email($_POST['name']);  
                $mail = escape_for_email($_POST['mail']);  
                $subject = escape_for_email($_POST['subject'], true);  
                $wer  = escape_for_email($_POST['wer']);  
                $text = $_POST['txt'];  
                $wero = FALSE;  
                foreach($k as $a) {  
                  $e = explode('|',$a);  
                  if (md5($e[0]) == $wer) {  
                    $wero = TRUE;  
                    $wer  = $e[0];  
                    break;  
                  }  
                }  
                
                if (strpos ($text, 'Content-Type:') === FALSE  
                AND strpos($text, 'MIME-Version:') === FALSE  
                AND strpos($mail, '@') !== FALSE AND $wero === TRUE  
                AND strlen($name) <= 30 AND strlen($mail) <= 30  
                AND strlen($text) <= 5000  
                AND $mail != $name AND $name != $text AND $text != $mail) {  
                
                  $subject = "Kontakt: " . $subject;  
                  icmail ($wer,$subject,$text, $name." <".$mail.">");  
                  echo $lang['emailsuccessfullsend'];  
                  $name = '';  
                  $mail = '';  
                  $subject = '';  
                  $wer  = '';  
                  $text = '';  
                } else {  
                  echo $lang['emailcouldnotsend'];  
                }  
              }  
                
                
                
              $tpl = new tpl ( 'contact.htm' );  
              $tpl->out(0);  
                
              $i = 1;  
              foreach($k as $a) {  
                $e = explode('|',$a);  
                if ($e[0] == '' OR $e[1] == '' ) { continue; }  
                if ($i == 1) { $c = 'checked'; } else { $c = ''; }  
                $tpl->set_ar_out( array ('KEY' => md5($e[0]), 'VAL' => $e[1], 'c' => $c) , 1 );  
                $i++;  
              }  
                
              $tpl->set('name', $name);  
              $tpl->set('mail', $mail);  
              $tpl->set('subject', $subject);  
              $tpl->set('text', $text);  
              $tpl->set('ANTISPAM', get_antispam('contact',100));  
              $tpl->out(2);  
                
                
              $design->footer();  
              ?>  
              
              

              Ich komme einfach nicht dahinter was ich ändern muss damit, wie bei fehlenden @, die Fehlermeldung ausgegeben wird bzw. wenn alles stimmt die Bestätigungsmeldung.

              Gruß
              Jo

              1. Hallo Jo,

                Hier noch mal der vollständige Code wie im ersten Post ohne Änderungen von mir, da ja !empty() schon gesetzt ist.

                diesen Code kenne ich doch schon.
                Ich wollte eigentlich _nur_ die von Dir geänderte Bedingung sehen, um das Problem zu finden.

                Ich komme einfach nicht dahinter was ich ändern muss damit, wie bei fehlenden @, die Fehlermeldung ausgegeben wird bzw. wenn alles stimmt die Bestätigungsmeldung.

                Die entsprechende Bedingung.
                Im Prinzip werden diese Variablen dann, aufgrund der unsinnigen Struktur dieses Skriptes, zweimal geprüft. Aber das ist bei dem Umfang ja an sich völlig egal.
                In der Zeit, die Du nun darauf aufwendest dieses schäbige Skript anzupassen hättest Du locker ein eigenes schreiben können ... und dann wüßtest Du wenigstens, was an welcher Stelle im Code warum gemacht wird.

                Grüße aus Stockholm,
                Götz

                --
                Losung für Samstag, 19. April 2008
                Lehre uns bedenken, dass wir sterben müssen, auf dass wir klug werden. (Psalm 90,12)
                Christus ist darum für alle gestorben, damit, die da leben, hinfort nicht sich selbst leben, sondern dem, der für sie gestorben und auferstanden ist. (2.Korinther 5,15)
                (zur aktuellen Losung