foreach() bei Formularprüfung

QUEST08

Erfahrenes Mitglied
Guten Abend,

sitze mal wieder an nem Formcheck und habe jetzt ein Problem mit meiner foreach-Schleife. Alles was ich will ist, dass wenn ein Fehler erkannt wurde, dass er mir diesen (oder auch mehrere) in einer SESSION speichert, damit ich diese dann auf der nächsten Seite in Form von echo $_SESSION['fehler']['email'] ausgeben kann.

PHP:
error_reporting(E_ALL); 

session_start();

//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");

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

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

//Alle vorgegebenen Felder durchlaufen
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 = array();
  
  if($FELD_DEFINITION[$checkfeld]['mandatory']==true){
    if(empty($_POST[$checkfeld])){              
    $err_messages[$checkfeld][] = $checkfeld." ist ein Pflichtfeld"; $valid = false;
    };
  };

  if(strlen($_POST[$checkfeld]) < $FELD_DEFINITION[$checkfeld]['minlength']) {
  $err_messages[$checkfeld][] = $checkfeld." ist zu klein."; $valid = false;
  };

  if(strlen($_POST[$checkfeld]) > $FELD_DEFINITION[$checkfeld]['maxlength']) {
  $err_messages[$checkfeld][] = $checkfeld." ist zu groß"; $valid = false;
  };

  if(!preg_match($FELD_DEFINITION[$checkfeld]['characters'], $_POST[$checkfeld])) {
  $err_messages[$checkfeld][] = $checkfeld." hat falsche Zeichen"; $valid = false;
  };
  
  //Wenn Fehler in aktuellem Feld, Fehler in SESSION schreiben
  if(!empty($err_messages[$checkfeld])){
      $errors = array();
      foreach ($err_messages[$checkfeld] as $errors) {
      $_SESSION['fehler'][$checkfeld][] = array($errors);
      }
  };

}

Was mache ich da nun falsch? Er gibt mir
Code:
Fatal error: Cannot use [] for reading in
aus, dies ist die erste Zeile in diesem Abschnitt:

PHP:
  //Wenn Fehler in aktuellem Feld, Fehler in SESSION schreiben
  if(!empty($err_messages[$checkfeld])){
      $errors = array();
      foreach ($err_messages[$checkfeld] as $errors) {
      $_SESSION['fehler'][$checkfeld][] = array($errors);
      }
  };

Wie lautet hier die korrekte foreach-Schleife?

Vorab schon mal Danke!
 
item: $err_messages[$checkfeld] wird erst in einem Fehlerfall initialisiert.
item: $err_messages = array(); solltest du vor der Schleife definieren, ansonsten wird der Array bei jedem Feld zurückgesetzt.

Du solltest diese Struktur versuchen
PHP:
$err_messages = array();
foreach($felder as $checkfeld) {
  $err_messages[$checkfeld] = array();
  //TODO: Prüfungen
  //$err_messages[$checkfeld][]='Fehlertext';
  if(!empty($err_messages[$checkfeld])){
      $errors = array();
      foreach ($err_messages[$checkfeld] as $errors) {
      $_SESSION['fehler'][$checkfeld][] = array($errors);
      }
  }    
}
 
Hi yaslaw,

nun funktioniert es zwar, dass die Fehlermeldungen mit print_r ausgegeben werden, jedoch in einem doppelten Array:

Code:
Array ( [0] => Array ( [0] => Dieses Feld ist ein Pflichtfeld. ) [1] => Array ( [0] => Dieses Feld muss mindestens 6 Zeichen lang sein. ) [2] => Array ( [0] => Bitte gib eine gültige E-Mail Adresse ein. ) )

Was ich letztendlich benötige ist, dass ich mittels echo $_SESSION['fehler']['email'] alle Fehler zu dem Feld ausgegeben bekomme, in Form von "Dieses Feld ist ein Pflichtfeld. Dieses Feld muss mindestens..." usw.

EDIT:

Ich habe nun den Abschnitt der for-schleife bearbeitet und aus
PHP:
$_SESSION['fehler'][$checkfeld][] = array($errors);
einfach
PHP:
 $_SESSION['fehler'][$checkfeld][] = $errors;
gemacht. Nun zeigt er mir mein normales Array an, so wie es sein sollte.

Wie kann ich nun dieses Array normal ausgeben, also nicht als "Array-Liste"?
 
Zuletzt bearbeitet:
PHP:
$_SESSION['fehler'][$checkfeld][] = array($errors);


Warum lässt du den ganzen foreach da nicht einfach weg und weist den bestehenden Array direkt zu?
PHP:
  if(!empty($err_messages[$checkfeld])){
      $_SESSION['fehler'][$checkfeld] = $err_messages[$checkfeld];
  };

Nachtrag:
Ich würde sicherheitshalber das if empty() weglasen, damit die Variable $_SESSION['fehler'[$checkfeld] mit einem leeren array überschrieben wird wenn alles gut ist. Ansonsten läufst du gefahr, dass da die alten Werte vom vorherigen lauf drinn bleiben (Session halt....)
 
Zuletzt bearbeitet:
stimmt. da haste recht. danke. hab es angepasst. aber wie lese ich nun das array korrekt aus? mit echo gehts nicht und mit print_r erhalte ich das array als array-aufzählung.
 
Zuletzt bearbeitet:
Jupp, hatte was geschrieben - angesendet - für falsch befunden - auf 'möp' geändert - neu getestet und neu geschrieben.
Jetzt ist der richtige Text drinn *g*
 
ahhh okay XD

Ich brauche das !empty gar nicht? Würde auf der nächsten Seite die einzelnen SESSION's mit unset() löschen, also alle, so dass $_SESSION['email'] (inhalt von email) und $_SESSION['fehler']['email'] dann wieder weg sind. Oder ist das "umständlich"? !empty drin lassen oder raus nehmen?

Und wie lautet dann die ausgabe?
 
ahhh okay XD

Ich brauche das !empty gar nicht? Würde auf der nächsten Seite die einzelnen SESSION's mit unset() löschen, also alle, so dass $_SESSION['email'] (inhalt von email) und $_SESSION['fehler']['email'] dann wieder weg sind. Oder ist das "umständlich"? !empty drin lassen oder raus nehmen?

Und wie lautet dann die ausgabe?

Das folgende gibt dir da Auskunft
PHP:
var_dump($_SESSION);
 
joar, mir var_dump() erhalte ich nun alle aktuelles SESSIONS. Also ich würde da dann einfach mit unset() auf der fehlerseite bzw. bestätigungseite die SESSIONS, die ich nicht mehr benötige löschen.

yaslaw, wie kann ich die SESSION
PHP:
$_SESSION['fehler']['email']
nun korrekt ausgeben lassen? mit print_r gibt er mir wie gesagt nur die Array-Liste aus. Möchte aber, dass nur die Inhalte ohne keys ausgeben werden.
 
Ah, du meinst die Ausgabe für den User... nicht die zum testen.

Mit print/echo und einem implode()
PHP:
echo implode('<br />', $_SESSION['fehler']['email']);
 
Zurück