Lars: Menue in Homepage funktioniert nicht mehr

Hallo,

ich habe ein Problem mit meiner Homepage, die so einmal funktionierte.

Ich hatte das wie folgt realisiert:

Und zwar habe ich praktisch eine Konfigdatei (config.inc) angelegt und diese in meine index.php includet per

require("/home/www/config.inc");

Die config.inc ist folgendermassen aufgebaut:

if (!isset($site)) $site = "main.inc";
if ($site == "downloads") $site = "download.php";
if ($site == "impressum") $site = "impressum";
usw. ....

In meinem Menue habe ich dann praktisch folgendes stehen:

Downloads verlinkt mit => index.php?site=download
Impressum verlinkt mit  => index.php?site=impressum
usw. ...

In der index.php wird die Stelle wo die Seite aus der config.inc rein soll
folgendermassen definiert:

include ("/home/www/$site");

So hatte es einmal wie gesagt funktioniert damals zu php4 Zeiten. Inzwischen läuft da PHP 5.2.6 und funktioniert plötzlich nicht mehr.

Also mit funktioniert nicht mehr, meine ich, man kann im Menue anklicken was man möchte, aber es ändert sich nichts und die Seite wird auch nicht aufgerufen. Ich fand heraus, das es wohl mit Register Globals zu tun hat.

Nun habe ich versucht das wie folgt umzubauen:

Inhalt meiner config.inc:

if (!isset($_GET['site'])) $site = 'main.inc";
  elseif ($_GET['site'] == "downloads") $site = 'download.php';
  elseif ($_GET['site'] == "links") $site = 'links.php';
  elseif ($_GET['site'] == "kontakt") $site = 'kontakt.php';
  elseif ($_GET['site'] == "impressum") $site = 'impressum.php';
  elseif ($_GET['site'] == "about") $site = 'about.php';
  else $site = 'main.inc'; /* falls $_GET['site'] keinen gültigen Wert
                              besitzt */

Soweit so gut ...

Nur wie müste mein ursprünglicher Eintrag in meiner index.php:

include ("/home/www/$site");

umgebaut werden, das es damit funktioniert? Hab nun einige Varianten mal durchprobiert und bekomme unterschiedliche Parse Fehler ...

Kann mir da jemand zufällig weiterhelfen? Besten Dank vorab.

Viele Grüße

