EnricoL: Problem mit dem Durchwechseln von Grafiken

Hallo und guten Abend,

mich plagt schon seit etlichen Nächten das Problem mit dem Durchwechseln von Grafiken.

Zu Beginn meiner Datei wird der Wert der Variable $Richtung_Nr abgefragt:

$Richtung_Nr = $_REQUEST["Richtung_Nr"];

Existiert die Variable noch nicht, weil die Homepage gerade erst aufgerufen wurde, so wird
ihr Wert mit "0" initialisiert:

if ($Richtung_Nr == "")
      $Richtung_Nr = "0";

Diese Variable kann folgende Werte enthalten, die die Sortierung einer Tabelle einleiten:

0 = ursprünglicher Zustand
   1 = aufsteigende Sortierung
   2 = absteigende Sortierung

Die Sortierung spielt in diesem Zusammenhang aber keine Rolle, da ich noch nicht so weit bin.

Im nächsten Schritt frage ich den Wert der Variable ab, um (theoretisch) die unterschiedlichen
Zustände vorzubereiten:

switch ($Richtung_Nr)
   {
      case "0":
      {
         $Nr_inaktiv  = $Grafik_0;
         $Nr_aktiv    = $Grafik_1;
         $Richtung_Nr = "1";
         break;
      }

case "1":
      {
         $Nr_inaktiv  = $Grafik_2;
         $Nr_aktiv    = $Grafik_3;
         $Richtung_Nr = "2";
         break;
      }

case "2":
      {
         $Nr_inaktiv  = $Grafik_4;
         $Nr_aktiv    = $Grafik_5;
         $Richtung_Nr = "1";
         break;
      }
   }

Der Link, der anhand dieser Werte angezeigt wird, hat folgenden Aufbau:

<a href="<?php echo $_SERVER["PHP_SELF"]; ?>?Aktion=Nach_Nr_sortieren&Richtung=<?php echo $Richtung_Nr; ?>"
      onMouseOver="Nr.src='<?php echo $Nr_aktiv; ?>'"
      onMouseOut="Nr.src='<?php echo $Nr_inaktiv; ?>'"
      onFocus="if(this.blur)this.blur()"
      onClick="this.blur();">Nr.</a>

Seltsamerweise komme ich aber nie über den Wert "1" hinaus und das ist es, was ich absolut nicht verstehe, da
ich der Variable $Richtung_Nr den Wert "1" zuweise, sofern sie beim Eintritt in den switch-Block den Wert "0"
hat bzw. den Wert "2" zuweise, wenn sie mit dem Wert "1" belegt ist und die OnMouseOut-Grafik wird auch nicht
entsprechend angepasst.

Hier einmal der komplette Code bis dahin:

$Pfad     = "../../GRAFIKEN/NAVIGATION/";
   $Grafik_0 = $Pfad . "0.png";
   $Grafik_1 = $Pfad . "1.png";
   $Grafik_2 = $Pfad . "2.png";
   $Grafik_3 = $Pfad . "3.png";
   $Grafik_4 = $Pfad . "4.png";
   $Grafik_5 = $Pfad . "5.png";

$Aktion         = $_REQUEST["Aktion"];
   $Richtung_Nr    = $_REQUEST["Richtung_Nr"];
   $Richtung_Titel = $_REQUEST["Richtung_Titel"];
   $Richtung_Genre = $_REQUEST["Richtung_Genre"];
   $Richtung_FSK   = $_REQUEST["Richtung_FSK"];

if ($Richtung_Nr == "")
      $Richtung_Nr = "0";

if ($Richtung_Titel == "")
      $Richtung_Titel = "0";

if ($Richtung_Genre == "")
      $Richtung_Genre = "0";

if ($Richtung_FSK == "")
      $Richtung_FSK = "0";

