Formchecker mit PHP

Hey yaslaw,

ja das mit der foreach Schleife hatte ich gerstern abend noch ähnlich gebastelt. Nicht ganz so schick wie du eben.

Jetzt ist jedoch $count nicht belegt. Nehme ich $count raus, kommt

Code:
Fatal error: Call to undefined function checkArray() in /test-check.php on line 34

Das wäre dann

PHP:
    $valid = $checkFunctionName($_POST[$fieldName], $messages);

diese Zeile.

Also momentan steige ich da leider gar nicht mehr durch was jetzt genau passiert. Ziel soll es ja sein, dass ich ein gloables Array habe, in dem ich alle Felder (nicht nur die des aktuellen Formulars) definiere. (wird dannn per inculde eingespielt).

In diesem Array sollten optimalerweise auch gleich die passenden Fehlermeldungen stehen.

Wenn ich jetzt ein Formular habe, definiere ich oben die Felder, die ich tatsächlich für dieses brauche. Bzw. ist die überhaupt nötig, oder wird das per foreach ausgelöst, dass er guckt welche Felder alle gesendet wurden?

Zu guter letzt wäre es schick, wenn ich nicht für jedes Feld eine eigene Funktion benötige, sondern eine Funktion in einer weiteren Schleife habe, wo z.B. der Funktionsname checkVorname variabel generiert wird.

Klingt alles ziemlich komplex, aber das Ergebnis wäre dann ein flexibel anpassbares Script welches so glaube ich noch nicht existiert.

So und nun nochmal zum Anfang:

Ich simuliere mit
PHP:
$_POST = array('vorname' => 'y1');
das Feld Vorname, welches eigentlich per foreach ja automatisch ausgelesen wird, right? Btw. kann ich diese Zeile ja auch weg lassen, insofern ich den Inhalt direkt per Formular eingeben. Oder?

EDIT: Hier der komplette Code, der momentan vorhanden ist:

PHP:
<?php

error_reporting(E_ALL);

//$_POST simulieren
$_POST = array('vorname' => 'y1');

//Alle verfügbaren Felder der Plattform
$GLOBALS['FELD'] = array();
$GLOBALS['FELD']['vorname']    = array('minlength' => "3",  'maxlength' => "15",  'characters' => "\/^[a-zA-Z]+$/s");

//Zu prüfende Felder des aktuellen Formulars
$checkfields = array("vorname", "nachname");

//$valid ist nur true, wenn alle Felder korrekt ausgefüllt wurden
$valid = true;

foreach($checkfields as $index => $field){
  $checkanweisung = "check$checkfields";
  $valid = check($field, $checkanweisung, $htmlMessage) ? $valid : false;
  $htmlMessages[$index] = $htmlMessage;
} 

//$valid hat ist nur true wenn alle Prüfungen erfolgreich waren.

/**
 * führt einen Check aus und gibt die Fehlermeldung aus
 * @param String        in      Name des zu prüfenden Wertes
 * @param String        in      Name der Check-Funktiom
 * @param String        out     Rückgabe der Fehlermeldung
 * @return Boolean              Valid
 */
function check($fieldName, $checkFunctionName, &$htmlMessage){
    $valid = $checkFunctionName($_POST[$fieldName], $messages);
    $htmlMessages = array();
    if($valid){
        $htmlMessages =  "Feld {$fieldName} mit dem Inhalt '{$_POST[$fieldName]}' ist gültig";
    }else{
        $htmlMessages = "Feld {$fieldName} mit dem Inhalt '{$_POST[$fieldName]}' ist ungültig:<br />";
        $htmlMessages .= implode('<br />', $messages);
    }
    return $valid; 
}

//==== Check-Funktion für "Vorname" 
function checkVorname($value, &$messages){ 
    $messages = array(); 
    $valid = true; 
    if(strlen($value) < $GLOBALS['FELD']['vorname']['minlength']){ 
        $valid = false; 
        $messages[] = 'vorname muss mindestens '.$GLOBALS['FELD']['vorname']['minlength'].' Zeichen lang sein'; 
    }         
    if(strlen($value) > $GLOBALS['FELD']['vorname']['maxlength']){ 
        $valid = false; 
        $messages[] = 'vorname darf höchstens 15 Zeichen lang sein'; 
    }         
    if(preg_match('/^[a-zA-Z]+$/s', $value)==0){ 
        $valid = false; 
        $messages[] = 'vorname darf nur aus Buchstaben und _ bestehen';             
    }   
    return $valid;       
} 

?>
 
Zuletzt bearbeitet:
Mein Fehler.
PHP:
//ersetze
  $checkanweisung = "check$checkfields[$count]";
