Enrico: Beliebige Formulare prüfen: guter Ansatz ? >>> Problem

Hallo,

leider beschäftigt mich das Thema "Formulare mit PHP prüfen" immer noch mehr als gewaltig.

Um etwaige Einbindungsfehler mit einzubeziehen, gebe ich Euch mal den kompletten Code an und möchte mich an dieser Stelle gleich mal für mein langes Posting entschuldigen:

=-=-=-=-=-=-=-=-=-=-=-
Datei "Gaestebuch.php"
=-=-=-=-=-=-=-=-=-=-=-

Diese Datei ist die Steuerzentrale meines Gästebuches und bindet, je nach übergebenem Wert der Variable "Aktion" die entsprechenden Dateien ein.

Hier klappt alles, bis auf die Überprüfung der Eingaben. Somit werde ich mich auch nur auf diesen Teil beschränken:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
  <head>
    ...
  </head>
  <body>
    ...
    <?php

include 'Inc/PHP/Gaestebuch_Variablen.php';

$Aktion = isset ($_REQUEST ['Aktion']) ? trim ($_REQUEST ['Aktion']) : "";

switch ($Aktion)
      {
        ...
        case "Eintrag_speichern":
        {
          include $Pfad . 'Validierung_Variablen.php';
          include $Pfad . 'Validierung_Funktionen.php';
          include $Pfad . 'Validierung.php';
          include $Pfad . 'Gaestebuch_Eintrag_speichern.php';
          break;
        }
      }
    ?>
  </body>
</html>

=-=-=-=-=-=-=-=-=-=-
Gaestebuch_Variablen
=-=-=-=-=-=-=-=-=-=-

Hier definiere ich u.a. die auszufüllenden Pflichtfelder:

$Pflichtfeld = array ("Name"     => "Ja",
                      "eMail"    => "Nein",
                      "Homepage" => "Nein",
                      "Text"     => "Ja");

=-=-=-=-=-=-=-=-=-=-=-=-=
Validierung_Variablen.php
=-=-=-=-=-=-=-=-=-=-=-=-=

In dieser Datei definiere ich jediglich die Fehlermeldungen nach folgendem MUSTER:

$Laenge= array ("Name"  => array ("min" => 3,
                                  "max" => 30));

Die Fehlermeldungen werden ähnlich definiert, nur dass ich hier keine Nummernzuweisungen habe:

$Fehler = array ("Name" => array ("Eingabe fehlt",
                                  "Du musst Deinen Namen eingeben"));

=-=-=-=-=-=-=-=-=-=-=-=-=-
Validierung_Funktionen.php
=-=-=-=-=-=-=-=-=-=-=-=-=-

In dieser Datei werden alle Funktionen abgelegt, die ich zur Überprüfung verwende:

Sorgenkind ist hier folgende Funktion:

function Laenge_pruefen ($Feld_Name, $Feld_Inhalt, $min, $max)
{
  if (strlen ($Feld_Inhalt) === 0)
  {
    if ($Pflichtfeld [$Feld_Name] === "Ja")
      $Fehlermeldung .= $Feld_Name . "<ul><li>" . $Fehler [$Feld_Name][0] . "<ul><li>" . $Fehler [$Feld_Name][1];

return false;
  }
  else
    if (strlen ($Feld_Inhalt) < $min)
    {
      $Fehlermeldung .= "Feld "" . $Feld_Name . ""<ul><li>" . $Fehler [$Feld_Name][2] . "<ul><li>" . $Fehler [$Feld_Name][3];
      return false;
    }
    else
      if (strlen ($Feld_Inhalt) > $max)
      {
        $Fehlermeldung .= "Feld "" . $Feld_Name . ""<ul><li>" . $Fehler [$Feld_Name][4] . "<ul><li>" . $Fehler [$Feld_Name][5];
        return false;
      }

return true;
}

Diese Funktion bildet den Kern der Überprüfung, da hier die Länge der Eingabe und auch die Pflichtfelder geprüft werden.

=-=-=-=-=-=-=-=
Validierung.php
=-=-=-=-=-=-=-=

global $HTTP_POST_VARS;
global $HTTP_GET_VARS;

