Formchecker mit PHP

dann lag ich doch recht richtig. habe jetzt $htmlMessages noch als array definiert. Ich denke es dürfte passen, wenn ich die if-Abfrage ganz ans ende setzte, oder?

Wenn ich das Formular in der gleichen Datei wie den Code stehen habe und mit

PHP:
if (isset($_POST["submit"])) { CODE } else {echo "Nicht gesendet.";};
prüfe, funktioniert die else{}-Anweisung, jedoch gibt er mir im if{}-Teil den Fehler zurück, dass er die Klasse Checker() nicht finden kann. Warum ist das so? Der Code wird ja immerhin direkt in der Anweisung ausgeführt.
 
Zuletzt bearbeitet:
Was weiss ich wie du den Code im Moment zusammengewurstelt hast? Dein Code-Ausschnit sieht richtig aus, aber er sagt auch gar nix aus zu dem Problem das du hast.

Hast du die Checker-Klasse in der Datei drin?
 
klar. Diese kommt direkt nach der Felder-Definition und der for-Schleife. Hier mal der Code:

PHP:
<?php

error_reporting(E_ALL ^ E_NOTICE);

//Prüfen ob Formular versendet wurde
//Wenn nicht, nur Formular anzeigen, ansonsten Code ausführen
if (isset($_POST["submit"])) {

//Definition erstellen
$check = new Checker('vorname');
$check->addDef(Checker::C_MANDATORY_FIELD, true);
$check->addDef(Checker::C_MIN_LENGTH, 3);
$check->addDef(Checker::C_MAX_LENGTH, 15);
$check->addDef(Checker::C_REGEXP, "/^[a-zA-Z]+$/s", 'Dieses Feld darf nur Buchstaben beinhalten');
$checks['vorname'] = $check; 

$check = new Checker('nachname');
$check->addDef(Checker::C_MANDATORY_FIELD, true);
$check->addDef(Checker::C_MIN_LENGTH, 3);
$check->addDef(Checker::C_MAX_LENGTH, 20);
$check->addDef(Checker::C_REGEXP, "/^[a-zA-Z]+$/s", 'Dieses Feld darf nur Buchstaben beinhalten');
$checks['nachname'] = $check;
    
//Eingabe prüfen
$valid = true;

foreach($checks as $name => $check){
   $htmlMessages = array();
   $valid = $check->check($_POST[$name]) ? $valid : false;
   $htmlMessages[$name] = $check->getHtmlMessage();
}                   

Class Checker{
  /**
   * Konstanten um den Check-Type zu definieren
   */
  const C_MANDATORY_FIELD = 'mandatory';
  const C_MIN_LENGTH = 'min';
  const C_MAX_LENGTH = 'max';
  const C_REGEXP = 'regexp';
  
  protected $messages = array(); 
  protected $checks = array();
  protected $fieldName;
  protected $htmlMessage;
  public $valid = false;

  public function __construct($fieldName){
      $this->fieldName = $fieldName;
  }
  
  /**
   * Definition hinzufügen
   * @param $type     String      Eine der Klassenkonstanten elche dei Check-Typen definieren
   * @param $arg      Variant     Argument zur Prüfung
   * @param $msg      String      Optional: Fehlermessage
   */
  public function addDef($type, $arg, $msg = NULL){
      $this->checks[] = array(
          'type'  => $type, 
          'arg'   => $arg, 
          'msg'   => $msg);    
  }
  
  /**
   * Führt die Prüfung eines Wertes durch
   * @param $value    Variant     Zu prüfenden Wert
   * @return          Boolean
   */
  public function check($value){
      $this->messages = array();
      $this->valid = true;
      foreach($this->checks as $check){
          $checkFunction = $check['type'];         
          $this->valid = $this->$checkFunction($check['arg'], $value, $check['msg']) ? $this->valid : false;           
      }
      if($this->valid){
          $this->htmlMessage =  "Feld {$this->fieldName} mit dem Inhalt '{$value}' ist gültig";
      }else{
          $this->htmlMessage = "Feld {$this->fieldName} mit dem Inhalt '{$value}' ist ungültig:<br />";
          $this->htmlMessage .= implode('<br />', $this->messages);
      }
      return $this->valid;
  }
  
  /**
   * Gibt die HTML-Message der Prüfung aus
   * @return          String
   */
  public function getHtmlMessage(){
      return $this->htmlMessage;
  } 
  
  /**
   * Interne Funktion um ggf die Message in den Array zu schreiben
   * @param $invalid  Boolean     Angabe ob die Prüfung fehlgeschlagen ist
   * @param $message  String
   * @return          Boolean     Der Valid-Wert.
   */
  protected function setFail($invalid, $message){
      if($invalid) $this->messages[] = $message;
      return !$invalid;
  }
  
  /**
   * Prüfung auf Mandatory
   * @param $arg      Boolean     Angabe ob ein Wert enthalten sein muss
   * @param $value    Variant     Prüfwert
   * @param $msg      String      Optional
   * @return          Boolean
   */
  protected function mandatory($arg, $value, $msg = NULL){
      if (!isset($msg)) $msg = 'Dieses Feld ist ein Plichtfeld';
      return $this->setFail($arg && empty($value), $msg);
  }

  /**
   * Prüfung auf Minimum
   * @param $arg      Integer     Minimum
   * @param $value    Variant     Prüfwert
   * @param $msg      String      Optional
   * @return          Boolean
   */
  protected function min($arg, $value, $msg = NULL){
      if (!isset($msg)) $msg = "Dieses Feld muss mindestens {$arg} Zeichen beinhalten";
      return $this->setFail(strlen($value) < $arg, $msg);
  }

  /**
   * Prüfen auf Maximum
   * @param $arg      Integer     Maximum
   * @param $value    Variant     Prüfwert
   * @param $msg      String      Optional
   * @return          Boolean
   */
  protected function max($arg, $value, $msg = NULL){
      if (!isset($msg)) $msg = "Dieses Feld darf maximal {$arg} Zeichen beinhalten";       
      return $this->setFail(strlen($value) > $arg, $msg);
  }

  /**
   * Prüfen mittels Regulärem Ausdruck
   * @param $arg      String      Pattern
   * @param $value    Variant     Prüfwert
   * @param $msg      String      Optional
   * @return          Boolean
   */
  protected function regexp($arg, $value, $msg = NULL){      
      if (!isset($msg)) $msg = "Dieses Feld muss dem Regulären Ausdruck {$arg} entsprechen";
      return $this->setFail(preg_match($arg, $value)==0, $msg);
  }    
}
} else {echo "Nicht gesendet.";}
?>
 
Nimm die Klasse aus dem if() heraus. Sie sollte nicht innerhelb einer Kontrolstruktur stehen.
PHP:
if([prüfung]){
    code
}else{
    code
}

class Checker{
...
}
 
Wenn ich die Klasse darunter setze gibt er mir einen Fehler in der for-Schleife aus. Habe nun die definitionen über die IF-Abfrage gelegt und die Klasse Checker per include darunter eingebunden. Funktioniert nun alles. Vielen Dank yaslaw. Hoffe das das Script vielen anderen auch helfen wird.
 
Zurück