//durch
  $checkanweisung = "check{$field}";
 
Abschnitt korrigiert:

PHP:
//Zu prüfende Felder des aktuellen Formulars
$checkfields = array("Vorname");

//$valid ist nur true, wenn alle Felder korrekt ausgefüllt wurden
$valid = true;

foreach($checkfields as $index => $field){
  $checkanweisung = "check$field";
  $valid = check($field, $checkanweisung, $htmlMessage) ? $valid : false;
  $htmlMessages[$index] = $htmlMessage;
}

Ergebnis:

Code:
Notice: Undefined index: Vorname in

PHP:
    $valid = $checkFunctionName($_POST[$fieldName], $messages);
sowie in
PHP:
        $htmlMessages = "Feld {$fieldName} mit dem Inhalt '{$_POST[$fieldName]}' ist ungültig:<br />";
 
hoppala, antwort überschnitten. wäre der neue code korrekt oder soll ich den bisherigen code hernehmen und nur deine zeile ersetzen?

EDIT: Ist ja das gleiche bis auf []...

EDIT 2: also mit [] kommt
Code:
Fatal error: Call to undefined function check[Vorname]()
 
Zuletzt bearbeitet:
jop, habe jetzt
PHP:
$_POST = array('vorname' => 'y1');
rein genommen. Keine Fehlermeldung mehr, jedoch auch kein Ergebnis, etc. Also es werden nur die Eingabefelder ausgegeben.

Frage: Kann ich dieses array automatisch erstellen lassen? Also das alle Felder die per $_POST ankommen, direkt bekannt sind?
 
Zuletzt bearbeitet:
Ja. Lösch diese Zeile. Denn sie überschreibt $_POST das vom Formular kommt. Ich hatte das nur drin, weil ich bei meinen Tests kein Formular hatte. Darum steht auch mein Komantar dabei '//$_POST simulieren'.
 
erhalte nun wieder
Code:
Notice: Undefined index: vorname in
obwohl formular "gesendet" wurde.

EDIT: Sorry, Erhalte keinen Fehler sondern nur die leere Seite mit dem Formular zurück.

EDIT 2: Habe das Formular nun in test.php ausgelagert, Code befindet sich in test_check.php, Ergebnis: Bei Eingaben = Leere Seite, Ohne Eingaben = Fehler das "vorname" nicht vorhanden ist.

Zudem müsste ich
PHP:
//Alle verfügbaren Felder + Bedingungen per include einlesen
$GLOBALS['FELD'] = array();
$GLOBALS['FELD']['vorname']    = array('minlength' => "3",  'maxlength' => "15",  'characters' => "\/^[a-zA-Z]+$/s");
erweitern mit Fehlermeldungen sowie Pflichtfeld Ja/Nein

Pflichtfeld wäre also:
PHP:
$GLOBALS['FELD']['vorname']    = array('mandatory_field' => "yes", 'minlength' => "3",  'maxlength' => "15",  'characters' => "\/^[a-zA-Z]+$/s");
Aber wie ich nun einzelne Fehlermeldungen dazu gebe hab ich keinen blassen Schimmer.

EDIT 3:

Ohje, habe nun die Funktion check() mit print($htmlMessages); vervollständigt. Erhalte dadurch nun die passenden Fehlermeldungen aus der Funktion checkVorname() bzw. bei korrektem ausfüllen, dass das Feld gülit ist.

Nun stelle ich mir jedoch noch ein paar Fragen. Hier erstmal der aktuelle Code:

PHP:
<?php

error_reporting(E_ALL);

//Alle verfügbaren Felder + Bedingungen per include einlesen
$GLOBALS['FELD'] = array();
$GLOBALS['FELD']['vorname']      = array('mandatory_field' => "yes", 'minlength' => "3",  'maxlength' => "15",  'characters' => "\/^[a-zA-Z]+$/s");

//Zu prüfende Felder des aktuellen Formulars
$checkfields = array("vorname");

//$valid ist nur true, wenn alle Felder korrekt ausgefüllt wurden
$valid = true;

foreach($checkfields as $index => $field){
  $checkanweisung = "check$field";
  $valid = check($field, $checkanweisung, $htmlMessage) ? $valid : false;
  $htmlMessages[$index] = $htmlMessage;
} 

/**
 * führt einen Check aus und gibt die Fehlermeldung aus
 * @param String        in      Name des zu prüfenden Wertes
 * @param String        in      Name der Check-Funktiom
 * @param String        out     Rückgabe der Fehlermeldung
 * @return Boolean              Valid
 */