$Methode  = (isset ($HTTP_POST_VARS)) ? "Post"          : "Get";
$Formular = ($Methode == "Post")      ? $HTTP_POST_VARS : $HTTP_GET_VARS;

$Fehlermeldung = "<ul><li>";

foreach ($Formular as $Feld_Name => $Feld_Inhalt)
{
  if (isset ($Laenge [$Feld_Name]["min"])) // [1]
  {
    $Laenge_ok = Laenge_pruefen ($Feld_Name,
                                 $Feld_Inhalt,
                                 $Laenge [$Feld_Name]["min"],
                                 $Laenge [$Feld_Name]["max"]); // [2]

if ($Laenge_ok === true) // [3]
    {
      switch ($Feld_Name)
      {
        case "Name":
        {
          ...
        }
        ...
      }
    }
  }
}

$Fehlermeldung .= "</ul></ul></ul>";

if (strlen ($Fehlermeldung) > 23)
  echo $Fehlermeldung;

Hiermit sollen Formulare überprüft werden, unabhängig davon, wie sie übergeben wurden (mit "post" oder mit "get").

Da mit meiner foreach-Schleife auch weitere, für mich unnötige Felder übergeben werden, will ich die Überprüfung auf die Felder einschränken, die ich auch wirklich überprüfen will. Diese Felder filtere ich mit der Überprüfung [1] heraus, da ich bei allen zu überprüfenden Feldern eine Grössenangabe definiert habe.

Wenn das aktuelle Formularfeld eine Grössendefinition besitzt ([1]), dann wird die Länge der Eingabe geprüft. Dieser Funktion wird der Name des Feldes, dessen Inhalt und die Grenzwerte für die minimale und die maximale Länge übergeben [2].

Und genau hier scheitert meine Prüfung.

Diese Funktion gibt mir keine Fehlermeldung aus, liefert aber auch keine Fehlermeldung(en), d.h. syntaktisch ist alles richtig.

Mir ist aufgefallen, dass meine Definitionen für Pflichtfelder und die Längenangaben "ignoriert" werden und ich weiss absolut nicht, warum.

Die Unterstriche, die ich verwendet habe, kommen später noch weg, stellen aber aktuell auf meinem Rechner noch kein Problem dar.

Woran liegt es, dass meine Prüfung nicht funktioniert ?

Schon mal vielen Dank für Eure Zeit und Eure Lösungsvorschläge.

Gruss, Enrico

  1. Hi Enrico,

    Sorgenkind ist hier folgende Funktion:

    jo.

    function Laenge_pruefen ($Feld_Name, $Feld_Inhalt, $min, $max)
    {

    global $Pflichtfeld,$Fehlermeldung,$Fehler;

    if (strlen ($Feld_Inhalt) === 0)
      { ...

    HTH,
      Carsten

    P.S: Das mit 'global' zu lösen ist natürlich nicht so toll, aber ich denke das kriegste dann schon hin...

    1. Hallo Carsten,

      die Ergänzung "global hat leider auch nichts gebracht, ich bekomme nach wie vor keine Fehlermeldung der Prüfung auf dem Bildschirm.

      Sind meine Definitionen (Pflichtfelder, Längenbereiche) so in Ordnung, wie ich sie notiert habe ?

      Gruss, Enrico

      1. Hm...

        ...nichts gebracht...

        dann ist da noch was faul. So auf Anhieb sehe ich das aber nicht.
        Bau doch mal ein paar echos an den entscheidenen Stellen ein, damit du siehst welchen Entscheidungspfad das Programm langläuft.

        Wird Laenge_pruefen() überhaupt aufgerufen, wenn ja: welcher der vier möglichen returns wird genommen?

        foreach ($Formular as $Feld_Name => $Feld_Inhalt)
        {
          echo "Prüfung für $Feld_Name => $Feld_Inhalt<br>";

        if (isset ($Laenge [$Feld_Name]["min"])) // [1]
          {
             echo " Prüfung auf Länge min ".$Laenge [$Feld_Name]["min"]."<br>";
             ....

        Carsten

        1. In der Tat "Hm..."   :o)

          Über echo werden mir alle Werte korrekt ausgegeben...

          Und trotzdem funktioniert's nicht...

          Enrico