foreach() bei Formularprüfung

stimmt, implode() war es was ich gesucht habe. Damit ich das ganze noch n bisschen besser hinbekomme, würde ich in der check.php das implode direkt einbauen und als einen langen string in der SESSION speichern. Also:

PHP:
  if(!empty($err_messages[$checkfeld])){
      $vor_session['fehler'][$checkfeld] = $err_messages[$checkfeld];
      $_SESSION['fehler']['email'] = implode('<br />', $vor_session['fehler']['email']);  
  };

Dies scheint auch ohne Probleme zu gehen. Hier der aktuelle Code:

PHP:
//Vorgabenliste für Felder
$FELD_DEFINITION = array(); 
$FELD_DEFINITION['email']      = array('minlength' => "6",  'maxlength' => "100",  'mandatory' => true, 'characters' => "/^[a-z0-9\-_]?[a-z0-9.\-_]+[a-z0-9\-_]?@[a-z.-]+\.[a-z]{2,}$/i",  'characters_err' => "Bitte gib eine gültige E-Mail Adresse ein.");

//Welche Felder sollen geprüft werden
$felder = array();
$felder = array('email');

//Valid ist zu Beginn auf true;
$valid = true;

//Alle vorgegebenen Felder durchlaufen
$err_messages = array();

foreach($felder as $checkfeld) {

  //Inhalt von $_POST['FELDNAME'] in $_SESSION['FELDNAME'] schreiben
  $_SESSION[$checkfeld] = $_POST[$checkfeld];
  
  //Inhalte prüfen und bei Fehler in $err_messages den jeweiligen Fehler schreiben
  $err_messages[$checkfeld] = array();
  
  if($FELD_DEFINITION[$checkfeld]['mandatory']==true){
    if(empty($_POST[$checkfeld])){              
    $err_messages[$checkfeld][] = "<img src='formularfehler.jpg' width='15px' height='15px'>Dieses Feld ist ein Pflichtfeld.";
    $valid = false;
    };
  };

  if(strlen($_POST[$checkfeld]) < $FELD_DEFINITION[$checkfeld]['minlength']) {
  $err_messages[$checkfeld][] = "<img src='formularfehler.jpg' width='15px' height='15px'>Dieses Feld muss mindestens ".$FELD_DEFINITION[$checkfeld]['minlength']." Zeichen lang sein.";
  $valid = false;
  };

  if(strlen($_POST[$checkfeld]) > $FELD_DEFINITION[$checkfeld]['maxlength']) {
  $err_messages[$checkfeld][] = "<img src='formularfehler.jpg' width='15px' height='15px'>Dieses Feld darf maximal ".$FELD_DEFINITION[$checkfeld]['maxlength']." Zeichen lang sein.";
  $valid = false;
  };

  if(!preg_match($FELD_DEFINITION[$checkfeld]['characters'], $_POST[$checkfeld])) {
  $err_messages[$checkfeld][] = "<img src='formularfehler.jpg' width='15px' height='15px'>".$FELD_DEFINITION[$checkfeld]['characters_err']."";
  $valid = false;
  };
  
  //Wenn Fehler in aktuellem Feld, Fehler in SESSION schreiben
  if(!empty($err_messages[$checkfeld])){
      //Fehler in ein Array speichern
      $vor_session['fehler'][$checkfeld] = $err_messages[$checkfeld];   
      //Array zusammenführen und in SESSION speichern
      $_SESSION['fehler'][$checkfeld] = implode('<br />', $vor_session['fehler'][$checkfeld]);  
  };
}