function check($fieldName, $checkFunctionName, &$htmlMessage){
    $valid = $checkFunctionName($_POST[$fieldName], $messages);
    $htmlMessages = array();
    if($valid){
        $htmlMessages =  "Feld {$fieldName} mit dem Inhalt '{$_POST[$fieldName]}' ist gültig";
        print($htmlMessages);
    }else{
        $htmlMessages = "Feld {$fieldName} mit dem Inhalt '{$_POST[$fieldName]}' ist ungültig:<br />";
        $htmlMessages .= implode('<br />', $messages);
        print($htmlMessages);
    }
    return $valid;
}

//==== Check-Funktion für "Vorname"

function checkVorname($value, &$messages){ 
    $messages = array(); 
    $valid = true; 
    if(strlen($value) < $GLOBALS['FELD']['vorname']['minlength']){ 
        $valid = false; 
        $messages[] = 'vorname muss mindestens '.$GLOBALS['FELD']['vorname']['minlength'].' Zeichen lang sein'; 
    }         
    if(strlen($value) > $GLOBALS['FELD']['vorname']['maxlength']){ 
        $valid = false; 
        $messages[] = 'vorname darf höchstens 15 Zeichen lang sein'; 
    }         
    if(preg_match('/^[a-zA-Z]+$/s', $value)==0){ 
        $valid = false; 
        $messages[] = 'vorname darf nur aus Buchstaben und _ bestehen';             
    }   
    return $valid;       
} 

?>

1. Fehlermeldungen im globalen Array speichern, aber wie?
2. Die Funktion checkVorname() variabel gestalten. Vermute mal, dass ich hier ebenfalls foreach() verwenden kann?
3. Fehlermeldungen, die tatsächlich verwendet werden in ein neues Array speichern, damit diese direkt beim Feld ausgebenen werden.

Doch erstmal zu 1. Wie kann ich dies nun lösen? Ich kann ja schlecht sagen
PHP:
$GLOBALS['FELD']['vorname']      = array('mandatory_field' => "yes" => 'Pflichtfeld Vorname nicht ausgefüllt, 'minlength' => "3" => 'Vorname muss mehr als 3 Zeichen haben')
usw.
 
Zuletzt bearbeitet:
Habe nun das Array erweitert:

PHP:
$GLOBALS['FELD'] = array();
$GLOBALS['FELD']['vorname']      = array('mandatory_field' => "yes",
                                         'mandatory_field_fehler' => "Dieses Feld ist ein Plichtfeld",
                                         'minlength' => "3",
                                         'minlength_fehler' => "Dieses Feld muss mindestens 3 Zeichen beinhalten",
                                         'maxlength' => "15",
                                         'maxlength_fehler' => "Dieses Feld darf maximal 15 Zeichen beinhalten",
                                         'characters' => "\/^[a-zA-Z]+$/s",
                                         'characters_fehler' => "Dieses Feld darf nur Buchstaben beinhalten");

Und die Funktion checkVorname() darauf angepasst:

PHP:
function checkVorname($value, &$messages){ 
    $messages = array(); 
    $valid = true;
    if($GLOBALS['FELD']['vorname']['mandatory_field'] = "yes") {
        if(empty($value)){ 
            $valid = false; 
            $messages[] = $GLOBALS['FELD']['vorname']['mandatory_field_fehler']; 
        }
    }
    if(strlen($value) < $GLOBALS['FELD']['vorname']['minlength']){ 
        $valid = false; 
        $messages[] = $GLOBALS['FELD']['vorname']['minlength_fehler']; 
    }         
    if(strlen($value) > $GLOBALS['FELD']['vorname']['maxlength']){ 
        $valid = false; 
        $messages[] = $GLOBALS['FELD']['vorname']['maxlength_fehler'];
    }         
    if(preg_match('/^[a-zA-Z]+$/s', $value)==0){ 
        $valid = false; 
        $messages[] = $GLOBALS['FELD']['vorname']['characters_fehler'];            
    }   
    return $valid;       
}

Haben sich hier noch Fehler eingeschlichen? Stimmt der Part mit "yes" oder nutze ich hier 'yes'?

Letztes TO-DO:
Die Funktion checkVorname() variabel gestalten, also check$field(), so dass diese Funktionen sich selbst erstellen und ausführen.

P.S.: Also das finde ich jetzt echt gelungen bisher, dank Dir.
 
Zuletzt bearbeitet:
Sodalö, hat jemand einen Tipp, wie ich einen Funktionsnamen + deren Inhalt variabel gestalten kann? Welche Schleife? Wie lege ich den Namen fest?

Danke schon mal.

Grüße QUEST08
 
Zurück