dedlfix: Variable mit Wert im Querystring, aber bei Abfrage "Null"

Beitrag lesen

Tach!

$Parameter = array ("Hauptmenue", "Untermenue", "Untermenue2", "Aktion", "Suche", "Nr", "Groesse", "Farbe");

$Whitelist = array ("/^Hauptmenue=\d{1,2}$/",
                       "/^Untermenue=\d{1}$/",
                       "/^Untermenue2=\d{1}$/",
                       "/^Aktion=[A-Za-z]*$/",
                       "/^Suche=\d{1}$/",
                       "/^Nr=\d{1,2}$/",
                       "/^Groesse=\d{1}$/",
                       "/^Farbe=\d{1,2}$/");

Dieses Konstrukt ist recht umständlich. Ein Array mit den Namen als Keys und den Mustern als Values täte es auch und wäre leichter zu pflegen und zu überblicken.

foreach ($_GET as $Schluessel => $Wert)
   {
      for ($i = 0; $i < count ($Parameter); $i++)
      {

Damit erwischt du nur die Werte, die auch übergeben wurden. Wenn du alle Pflichtparameter prüfen willst, brauchst du nun noch eine Extraliste, auf der du die bereits kontrollierten Parameter abhakst und am Schluss prüfst, ob was übrig geblieben ist.

Andersrum, wenn also die Parameterliste durchlaufen und dazu der GET-Parameter geprüft wird, fällt dir auf alle Fälle auf, wenn letzterer fehlt.

if ($Schluessel == $Parameter[$i]) {
            $ZuPruefen = $Parameter[$i] . '=' . $Wert;
            if (preg_match ($Whitelist[$i], $ZuPruefen))

Den Parameternamen brauchst du nicht in der Regexp zu prüfen, den hast du schon vergleichen. Das ist auch nicht sinnvoll, weil du ja eigentlich nur den Wert prüfen willst. Selbst wenn der Parametername nicht richtig groß/kleingeschrieben ist, wäre das (bei dir vermutlich) auch nicht weiter tragisch.

if ($_GET[$Parameter[$i]] !== null)

Das ist eine indirekte Prüfung. Man muss dazu wisssen, dass das Ergebnis beim lesenden Zugriff auf nicht vorhandene Variablen (und Array-Elemente) ein null zurückgibt. Außerdem bringt so ein Zugriff eine Notice-Meldung. Besser ist das Prüfen mit isset() oder empty().

In deinem Fall aber kann an dieser Stelle $_GET[$Parameter[$i]] nicht mehr nicht vorhanden sein, weil du ja schon vorher ... du machst das so umständlich, dass mir die Worte fehlen, die Prüfung zu beschreiben.

Außen vor geblieben sind jedenfalls die Parameter, die gar nicht im GET enthalten waren. Wenn du nun blauäugig auf einen solchen zugreifst, bekommst du eine Notice-Meldung und null.

Wenn ich nun, zu Testzwecken, über echo die Variablen "Groesse" und "Farbe" ausgeben lasse, dann wird mir nur der Wert der Variablen "Groesse" ausgegeben, aber nicht der Variablen "Farbe".

Dann verfolg den Weg zurück bis zu der Stelle, an der er erstellt werden soll.

Es wird mir aber auch keine Fehlermeldung ausgegeben, d.h. die Variable "Farbe" ist "Null", ohne dass ich aber irgendwelche weiteren Zuweisungen für diese beiden Variablen treffe.

error_reporting steht auch aauf E_ALL und display_errors auf on?

Mit FireBug habe ich noch nie gearbeitet, da ich mit diesem Addon absolut nicht zurecht komme, falls dies zur Lösungsfindung beitragen sollte, was ich aber ausschliessen kann, da die Adressleiste ja dagegen spricht, dass bei der Übergabe/Übermittlung ein Fehler vorliegt.

Firebug arbeitet mit dem Ergebnis im Browser, für die PHP-Fehlersuche kann er nichts weiter beitragen. Da reicht zu schauen, ob der Quelltext wie erwartet erzeugt wurde. Firebug ist da eher hinderlich, besonders wenn du das von ihm fehlerkorrigierte zum DOM interpretierten Baum anschaust.

dedlfix.