//Prüfen ob Vorprüfungen alle korrekt
if($valid) {

yaslaw, es entstehen mir durch dieses Script nur $_SESSION['email'] sowie $_SESSION['fehler']['email']. Muss ich weitere Arrays löschen, oder ist das so okay? Gibt es noch Beanstandungen am Script?

Werde jetzt noch die Reihenfolge der einzelnen Checks ändern und verschachteln. Außerdem nehme ich meine DB-Abfrage am Ende dazu und bei einem Fehler lasse ich diesen Fehler ebenfalls per implode in die SESSION schreiben.

Aber so müsste doch alles gut sein, oder?
 
Zuletzt bearbeitet:
PHP:
  if(!empty($err_messages[$checkfeld])){
      $vor_session['fehler'][$checkfeld] = $err_messages[$checkfeld];
      $_SESSION['fehler']['email'] = implode('<br />', $vor_session['fehler']['email']);  
  };
Das ist schlecht.
du speicherst einerseits das Array unter fehler->Feldname, anderseits speicherst du den Fehlerstring fix in fehler->email. Was ist mit den Fehlermeldungen des Feldes Nachname, Vorname etc?. Die überschreiben sich gegenseitig in das Feld fehler->email.

So ists besser
PHP:
  if(!empty($err_messages[$checkfeld])){
      $_SESSION['fehler'][$checkfeld] =  implode('<br />', $err_messages[$checkfeld]);
  };
 
Stimmt. Da hast Du recht. Wie kann ich nun nachträglich einen Fehler, beispielsweise nen Fehler bei der E-Mail hinzufügen? Ich frage nach
PHP:
if($valid) {
ab, ob die E-Mail bereits in der DB ist, wenn nicht, wird sie eingetragen. Wenn schon, leite ich per header auf die Fehlerseite. Hier brauche ich dann jedoch auch den Fehler, dass die E-Mail bereits existiert.

Habe das ganze jetzt wie folgt gelöst:

PHP:
            $err_messages['email'][] = "<img src='formularfehler.jpg' width='15px' height='15px'>Du empfängst bereits unseren Newsletter.";
            $_SESSION['fehler']['email'] = implode('<br />', $err_messages['fehler']['email']);
da erhalte ich jedoch
Code:
Warning: implode() [function.implode]: Invalid arguments passed in
Muss ich vorher also erstmal die Session zerpflücken?
 
was ist $err_messages['fehler'] ?Das hast du gar nicht....

Geh das ganze mal ganz ruhig an. Du masselst da momentan Zeug im eiltempo zusammen und verwechselst Arrays und deren Aufbauten, Varibalem mit Konstanten etc.
Einfach mal ruhig, überlegen welcher Array wie aufgebaut ist und was er bewirken soll.
Im Zweifelsfall an einigen orten einen var_dump() einbauen und mal nachschen wie die Daten so aussehen...
 
ah...sorry!

manchmal sieht man den wald vor lauter arrays gar nicht :-P

Jetzt scheint alles zu passen. Zwei abschließende Fragen noch:
Verwende ich
PHP:
if($valid==true) {
oder
PHP:
if($valid) {
?

Zweites: Ist das ein Script, welches man einsetzen kann oder hab ich etwas vergessen?
Auf jeden Fall schonmal DANKE für Deine Hilfe.
 
Um diesen Thead hier abzuschließen:

Ich habe nun noch die Prüfungsreihenfolge in if-else-Anweisungen geschrieben. Vielleicht kannst Du yaslaw, oder jemand anderes nochmal drüber sehen ob ich etwas vergessen habe.
PHP:
  //Inhalte prüfen und bei Fehler in $err_messages den jeweiligen Fehler schreiben
  //Wenn Pflichtfeld -> Wenn ja, prüfen ob leer,  wenn ja -> Fehler
  //                                              wenn nein, Prüfe Rest
  //                 -> Wenn nein, prüfe ob leer, wenn ja -> OK
  //                                              wenn nein -> Prüfe Rest
  $err_messages[$checkfeld] = array();  if($FELD_DEFINITION[$checkfeld]['mandatory']==true){
    if(empty($_POST[$checkfeld])){              
    $err_messages[$checkfeld][] = "<img src='images/formularfehler.jpg' width='15px' height='15px'>Dieses Feld ist ein Pflichtfeld.";
    $valid = false;
    } else {
            if(strlen($_POST[$checkfeld]) < $FELD_DEFINITION[$checkfeld]['minlength']) {
            $err_messages[$checkfeld][] = "<img src='images/formularfehler.jpg' width='15px' height='15px'>Dieses Feld muss mindestens ".$FELD_DEFINITION[$checkfeld]['minlength']." Zeichen lang sein.";
            $valid = false;
            };
            
            if(strlen($_POST[$checkfeld]) > $FELD_DEFINITION[$checkfeld]['maxlength']) {
            $err_messages[$checkfeld][] = "<img src='images/formularfehler.jpg' width='15px' height='15px'>Dieses Feld darf maximal ".$FELD_DEFINITION[$checkfeld]['maxlength']." Zeichen lang sein.";
            $valid = false;
            };
            
            if(!preg_match($FELD_DEFINITION[$checkfeld]['characters'], $_POST[$checkfeld])) {
            $err_messages[$checkfeld][] = "<img src='images/formularfehler.jpg' width='15px' height='15px'>".$FELD_DEFINITION[$checkfeld]['characters_err']."";
            $valid = false;
            };
           };
  } else {
    if(!empty($_POST[$checkfeld])){              
      if(strlen($_POST[$checkfeld]) < $FELD_DEFINITION[$checkfeld]['minlength']) {
      $err_messages[$checkfeld][] = "<img src='images/formularfehler.jpg' width='15px' height='15px'>Dieses Feld muss mindestens ".$FELD_DEFINITION[$checkfeld]['minlength']." Zeichen lang sein.";
      $valid = false;
      };
      
      if(strlen($_POST[$checkfeld]) > $FELD_DEFINITION[$checkfeld]['maxlength']) {
      $err_messages[$checkfeld][] = "<img src='images/formularfehler.jpg' width='15px' height='15px'>Dieses Feld darf maximal ".$FELD_DEFINITION[$checkfeld]['maxlength']." Zeichen lang sein.";
      $valid = false;
      };
      
      if(!preg_match($FELD_DEFINITION[$checkfeld]['characters'], $_POST[$checkfeld])) {
      $err_messages[$checkfeld][] = "<img src='images/formularfehler.jpg' width='15px' height='15px'>".$FELD_DEFINITION[$checkfeld]['characters_err']."";
      $valid = false;
      };
    };
  };

Ich prüfen nun $valid auch per if ($valid {} und hoffe das passt so. Ist das Script nun "einsatzbereit"?
 
Zurück