KD-one: Variablen mehrere Möglichkeiten Wahlweise zuweisen

Hallo alle,

ist es möglich eine Variable in der Form

$var="wert1" || "wert2" || "wert3";

zu definieren, oder muss ich für jeden Wert eine eigene Variable definieren?
Eine Bedingung soll dann zutreffen, wenn einer der Werte wahr ist.
Wenn es so wie oben nicht möglich ist, müsste ich die Bedingungen verknüpfen, was schon wesentlich aufwendiger wäre.

Frohes Fest euch allen!

Kurt

--
"Die Destination des Menschen liegt in der Weisheit, die es zu erlangen gilt."  (Moriartes, gr. Philosoph, 314-244 v. Chr.)"
http://elektro-dunzinger.at
http://shop.elektro-dunzinger.at
  1. Hello Kurt,

    du bist noch hier und nicht unterm Weihnachtsbaum?

    ist es möglich eine Variable in der Form
    $var="wert1" || "wert2" || "wert3";

    Du meinst also als Set of Values. PHP kennt das leider nicht.
    Da kannst Du nur ein "Array" eröffnen, was  natürlich wesentlich mehr Speicherplatz benötigt.

    $_var = array("wert1","wert2","wert3");

    Das kann dann mit

    if (in_array($needle,$_var))
    {
      echo "Wert $needle ist in $_var enthalten<br />";
    }

    abgefragt werden.

    http://de.php.net/manual/de/function.in-array.php

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    1. Hallo Tom,

      du bist noch hier und nicht unterm Weihnachtsbaum?

      Nö, der Mohr hat seine Schuldigkeit getan, der Mohr kann gehen... ;-)

      ist es möglich eine Variable in der Form
      $var="wert1" || "wert2" || "wert3";

      Du meinst also als Set of Values. PHP kennt das leider nicht.
      Da kannst Du nur ein "Array" eröffnen, was  natürlich wesentlich mehr Speicherplatz benötigt.

      $_var = array("wert1","wert2","wert3");

      Das kann dann mit

      if (in_array($needle,$_var))
      {
        echo "Wert $needle ist in $_var enthalten<br />";
      }

      abgefragt werden.

      http://de.php.net/manual/de/function.in-array.php

      Danke dir.
      Noch schönes Feiern! :-)

      Gruß

      Kurt

      --
      "Wer der Meinung ist, dass er fuer Geld alles haben kann, geraet leicht in den Verdacht, dass er fuer Geld alles zu tun bereit ist."  (Benjamin Franklin; am. Politiker; 1706-1790)
      http://elektro-dunzinger.at
      http://shop.elektro-dunzinger.at
      1. Hello,

        du bist noch hier und nicht unterm Weihnachtsbaum?

        Nö, der Mohr hat seine Schuldigkeit getan, der Mohr kann gehen... ;-)

        Danke dir.
        Noch schönes Feiern! :-)

        Ich bin der andere Mohr ;-))

        Liebe Grüße aus http://www.braunschweig.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        1. Hallo Tom,

          Ich bin der andere Mohr ;-))

          Uii, da wird's einem ja ganz schwarz vor Augen... :o)

          Gruß

          Kurt

          --
          "Wenn du einen Menschen gluecklich machen willst, dann fuege nichts seinen Reichtuemern hinzu, sondern nimm ihm einige von seinen Wuenschen."  (Epikur von Samos; gr. Philosoph; 341-271 v.Chr.)
          http://elektro-dunzinger.at
          http://shop.elektro-dunzinger.at
    2. Hallo Tom und alle anderen auch,

      Nun hab ich mein erstes eigenes PHP-Script "fast" ohne fremde Hilfe geschrieben.
      Ich würde euch bitten, mal drüberzuschauen, ob irgendwo der Wurm drinnen ist, oder ob sich irgendwo noch etwas vereinfachen lässt, was ich, wenn ich meinen Kenntnisstand berücksichtige, fast annehme. ;-).
      Hochladen möchte ich es erst, wenn ich halbwegs sicher sein kann, daß ich da keine Fehler eingebaut habe, sonst fällt die Site komplett aus. :-)
      ---------------------------------------------------------------------------
      <?php
      if (empty($_GET["content"]))
        {
         include "includes/welcometext.txt";
       }
      elseif ((isset($_GET["content"])) && ($_GET["content"])=="guestbook"))
        {
         include "guestbook/gaestebuch.php";
        }
      elseif ((isset($_GET["content"]))  && ($_GET["content"])!="guestbook"))
        {
        foreach($_GET["content"] as $key=>$elem)
           {
            $site = $elem;
           }
        $path = "includes";
        $all = array("frontpage","tabellen","robots");
        $htm = array("refresh","umfliessen","nocache","anker");
        $css = array("extern","tableformat","tablecenter","input","textlinks","raender","mauszeiger");
        $ie  = array("scrollbars","fixed");
        $jav = array("comment","location","2frames","cell","celltext");
        $pop = array("link","variable","onload","time","unload","center","nesting");
        $scr = array("preload","date","ticker","pictick");
        $dyn = array("3dnavigation");
         if (in_array($site, $all))
           {
           $subpath = "allgemein";
           }
          elseif (in_array($site, $htm))
           {
           $subpath = "html";
           }
          elseif (in_array($site, $css))
           {
           $subpath = "css";
           }
          elseif (in_array($site, $ie))
           {
           $subpath = "css/ie";
           }
          elseif (in_array($site, $jav))
           {
           $subpath = "javascript";
           }
          elseif (in_array($site, $pop))
           {
           $subpath = "javascript/popups";
           }
          elseif (in_array($site, $scr))
           {
           $subpath = "javascript/scripte";
           }
          elseif (in_array($site, $dyn))
           {
           $subpath = "dhtml";
           }
        include $path."/".$subpath."/".$site;
        }
       ?>
      ---------------------------------------------------------------------------
      Ich habe versucht, die Generierung der URL nun zu automatisieren, da ich dann nicht jedesmal bei Erweiterungen die Abfragen überall einfügen muss, sondern nur noch im entsprechenden Array.
      Wenn das so geht, wie ich mir das vorstelle, werden sämtliche Scripte sucsessive auf diese Form umgestellt.
      Danke gleich mal fürs kontrollieren und
      Gruß

      Kurt

      --
      "Nur der Irrtum ist das Leben, und das Wissen ist der Tod."  (Johann Christoph Friedrich Schiller; dt. Dichter u. Schriftsteller; 1759-1805)
      http://elektro-dunzinger.at
      http://shop.elektro-dunzinger.at
      1. Hallo Tom und alle anderen auch,

        Bin grad draufgekommen, daß ich einen Fehler eingebaut hab:
        Es gehört noch definiert:

        $res = $site.".txt";

        und der includepfad schaut dann so aus:

        include $path."/".$subpath."/".$res;

        Gruß

        Kurt

        --
        "Ironie ist keine Waffe, eher ein Trost der Ohnmaechtigen."  (Ludwig Marcuse; dt. Publizist u. Schriftsteller; 1894-1971)
        http://elektro-dunzinger.at
        http://shop.elektro-dunzinger.at
        1. Hallo Tom und alle anderen auch,

          Ich hab`s doch gewagt, und nun läuft es in leicht abgewandelter Form:

          <?php
          if ((empty($_GET["content"])) || (!isset($_GET["content"])))
            {
             include "includes/welcometext.txt";
           }
          elseif ((isset($_GET["content"])) && (($_GET["content"])=="guestbook"))
            {
             include "guestbook/gaestebuch.php";
            }
          elseif ((isset($_GET["content"]))  && (($_GET["content"])!="guestbook"))
            {
            foreach($_GET as $key=>$elem)
               {
                $site = $elem;
               }
            $path = "includes";
            $all = array("frontpage","tabellen","robots");
            $htm = array("refresh","umfliessen","nocache","anker");
            $css = array("extern","tableformat","tablecenter","input","textlinks","raender","mauszeiger");
            $ie  = array("scrollbars","fixed");
            $jav = array("comment","location","2frames","cell","celltext");
            $pop = array("link","variable","onload","time","unload","center","nesting");
            $scr = array("preload","date","ticker","pictick");
            $dyn = array("3dnavigation");
            $res = $site.".txt";
             if (in_array($site, $all))
               {
               $subpath = "allgemein";
               }
              elseif (in_array($site, $htm))
               {
               $subpath = "html";
               }
              elseif (in_array($site, $css))
               {
               $subpath = "css";
               }
              elseif (in_array($site, $ie))
               {
               $subpath = "css/ie";
               }
              elseif (in_array($site, $jav))
               {
               $subpath = "javascript";
               }
              elseif (in_array($site, $pop))
               {
               $subpath = "javascript/popups";
               }
              elseif (in_array($site, $scr))
               {
               $subpath = "javascript/scripte";
               }
              elseif (in_array($site, $dyn))
               {
               $subpath = "dhtml";
               }
            include $path."/".$subpath."/".$res;
            }
           ?>

          Nun würde mich eigentlich nur noch interessieren, was die Profis zu dem Konstrukt sagen.
          Gibt es da noch Verbesserungspotential? Worauf habe ich vergessen oder was könnte zu Problemen führen?

          Gruß

          Kurt

          --
          "Eine gute Rede ist eine Ansprache, die das Thema erschoepft, aber keineswegs die Zuhoerer."  (Winston Churchill; br. Politiker; 1874-1925)
          http://elektro-dunzinger.at
          http://shop.elektro-dunzinger.at
          1. Hello Kurt,

            if ((empty($_GET["content"])) || (!isset($_GET["content"])))
              {
               include "includes/welcometext.txt";
             }

            das muss eigentlich anders herum:

            if ((!isset($_GET["content"])) || (empty($_GET["content"])))

            Denn eine nicht gesetzte Variable kann man nicht auf empty() prüfen. Das müsste dann eine Notice geben. Wenn zum Testen

            Error_Reporting(E_ALL);

            am Anfang des Scriptes steht, wird es Dir acuh angezeigt.

            Liebe Grüße aus http://www.braunschweig.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            1. Hallo Tom,

              das muss eigentlich anders herum:

              if ((!isset($_GET["content"])) || (empty($_GET["content"])))

              Denn eine nicht gesetzte Variable kann man nicht auf empty() prüfen. Das müsste dann eine Notice geben. Wenn zum Testen

              Error_Reporting(E_ALL);

              am Anfang des Scriptes steht, wird es Dir acuh angezeigt.

              Nö, da wird nichts angezeigt. Ich hab's trotzdem mal umgedreht, sicherheitshalber. ;-)
              Was sagste zum Rest? Gibt's da noch mehr verbesserungswürdiges?

              Gruß

              Kurt

              --
              "Wir lernen aus Erfahrung, dass die Menschen nichts aus Erfahrung lernen."  (George Bernhard Shaw; ir. Dramatiker; 1856-1950)
              http://elektro-dunzinger.at
              http://shop.elektro-dunzinger.at
              1. Hello,

                if (empty($_GET["content"]))

                Denn eine nicht gesetzte Variable kann man nicht auf empty() prüfen. Das müsste dann eine Notice geben. Wenn zum Testen

                http://de.php.net/manual/de/function.empty.php

                Hab das nochmal nachgelesen. Die Funktion empty() darf auch auf eine nicht definierte Variable angesetzt werden. Dann kannst Du Dir !isset() sparen.

                Liebe Grüße aus http://www.braunschweig.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                1. Hallo Tom,

                  Oh, ja, Danke!
                  Dann wünsch ich die eine gute Nacht!

                  Gruß

                  Kurt

                  --
                  "Tu soviel Gutes, wie Du kannst, und mache so wenig Gerede wie nur moeglich darueber."  (Charles Dickens; engl. Schrifsteller; 1812-1870)
                  http://elektro-dunzinger.at
                  http://shop.elektro-dunzinger.at
          2. Moin!

            Dein Skript ist _sehr_ konfus und umständlich. Da blickt man nach zwei Wochen nicht mehr wirklich durch, was jetzt wann wo wie geprüft wird und zu welchen Resultaten führt.

            So wie ich das Skript subsummieren würde: Du hast im Prinzip eine große Tabelle gültiger Werte für "content" und prüfst, welche Seite du jeweils includieren mußt.

            Punkt 1: Ich liebe mod_rewrite. Ich würde niemals auf die Idee kommen, die Auslieferung von Content einem URL-Parameter zu überlassen, sondern immer eine vernünftige URL-Struktur aufbauen, die vollkommen ohne URL-Parameter auskommt.

            mod_rewrite spielt seine Stärken dann aus, wenn es in der httpd.conf definiert wird, aber auch mit .htaccess kann man noch alles realisieren.

            In deinem Fall würde ich also die einzelnen Seiten über eine vernünftige URL ansprechen:
            /css/extern.html
            /allgemein/frontpage.html
            /javascript/popups/variable.html

            Diese Struktur wird per mod_rewrite komplett auf ein Skript geleitet, welches die angeforderte URL dann auseinandernimmt und die gewünschten Teile zusammenbastelt bzw. includiert.

            mod_rewrite kann dabei schon direkt prüfen, ob die gewünschte Datei existiert - andernfalls wird PHP garnicht erst gestartet, sondern gleich mit Status 404 geantwortet.

            Das nur zur Gedankenanregung, wie man es eigentlich machen sollte (nach meiner Meinung). Wenn man sich nämlich von der Notwendigkeit löst, dass die öffentlichen URLs immer mit existierenden Dateien korrespondieren müssen, hat man bei Umstrukturierungen und Skriptveränderungen wesentlich weniger Probleme. Man erstellt einfach ein neues URL-zu-Datei-Schema und behält dadurch alle existierenden Links, Suchmaschinenergebnisse und -Rankings.

            Punkt 2: Dein Skript ist kompliziert, obwohl eigentlich nur eine recht simple Sache erledigt werden soll: Das Mapping von $_GET['content'] auf den String $path."/".$subpath."/".$res.

            Ich würde sowas grundsätzlich wesentlich tabellarischer aufziehen. Das macht es nämlich wesentlich durchschaubarer, was da passiert.

            Dazu am Ende mehr.

            Punkt 3: Kommentare zu deinem Skript.

            <?php
            if ((empty($_GET["content"])) || (!isset($_GET["content"])))
              {
               include "includes/welcometext.txt";

            Das ist der Default-Fall. Sowas ganz am Anfang ist eher ungewöhnlich.

            }
            elseif ((isset($_GET["content"])) && (($_GET["content"])=="guestbook"))
              {
               include "guestbook/gaestebuch.php";
              }
            elseif ((isset($_GET["content"]))  && (($_GET["content"])!="guestbook"))
              {

            Immer, wenn mehrere ELSEIF kommen, sollte man sich die Frage stellen, ob nicht auch mit SWITCH gearbeitet werden könnte.

            Außerdem: Wäre ein ELSE für den zweiten Fall nicht irgendwie zutreffender. Überlege dir, was hier passiert:

            Zuerst wird geprüft, ob content leer ist, oder nicht existiert.

            Das erste elseif wird also nur erreicht, wenn content existiert und nicht leer ist. Es wird ausgeführt, wenn content den String "guestbook" enthält.

            Das zweite elseif wird nur erreicht, wenn content existiert, nicht leer ist, und nicht den String "guestbook" enthält.

            Also der klassische Fall für ein else, weil das garantiert "alle anderen Fälle" abfängt.

            foreach($_GET as $key=>$elem)
                 {
                  $site = $elem;
                 }

            Warum foreach? Warum den Inhalt jedes Elements wegwerfen, außer dem letzten?

            $path = "includes";

            Feste Definitionen gehören an den Anfang, nicht in irgendein IF-Konstrukt. Dort kann man sie leicht entdecken und global für das Skript ändern.

            $all = array("frontpage","tabellen","robots");
              $htm = array("refresh","umfliessen","nocache","anker");
              $css = array("extern","tableformat","tablecenter","input","textlinks","raender","mauszeiger");
              $ie  = array("scrollbars","fixed");
              $jav = array("comment","location","2frames","cell","celltext");
              $pop = array("link","variable","onload","time","unload","center","nesting");
              $scr = array("preload","date","ticker","pictick");
              $dyn = array("3dnavigation");
              $res = $site.".txt";

            Diese Definitionen sind nicht wirklich übersichtlich. Außerdem gehörten sie meiner Meinung nach in ein Array. Weil: Es sind viele gleichartige Definitionen, die alle in gleicher Weise behandelt werden.

            if (in_array($site, $all))
                 {
                 $subpath = "allgemein";
                 }
                elseif (in_array($site, $htm))
                 {
                 $subpath = "html";
                 }
                elseif (in_array($site, $css))
                 {
                 $subpath = "css";
                 }
                elseif (in_array($site, $ie))
                 {
                 $subpath = "css/ie";
                 }
                elseif (in_array($site, $jav))
                 {
                 $subpath = "javascript";
                 }
                elseif (in_array($site, $pop))
                 {
                 $subpath = "javascript/popups";
                 }
                elseif (in_array($site, $scr))
                 {
                 $subpath = "javascript/scripte";
                 }
                elseif (in_array($site, $dyn))
                 {
                 $subpath = "dhtml";
                 }

            Massen von ELSEIFs sind immer ein Zeichen dafür, dass man SWITCH nehmen sollte.

            include $path."/".$subpath."/".$res;
              }
             ?>

            Ok, es wird hoffentlich deutlich, dass du irgendwie ganz häufig dieselbe Aufgabe erledigst, dafür aber immer neu Code schreibst.

            Sowas kann man sehr geschickt vereinfachen.

            Und da wären wir wieder bei Punkt 2. Ich liste mal auf, was in das Skript reinkommt und welcher Text includet werden soll:

            $_GET['content']  File
            guestbook         guestbook/gaestebuch.php

            frontpage         includes/allgemein/frontpage.txt
            tabellen          includes/allgemein/tabellen.txt
            robots            includes/allgemein/robots.txt

            refresh           includes/html/refresh.txt
            umfliessen        includes/html/umfliessen.txt
            nocache           includes/html/nocache.txt
            anker             includes/html/anker.txt

            So eine Tabelle ist in meinen Augen sehr übersichtlich.

            Und wenn du diese Tabelle exakt in ein Array kopierst, kriegst du die ganze Aufgabe in meinen Augen wesentlich einfacher hin:

            $seitenliste = array(
            // Gästebuch
            "guestbook" => "guestbook/gaestebuch.php",
            // allgemeine Seiten
            "frontpage" => "includes/allgemein/frontpage.txt",
            "tabellen"  => "includes/allgemein/tabellen.txt",
            "robots"    => "includes/allgemein/robots.txt",
            // HTML-Themen
            "refresh"   => "includes/html/refresh.txt"
            //...

            )

            Und am Ende reicht dann ein simples:

            if (isset($_GET['content']) && isset($seitenliste[$_GET['content']]))
            {
              include $seitenliste[$_GET['content']];
            }
            else
            {
              include 'includes/welcometext.txt';
            }

            Vorteil: Du hast zwar eine lange Auflistung von Inhaltsschlüsselwörtern und ihnen zugeordnete Seiten, aber diese Liste ist geordnet, kann kommentiert werden, und wenn sie unübersichtlich wird, dann liegt das nur daran, dass du ein ungünstiges Schema gewählt hast.

            Die eigentliche Funktion, basierend auf einem existierenden, definierten Keyword die passende, hoffentlich existierende Seite einzubinden, ist sehr simpel und kurz - da kann garantiert nichts schiefgehen. Entweder $_GET['content'] ist gesetzt und im Array $seitenliste existiert ein dazu passender Eintrag, oder nicht.

            Zurück zu Punkt 1: Virtuelle URL-Strukturen und (das sei hinzugefügt) sinnvolle Dateibenennungen.

            Ich nehme an, dass deine zu includierenden Seiten keine kompletten HTML-Seiten sind - aber sie deswegen ".txt" zu nennen, ist in meinen Augen nicht unbedingt zielführend. Und die von dir ausgedachte Zuordnung von "ein Schlüsselwort" zu "eine bestimmte Seite einer Rubrik" ist auch URL-mäßig nicht wirklich ideal. Denn das führt de facto zwar dazu, dass du im Dateisystem mehrere Verzeichnisse mit nach Thema getrennten Dateien hast, aber eben in deiner URL nicht.

            Genausogut könntest du alle deine Dateien auch in ein einziges Verzeichnis packen. Weil du ja jedes Keyword nur ein einziges Mal vergeben kannst. Du hast in der URL (im Parameter "content") nicht die Sortierung, die du im Verzeichnis hast - und das ist schlecht.

            Im Prinzip würde ich daher mod_rewrite an den Start bringen und folgendes machen:
            1. Du baust dir eine Verzeichnisstruktur auf, die du URL-mäßig abbildest, und die deinem Content gerecht wird:
            www.example.com/guestbook/gaestebuch.html
                           /allgemein/frontpage.html
                           /html/refresh.html
            ... und so weiter

            2. Du baust dir ein Skript, welches mit der angegebenen URL (ohne Domain) zurechtkommt und die darin angegebene Datein includiert.

            3. Mit mod_rewrite leitest du alle Zugriffe, die auf "^/.*$" kommen, auf ein dieses Seitenauslieferungsskript um. Optional kannst du mit einer RewriteCond schon vorher prüfen, ob die gewünschte Datei tatsächlich existiert.

            Resultat: Du hast ein tolles URL-Schema, welches du in Links vernünftig benutzen kannst. Du mußt dir insbesondere nicht mehr merken, welches Keyword du denn für die Datei vergeben hast, und in welchem Verzeichnis sie steckt, weil das alles im Link drinsteht. Bei neuen Dateien siehst du Konflikte mit existierenden Dateien sofort, weil der gleiche Dateiname im gleichen Verzeichnis eben auffällt (beim bisherigen System kannst du ohne Probleme eine html/refresh.txt und eine javascript/refresh.txt haben, und mußt die dann über zwei unterschiedliche Keywords auseinanderhalten - das führt mit Sicherheit zu Verwechslungen).

            Das Seitenauslieferungsskript erledigt dann alle dynamischen Einbindungen, die notwendig sind, an zentraler Stelle.

            - Sven Rautenberg

            --
            Die SelfHTML-Developer sagen Dankeschön für aktuell 20885,68 Euro Spendengelder!
            1. Hallo Sven,

              Uii, das war starker Tobak. Ich hab schon damit gerechnet, daß mein Script durchaus verbesserungswürdig ist, aber daß ich in fast allen Punkten soweit daneben liege, war ein kleiner Schock.

              Punkt 1: Ich liebe mod_rewrite. Ich würde niemals auf die Idee kommen, die Auslieferung von Content einem URL-Parameter zu überlassen, sondern immer eine vernünftige URL-Struktur aufbauen, die vollkommen ohne URL-Parameter auskommt.

              mod_rewrite habe ich zur Zeit noch nicht zur Verfügung. Meine Seiten sind zwar schon transferiert, aber die Freischaltung erfolgt erst in einigen Tagen.

              In deinem Fall würde ich also die einzelnen Seiten über eine vernünftige URL ansprechen: /css/extern.html /allgemein/frontpage.html /javascript/popups/variable.html

              Diese Struktur wird per mod_rewrite komplett auf ein Skript geleitet, welches die angeforderte URL dann auseinandernimmt und die gewünschten Teile zusammenbastelt bzw. includiert.

              Da ich mit dem Apache bisher noch nichts zu tun hatte und dies eigentlich meinen ersten Versuch darstellen würde, über den Apache, bzw. seine Module, soetwas zu realisieren, werde ich vermutlich lange brauchen, so etwas zu realisieren. Nichts desto trotz werde ich das aber versuchen, jedoch bis dahin, meine bestehende Struktur aufrechterhalten. Die Optimierung der Scripte bietet mir ja, wenn es auch nur für einige Tage/Wochen ist, die Möglichkeit, viel dazuzulernen und die Abläufe besser zu verstehen, auch wenn die Scripte danach auch nutzlos würden. Ausserdem stehe ich dann nicht unter Zeitdruck, wenn ich dem Apachen zu Leibe rücke. :-)

              mod_rewrite kann dabei schon direkt prüfen, ob die gewünschte Datei existiert - andernfalls wird PHP garnicht erst gestartet, sondern gleich mit Status 404 geantwortet.

              Punkt 2: Dein Skript ist kompliziert, obwohl eigentlich nur eine recht simple Sache erledigt werden soll: Das Mapping von $_GET['content'] auf den String $path."/".$subpath."/".$res.

              Ja, als es fertig war und ich es mir ansah, dachte ich auch, welch ein Aufwand im Verhältnis zum Ergebnis. Deshalb habe ich es auch zur Gänze hier hereingestellt, weil ich mir ziemlich sicher war, daß sich das wesentlich einfacher lösen ließe, mir aber der Blick auf die Möglichkeiten fehlte.

              Ich würde sowas grundsätzlich wesentlich tabellarischer aufziehen. Das macht es nämlich wesentlich durchschaubarer, was da passiert.

              Dazu am Ende mehr.

              Punkt 3: Kommentare zu deinem Skript.

              <?php if ((empty($_GET["content"])) || (!isset($_GET["content"])))   {    include "includes/welcometext.txt";

              Das ist der Default-Fall. Sowas ganz am Anfang ist eher ungewöhnlich.

              Ich habe versucht, beim aufbau eine logische Struktur zu verfolgen, wobei es mir hilfreich war, alle Fälle, die von dem Script nicht behandelt werden sollten, bereits im Vorfeld auszuschliessen, um mich dann auf den, für mich, komplizierteren Teil zu konzentrieren. Daß ich dabei viel zu kompliziert dachte, ist mir nach dem Lesen deines Postings auch klar geworden. :-)

              } elseif ((isset($_GET["content"])) && (($_GET["content"])=="guestbook"))   {    include "guestbook/gaestebuch.php";   } elseif ((isset($_GET["content"]))  && (($_GET["content"])!="guestbook"))   {

              Immer, wenn mehrere ELSEIF kommen, sollte man sich die Frage stellen, ob nicht auch mit SWITCH gearbeitet werden könnte.

              Ja, da hast du recht, allerdings war ich so in der Struktur gefangen, daß ich gar nicht auf die Idee kam, das es da einen besseren Weg gäbe. :-)

              Außerdem: Wäre ein ELSE für den zweiten Fall nicht irgendwie zutreffender. Überlege dir, was hier passiert:

              Zuerst wird geprüft, ob content leer ist, oder nicht existiert.

              Das erste elseif wird also nur erreicht, wenn content existiert und nicht leer ist. Es wird ausgeführt, wenn content den String "guestbook" enthält.

              Das zweite elseif wird nur erreicht, wenn content existiert, nicht leer ist, und nicht den String "guestbook" enthält.

              Also der klassische Fall für ein else, weil das garantiert "alle anderen Fälle" abfängt.

              Ok, da hst du recht. Das habe ich eigentlich gar nicht bedacht.

              foreach($_GET as $key=>$elem)      {       $site = $elem;      }

              Warum foreach? Warum den Inhalt jedes Elements wegwerfen, außer dem letzten?

              Wiel ich nicht wusste, wie ich es sonst anstellen soll, den Schlüsselwert zu erhalten, mit dem ich dann weiterarbeiten konnte. Aber in einem hast du recht: Ich hätte auch

              foreach($_GET as $elem)       {        $site = $elem;       }

              schreiben können, dann wäre nur der Wert abgefragt worden, der mich interessiert. Trotzdem ist dieses Konstrukt unsauber, da es durchaus vorkommen kann, das $_GET mehrere Schlüssel/Wertpaare enthält und die Schleife mehrmals durchlaufen werden müsste, um eine Entsprechung zu erhalten. Allerdings wusste ich nicht, wie ich es angehen sollte, direkt den Wert des Schlüssels, der mich interessiert, anzusprechen. Das war halt das Ergebnis eines Versuches, mit ungenügendem Grundwissen etwas zustande zu bringen. Nur zum Verständnis: Wie könnte man so etwas ohne foreach() realisieren? Liefert mir $_GET["content"] den Schlüssel oder den Wert, sodaß man das so zuweisen könnte?

              $site = $_GET["content"] ???

              $path = "includes";

              Feste Definitionen gehören an den Anfang, nicht in irgendein IF-Konstrukt. Dort kann man sie leicht entdecken und global für das Skript ändern.

              Klar, da gebe ich dir recht. Irgendwie hat mir das auch nicht gefallen, habe es aber nicht geändert, weil ich darüber nachgedacht habe, diesen Wert in weiterer Folge ebenfalls nicht fest zu vergeben, sondern auch variabel zu gestalten. Das war mir aber für den Anfang ein wenig zu viel, erstmal wollte ich eine solche Analyse abwarten, wie ich sie nun von dir erhalten habe.

              $all = array([...])  $res = $site.".txt";

              Diese Definitionen sind nicht wirklich übersichtlich. Außerdem gehörten sie meiner Meinung nach in ein Array. Weil: Es sind viele gleichartige Definitionen, die alle in gleicher Weise behandelt werden.

              Ok, es wird hoffentlich deutlich, dass du irgendwie ganz häufig dieselbe Aufgabe erledigst, dafür aber immer neu Code schreibst.

              Sowas kann man sehr geschickt vereinfachen.

              Und da wären wir wieder bei Punkt 2. Ich liste mal auf, was in das Skript reinkommt und welcher Text includet werden soll:

              $_GET['content']  File guestbook         guestbook/gaestebuch.php

              frontpage         includes/allgemein/frontpage.txt tabellen          includes/allgemein/tabellen.txt robots            includes/allgemein/robots.txt

              refresh           includes/html/refresh.txt umfliessen        includes/html/umfliessen.txt nocache           includes/html/nocache.txt anker             includes/html/anker.txt

              So eine Tabelle ist in meinen Augen sehr übersichtlich.

              Stimmt. Allerdings lande ich hier bei meinem ersten, großen Problem. Ich habe Bücher gewälzt, Seiten durchsucht, aber nirgens einen Hinweis darauf gefunden, was "=>" das nun wirklich bedeutet und was es explizit tut.  Diese Syntax wird nirgens extra aufgeführt und auch nirgens erklärt. So gesehen, ist deine nachfolgende Syntax für mich eigentlich nicht verständlich. Es funktioniert zwar, aber ich weiss nicht, warum. Deshalb ist es mir auch nicht möglich, so etwas mit logischem Nachdenken zu entwickeln.

              Und wenn du diese Tabelle exakt in ein Array kopierst, kriegst du die ganze Aufgabe in meinen Augen wesentlich einfacher hin:

              $seitenliste = array( // Gästebuch "guestbook" => "guestbook/gaestebuch.php", // allgemeine Seiten "frontpage" => "includes/allgemein/frontpage.txt", "tabellen"  => "includes/allgemein/tabellen.txt", "robots"    => "includes/allgemein/robots.txt", // HTML-Themen "refresh"   => "includes/html/refresh.txt" //...

              )

              Und am Ende reicht dann ein simples:

              if (isset($_GET['content']) && isset($seitenliste[$_GET['content']])) {   include $seitenliste[$_GET['content']]; } else {   include 'includes/welcometext.txt'; }

              Vorteil: Du hast zwar eine lange Auflistung von Inhaltsschlüsselwörtern und ihnen zugeordnete Seiten, aber diese Liste ist geordnet, kann kommentiert werden, und wenn sie unübersichtlich wird, dann liegt das nur daran, dass du ein ungünstiges Schema gewählt hast.

              Die eigentliche Funktion, basierend auf einem existierenden, definierten Keyword die passende, hoffentlich existierende Seite einzubinden, ist sehr simpel und kurz - da kann garantiert nichts schiefgehen. Entweder $_GET['content'] ist gesetzt und im Array $seitenliste existiert ein dazu passender Eintrag, oder nicht.

              Klar, das ist durchaus verständlich.

              Zurück zu Punkt 1: Virtuelle URL-Strukturen und (das sei hinzugefügt) sinnvolle Dateibenennungen.

              Ich nehme an, dass deine zu includierenden Seiten keine kompletten HTML-Seiten sind - aber sie deswegen ".txt" zu nennen, ist in meinen Augen nicht unbedingt zielführend.

              Warum? Diese Vorgehensweise stammt noch aus Zeiten mit Frontpage, da es die, in diesem Fall, unangenehme Eigenschaft hat, jeder Datei mit der Endung*.htm(l) automatisch einen Head und einen Body zu verpassen. Deshalb speichere ich meine Includes eigentlich immer als *.txt-Dateien ab. Was spricht dagegen, was spricht für eine anderer Vorgehensweise?

              Und die von dir ausgedachte Zuordnung von "ein Schlüsselwort" zu "eine bestimmte Seite einer Rubrik" ist auch URL-mäßig nicht wirklich ideal. Denn das führt de facto zwar dazu, dass du im Dateisystem mehrere Verzeichnisse mit nach Thema getrennten Dateien hast, aber eben in deiner URL nicht.

              Gut, das Dateisystem will ich so, weil es für mich einfach einfacher verwaltbar und zuordenbar ist. Daß das Dateisystem nicht dem URL-System entspricht, ist ein Manko.

              Genausogut könntest du alle deine Dateien auch in ein einziges Verzeichnis packen. Weil du ja jedes Keyword nur ein einziges Mal vergeben kannst. Du hast in der URL (im Parameter "content") nicht die Sortierung, die du im Verzeichnis hast - und das ist schlecht.

              Im Prinzip würde ich daher mod_rewrite an den Start bringen und folgendes machen:

              1. Du baust dir eine Verzeichnisstruktur auf, die du URL-mäßig abbildest, und die deinem Content gerecht wird: www.example.com/guestbook/gaestebuch.html                /allgemein/frontpage.html                /html/refresh.html ... und so weiter

              [...]

              Das Seitenauslieferungsskript erledigt dann alle dynamischen Einbindungen, die notwendig sind, an zentraler Stelle.

              Ok, ich werde mir das mal im Hinterkopf behalten und später umsetzen. Danke dir für diese sehr erschöpfende Analyse.

              Gruß

              Kurt

              --
              "Schoene Tage - nicht weinen, dass sie vergangen, sondern laecheln, dass sie gewesen."  (Rabindranath Tagore; ind. Philosoph, Dichter u. Maler; 1861-1941) http://elektro-dunzinger.at http://shop.elektro-dunzinger.at
            2. Hallo Sven,

              Ich liebe deine Art, kleine Fehler einzubauen, damit copy & paste nicht funktioniert.

              Das regt zum Nach-/Durchdenken an. ;-)

              Gruß

              Kurt

              --
              "Was man muehelos erreichen kann, ist gewoehnlich nicht der Muehe wert, erreicht zu werden."  (Sprichwort)
              http://elektro-dunzinger.at
              http://shop.elektro-dunzinger.at