if ($Aktion == "")
   {
      $Nr_inaktiv = $Titel_inaktiv = $Genre_inaktiv = $FSK_inaktiv = $Grafik_0;
      $Nr_aktiv   = $Titel_aktiv   = $Genre_aktiv   = $FSK_aktiv   = $Grafik_1;
   }
   else
   {
      switch ($Aktion)
      {
         case "Titel_suchen":
         case "Filter_setzen":
         case "Verliehene_Filme":
         case "Sammlung_exportieren":
         case "Hilfe":
         {
            $Nr_inaktiv = $Titel_inaktiv = $Genre_inaktiv = $FSK_inaktiv = $Grafik_0;
            $Nr_aktiv   = $Titel_aktiv   = $Genre_aktiv   = $FSK_aktiv   = $Grafik_1;
            break;
         }

case "Titel_suchen":
         {

break;
         }

case "Filter_setzen":
         {

break;
         }

case "Nach_Nr_sortieren":
         {
            $Titel_inaktiv  = $Genre_inaktiv  = $FSK_inaktiv  = $Grafik_0;
            $Titel_aktiv    = $Genre_aktiv    = $FSK_aktiv    = $Grafik_1;
            $Richtung_Titel = $Richtung_Genre = $Richtung_FSK = "0";

switch ($Richtung_Nr)
            {
               case "0":
               {
                  $Nr_inaktiv  = $Grafik_0;
                  $Nr_aktiv    = $Grafik_1;
                  $Richtung_Nr = "1";
                  break;
               }

case "1":
               {
                  $Nr_inaktiv  = $Grafik_2;
                  $Nr_aktiv    = $Grafik_3;
                  $Richtung_Nr = "2";
                  break;
               }

case "2":
               {
                  $Nr_inaktiv  = $Grafik_4;
                  $Nr_aktiv    = $Grafik_5;
                  $Richtung_Nr = "1";
                  break;
               }
            }

break;
         }

case "Nach_Titel_sortieren":
      {
         $Nr_inaktiv  = $Genre_inaktiv  = $FSK_inaktiv  = $Grafik_0;
         $Nr_aktiv    = $Genre_aktiv    = $FSK_aktiv    = $Grafik_1;
         $Richtung_Nr = $Richtung_Genre = $Richtung_FSK = "0";

switch ($Richtung_Titel)
         {
            ... usw ...
         }
      }
      ... usw ...
   }

Woran liegt es, dass ich hier nicht über den Wert "1" hinauskomme und die Grafiken nicht entsprechend angepasst
werden, so wie ich es angegeben habe ?

Vielen Dank für Eure Mithilfe.

Liebe Grüße
EnricoL

  1. Hello,

    ich stelle mir gerade bildhaft vor, was passieren würde, wenn Du das Error-Reporting für die Entwicklung dieses Scriptes mal auf E_ALL stellen würdest und display_errors auf true.

    Das müsste doch soviele Meldungen geben, dass Dir schlecht wird.

    Liebe Grüße

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    1. Hallo Tom,

      hmmm, das klingt ja nicht gerade aufbauend...

      Sofern die Fehler-Konsole von Firefox auch bei PHP-Code anspringt,
      so kommen hier keine Meldungen.

      Ich benutze XAMPP, wo kann ich denn das Error-Reporting einstellen,
      wie Du es geschrieben hast ?

      Wobei ich nicht verstehe, WO ich in meinem Code so viele Fehler
      gemacht haben sollte, es geht ja "nur" um die Zuweisung von Werten.

      Gruß
      EnricoL

      1. Hi,

        Sofern die Fehler-Konsole von Firefox auch bei PHP-Code anspringt,
        so kommen hier keine Meldungen.

        D'oh! Wo Laeuft PHP ab? Nein, *nicht* clientseitig.

        Ich benutze XAMPP, wo kann ich denn das Error-Reporting einstellen,
        wie Du es geschrieben hast ?

        http://www.php.net/manual/de/configuration.php

        Wobei ich nicht verstehe, WO ich in meinem Code so viele Fehler
        gemacht haben sollte, es geht ja "nur" um die Zuweisung von Werten.

        Na dann lass' dich ueberraschen, sobald du PHP erlaubt hast, dich auf deine Fehler hinzuweisen.

        MfG ChrisB

  2. Tach.

    mich plagt schon seit etlichen Nächten das Problem mit dem Durchwechseln von Grafiken.

    Da Du noch immer mit Deiner komplizierten Version unterwegs bist, nehme ich an, daß Dir meine Antwort auf Deinen letzten Thread (inzwischen im Archiv) entgangen ist ...

    --
    Once is a mistake, twice is Jazz.
    1. Ohhhhh, in der Tat ist mir Deine Antwort entgangen...

      Werd' ich mir dann gleich mal anschauen.

      Danke für den Hinweis :-)

      Gruß
      EnricoL

  3. echo $begrüßung;

    Du erzählst etwas anderes als du nachher als Code stehen hast.

    Zu Beginn meiner Datei wird der Wert der Variable $Richtung_Nr abgefragt:
       $Richtung_Nr = $_REQUEST["Richtung_Nr"];

    Du fragst sie nicht ab, du weist der Variablen $Richtung_Nr den Wert des Arrayelements $_REQUEST["Richtung_Nr"] zu. Dabei interessierst du dich nicht, ob dieses Element überhaupt existiert.

    Existiert die Variable noch nicht, weil die Homepage gerade erst aufgerufen wurde, so wird
    ihr Wert mit "0" initialisiert:

    if ($Richtung_Nr == "")
          $Richtung_Nr = "0";

    Nun, du hast sie ja eben angelegt, also existiert sie. Nur ist ihr Inhalt nicht "" sondern NULL, weil beim vorhergehenden Abfragen der nicht existierenden Variable NULL zurückgegeben wurde. Du verlässt dich hier auf PHPs eingebauten Mechanismus der automatischen Typkonvertierung, wodurch NULL als Leerstring interpretiert wird.
    Außerdem fragt man die Existenz einer Variablen mit der Funktion isset() ab. Diese kann man auch gefahrlos auf nicht existierende Variablen anwenden.

    Zu deinem Verständnis: Alles was ein Request mitbringt sind keine Variablen. Der Request ist aus der Sicht eines Webservers nichts weiter als ein Haufen Text. Der Webserver extrahiert daraus einige Werte, und PHP stellt sie dir freundlicherweise in den bekannten vordefinierten Arrays zur Verfügung. Erst jetzt kann man von Variablen sprechen, da Arrayelemente unter PHP auch nichts weiter als Variablen sind.

    $_REQUEST kann man nehmen, das ist aber eine Zusammenfassung aus $_GET, $_POST und $_COOKIE. Es ist eindeutiger, wenn du auf $_REQUEST verzichtest und direkt auf das spezialisierte Array zugreifst, in dem du den Wert erwartest. Du verwendest ja sicher HTML-Code, der eindeutig einen GET- oder POST-Request erzeugt oder schiebst dem Client vorher einen Cookie zu. Also lass diese Eindeutigkeit auch bei der Auswertung nicht außer Acht.

    Seltsamerweise komme ich aber nie über den Wert "1" hinaus und das ist es, was ich absolut nicht verstehe,

    Zum Verständnis der Arbeitsweise eines Programms ist eines der grundlegenden Hilfsmittel die Kontrollausgabe der Variablenwerte. Diese stimmen oftmals nicht mit der eigenen Vorstellung überein, wenn man sich verprogrammiert hat. Ein echo reicht in einfachen Fällen. Eindeutig wird es mit var_dump(), denn diese Funktion gibt auch den Typ einer Variablen mit aus. Bei Strukturen, wie Arrays und Objekten, hilft außerdem noch print_r(). Ein Blick in den HTML-Quellcode oder ein vorangestelltes <pre> verhilft bei diesen komplexen Variablen zu einer übersichtlicheren Darstellung.

    $Aktion         = $_REQUEST["Aktion"];
       $Richtung_Nr    = $_REQUEST["Richtung_Nr"];
       $Richtung_Titel = $_REQUEST["Richtung_Titel"];
       $Richtung_Genre = $_REQUEST["Richtung_Genre"];
       $Richtung_FSK   = $_REQUEST["Richtung_FSK"];

    Abgesehen von der oben schon erwähnten Verwendung von $_REQUEST und des ungeprüften Zugriffs darauf, ist es im Prinzip eine typische Anfänger-Unart, die Inhalte der vordefinierten Arrays in andere Variablen umzukopieren. Array-Elemente unterscheiden sich in Nichts von einzelnen Variablen. Einzelne Variablen haben zudem den Nachteil, dass man ihre Herkunft nicht sofort erkennen kann. Man muss sich unnötigerweise zusätzlich merken, dass diese nichts anderes enthalten als einen Wert des Requests. Ein $_GET/$_POST/$_COOKIE ist immer sofort als Benutzereingabe zu erkennen. Die oft verwendete Ausrede, $wert ließe sich einfacher als $_GET['wert'] notieren, wird abgewiesen, eine Revision ist nicht zugelassen. :-) Ist dir die Verständlichkeit auch für die Zukunft oder deine eigene vorübergehende Bequemlichkeit lieber?

    Woran liegt es, dass ich hier nicht über den Wert "1" hinauskomme und die Grafiken nicht entsprechend angepasst werden, so wie ich es angegeben habe ?

    Ermittle dies mit den erwähnten Kontrollausgaben. Ebenso wichtig ist die Kontrolle aller Hinweismeldungen, die dir PHP geben kann. Per Default sind aber die Meldungen vom Typ Notice vom Error-Reporting ausgenommen. Doch beim Entwickeln sollte man darauf nicht verzichten. Notice-Meldungen geben Hinweise auf Zugriffe auf nicht vorhandene Variablen. Auch Tippfehlern kommt man so auf die Spur. Diese liefern sonst stillschweigend NULL zurück, was ja durch die automatische  Typumwandlung mal als 0 mal als Leerstring interpretiert wird.
    Im einfachsten Fall verwendet man die Funktion error_reporting() mit dem Parameter E_ALL. In der Entwicklungsumgebung ist es jedoch günstiger, sich den Wert in der php.ini einzustellen. Dass dies korrekt übernommen wurde kontrolliert man dann mit der phpinfo()-Ausgabe, ebenso dass display_errors auf on steht.

    echo "$verabschiedung $name";

    1. echo $begrüßung;

      Nachtrag:

      Zum Verständnis der Arbeitsweise eines Programms ist eines der grundlegenden Hilfsmittel die Kontrollausgabe der Variablenwerte.

      Ein weiteres Hilfsmittel, besonders bei verschachtelten, bedingt abzuarbeitenden Code-Teilen, ist es hilfreich, sich eine eindeutige Ausgabe in diese Code-Teile zu setzen, um zu kontrollieren, dass die Abarbeitung auch an dieser Stelle vorbeikommt.

      echo "$verabschiedung $name";