Lars

  1. Hi!

    if (!isset($_GET['site'])) $site = 'main.inc";

    ' versus "

    Lo!

    1. Hallo,

      if (!isset($_GET['site'])) $site = 'main.inc";

      ' versus "

      sorry, aber ich verstehe leider deine Antwort nicht bzw. was du mir damit sagen möchtest ...

      Lars

      1. Hi!

        if (!isset($_GET['site'])) $site = 'main.inc";
        ' versus "
        sorry, aber ich verstehe leider deine Antwort nicht bzw. was du mir damit sagen möchtest ...

        Schau dir die zitierte Zeile an und beachte diese beiden Zeichen.

        Lo!

        1. if (!isset($_GET['site'])) $site = 'main.inc';

          1. Mahlzeit Freundlicher Helfer,

            if (!isset($_GET['site'])) $site = 'main.inc';

            Es ist absolut kontraproduktiv, einem Hilfesuchenden lediglich eine (vermeintlich) korrigierte Code-Zeile ohne weitere Erklärungen oder Tipps hinzuwerfen (und das auch noch ohne Beachtung der Netiquette - Begrüßung oder Verabschiedung: Fehlanzeige).

            Im besten Fall kopiert der Fragesteller die Zeile einfach, baut sie irgendwo in seinen Code ein und dann? Entweder es funktioniert oder nicht. Aber warum es das Eine oder das Andere tut, ist für ihn vielleicht nicht sofort erkennbar. Was macht er dann also? Er stellt (hier oder woanders) entsprechende Nachfragen. Das ist zwar an sich nicht schlimm - nervt aber zumindest den Fragesteller ...

            Ich hatte das Ziel dieses Forums bisher so verstanden, dass Fragende hier (auch) etwas lernen sollten - das tun sie aber durch Antworten wie Deine *nicht*.

            MfG,
            EKKi

            --
            sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
            1. Hi,

              Es ist absolut kontraproduktiv, einem Hilfesuchenden lediglich eine (vermeintlich) korrigierte Code-Zeile ohne weitere Erklärungen oder Tipps hinzuwerfen (und das auch noch ohne Beachtung der Netiquette - Begrüßung oder Verabschiedung: Fehlanzeige).

              Ich denke der Oberlehrermodus der hier ständig zelebriert wird ist vor allem wenn der Hilfesuchende den ersten Tip nicht verstanden hat ebenfalls nicht angebracht.

              Gute Nacht

  2. Hi

    if (!isset($_GET['site'])) $site = 'main.inc";
      elseif ($_GET['site'] == "downloads") $site = 'download.php';
      elseif ($_GET['site'] == "links") $site = 'links.php';
      elseif ($_GET['site'] == "kontakt") $site = 'kontakt.php';
      elseif ($_GET['site'] == "impressum") $site = 'impressum.php';
      elseif ($_GET['site'] == "about") $site = 'about.php';
      else $site = 'main.inc'; /* falls $_GET['site'] keinen gültigen Wert
                                  besitzt */

    Na das sieht doch schon mal ganz gut aus. Was ich aber an deiner Stelle machen würde (beziehungsweise ich habe es mir angewöhnt), Variablen unterschiedlich zu benennen. Denn $_GET['site'] und $site kommen sich in die Quere, früher oder später. Deswegen nenne die Variable lieber "target" oder ähnliches.

    include ("/home/www/$site");

    Absolute Pfadangaben sollten nicht benutzt werden. Nimm lieber relative Pfadangaben: include("config/conf.php"); oder so ähnlich. Vielleicht hat PHP 5 aus Sicherheitsgründen absolute Pfadangaben unterbunden, ich weiß es nicht.

    Und du solltest zu einer Fehlerbeschreibung auch Fehlerausgaben angeben ;)

    Gruß
    telofon

    1. Hi!

      Na das sieht doch schon mal ganz gut aus. Was ich aber an deiner Stelle machen würde (beziehungsweise ich habe es mir angewöhnt), Variablen unterschiedlich zu benennen. Denn $_GET['site'] und $site kommen sich in die Quere, früher oder später.

      Wieso sollten sich ein Array-Element und eine Variable in die Quere kommen? Noch dazu wo in diesem speziellen Fall register_globals abgeschaltet wurde.

      include ("/home/www/$site");

      Absolute Pfadangaben sollten nicht benutzt werden. Nimm lieber relative Pfadangaben: include("config/conf.php"); oder so ähnlich. Vielleicht hat PHP 5 aus Sicherheitsgründen absolute Pfadangaben unterbunden, ich weiß es nicht.

      Das Argument kann ich überhaupt nicht nachvollziehen. Zum einen existiert PHP5 bereits seit Jahren und es hat diesbezüglich nichts unterbunden. Zum anderen gäbe es da an Sicherheit nichts zu gewinnen, was nicht auch bereits über das existierende Rechtesystem möglich ist. PHP wird sicherlich nichts am Dateisystemzugriff einschränken. Im Gegenteil, der Safe Mode wurde auf die schwarze Liste gesetzt, weil dieser eine Sicherheit bringen sollte, die gar nicht PHPs Aufgabe ist. Selbst die open_basedir-Beschränkung fällt eigentlich nicht in PHPs Zuständigkeitsbereich.

      Es ist sinnvoll, projektintern absolute Pfadangaben zu vermeiden, wenn man das Projekt flexibel im Dateisystem umherschieben möchte. Für eine generelle Missbilligung sehe ich aber keinen Grund. Auch zielführend wäre eine Konstante, die das Wurzelverzeichnis angibt und die zentral konfiguriert werden kann.

      Lo!

      1. Hi

        Wieso sollten sich ein Array-Element und eine Variable in die Quere kommen?

        Für PHP kommen die sich nicht in die Quere. Aber für den Programmierer, und diejenigen anderen, die den Code lesen. Wie gesagt, früher oder später wirds passieren. Am Argument, Variablen eindeutig zu kennzeichnen, gibt es aber nichts zu rütteln ;)

        Das Argument kann ich überhaupt nicht nachvollziehen. Zum einen existiert PHP5 bereits seit Jahren und es hat diesbezüglich nichts unterbunden.

        Wie gesagt, ich wusste es nicht. Hielt es aber für wahrscheinlich, dass sich so etwas essentielles wie Sicherheits-Issues zwischen PHP4 und PHP5 geändert haben müsste.

        Es ist sinnvoll, projektintern absolute Pfadangaben zu vermeiden, wenn man das Projekt flexibel im Dateisystem umherschieben möchte.

        Genau das habe ich gemeint. Und als Ursache käme das, bei grober Betrachtung, wie ich sie hier vollzogen habe, in Betracht.
        Üblicherweise gibt es ja ein Test- und ein Produktivsystem, da sollten solche absoluten Pfadangaben nichts zu suchen haben. Aber nicht nur im Dateisystem, sondern auch, wenn man mal den Server wechselt/wechseln muss.

        Grüße
        telofon

        1. Hi!

          Wieso sollten sich ein Array-Element und eine Variable in die Quere kommen?
          Für PHP kommen die sich nicht in die Quere. Aber für den Programmierer, und diejenigen anderen, die den Code lesen. Wie gesagt, früher oder später wirds passieren. Am Argument, Variablen eindeutig zu kennzeichnen, gibt es aber nichts zu rütteln ;)

          Wer $foo nicht von $array['foo'] unterscheiden kann, sollte sich überlegen, ob er nicht mit einem anderen Hobby glücklicher wäre.

          Variablen eindeutig zu kennzeichnen, heißt nicht, weil sich der Name mit irgendeinem anderen Wert beißt, sich einen anderen Namen auszudenken, der den Sinn der Variablen nicht mehr verständlich beschreibt. Nicht zu jedem Wort gibt es ausreichend und exakt gleichwertige Synonyme.

          Üblicherweise gibt es ja ein Test- und ein Produktivsystem, da sollten solche absoluten Pfadangaben nichts zu suchen haben. Aber nicht nur im Dateisystem, sondern auch, wenn man mal den Server wechselt/wechseln muss.

          Nochmal: Es gibt (übertrieben gesagt) kein Gesetz, dass absolute Pfadangaben verbietet. Sie haben in einigen Fällen ihren Sinn, in anderen sind sie hinderlich. Das sollte man individuell entscheiden und sich nicht aus Prinzip auf eine Art festlegen. Denn dann besteht eher die Gefahr, dass man sich wegen seines Prinzips eine schlechtere Lösung implementiert als wenn man alle möglichen Varianten fallabhängig gegeneinander abwägt.

          Natürlich kann man, auch wenn sie sich zwischen Test- und Produktivsystem unterscheiden, absolute Pfadangaben verwenden, wenn dafür ein Bedarf besteht. Eine Konstante oder eine Variable, die am Scriptanfang je nach vorliegendem System gesetzt wird, kann dabei hilfreich sein.

          define('ROOT', $_SERVER['SERVER_NAME'] == 'test.example.com' ? '/test/...' : '/produktiv/...');

          Auch im HTTP-Umfeld kommt man manchmal nur schwerlich an absoluten Pfadangaben vorbei, besonders wenn man benutzerfreundliche URLs mit unterschiedlich vielen / drin verwendet und auf festliegende Ressourcen verweisen will. Das kann man natürlich relativ machen, aber die Anzahl der ../ passend auszurechnen, ist aufwendiger als ein absoluter Pfad.

          Lo!