Neuigkeiten:

still alive...

Hauptmenü

Include Problem

Begonnen von mclane, 14. Juni 2007, 22:12:04

Vorheriges Thema - Nächstes Thema

mclane

Hi!
Ich hab da ein komisches Problem, bei dem ich nicht weiter komme.
Ich habe eine html Site, bei der ich mit Hilfe von PHP Seiten includen möchte.
Hoffe, daß ich mich jetzt verständlich ausgedrückt habe.
Es soll also auf einen Link geklickt werden, der Link gibt einen Wert an und in die Indexseite wird eine weitere Seite included.
 
Komischerweise klappt die Methode nicht, die ich seit Jahren anwende. Und ich finde auch keinen Fehler.
 
Hier ist der PHP Code:


Eine Verlinkung ist bspw.
a href=\"index.php?link=aktuelles\"


 
 
Als Fehlercode kommt:
Notice: Undefined variable: link in /srv/www/htdocs/tld81/html/main/kohnert/index.php on line 72[/quote]
Line 72 ist
if ($link == \'start\')

 
 
 
Ich weiss echt nimmer weiter und hoffe, daß ihr mir helfen könnt.

Hast du deine Variable denn nicht irgendwo deklariert? Wenn doch, wo und wie?

mahe

Das wird wohl daran liegen dass sonst immer register_globals auf On stand und es nun aber auf Off steht (was auch besser ist).
Variablen die per URL (GET) kommen spricht man dann mit $_GET an /uploads/emoticons/icon_e_wink.gif.3167d127940f44558fbf1ccd9b6d60a9.gif\" alt=\";-)\" />
näheres dazu siehe: http://www.php.net/manual/de/language.variables.predefined.php\" rel=\"external nofollow\">vordefinierte Variablen
btw.: Warum soviele if/else und nicht ein http://www.php.net/switch\" rel=\"external nofollow\">switch()?

http://blog.mahe.at\" rel=\"external nofollow\">http://blog.mahe.at/wp-content/uploads/2007/06/88x31_1.jpg\" alt=\"88x31_1.jpg\">


Ja, diese Signatur dient zur Werbung!


Und dass ich meine Posts wiederfinde ...


mclane

Danke für den Tipp! Hast recht, die register_globals sind jetzt auf off.
Ich hab das Script so übernommen gehabt und seit Ewigkeiten damit gearbeitet.
Hab selber nichts mit PHP am Hut, deswegen komm ich mit deiner Aussage, dass ich $_GET benutzen soll, leider nicht so ganz weiter.
Habe etwas gegoogled und ausprobiert, aber ich habe keine Ahnung wie ich dieses GET richtig benutzen soll   /uploads/emoticons/icon_e_sad.gif.cc8ba2b6b966c5e020020efa47702aab.gif\" alt=\":(\" />
 
Ich habe jetzt erst mal nichts an den ifelse geändert. Momentan sieht es so aus:

 
Link aufrufen klappt auch, ich hab jetzt noch zwei Probleme:
1. Bei den included sites werden keine Umlaute dargestellt. Komisch.
2. Wenn ein nicht vorhandener $link aufgerufen wird dann bleibt die Seite weiss, also es wird nicht das \"else include start.php\" aufgerufen
 
Hoffe, dass ihr mir nochmal helfen könnt.

mclane

Oder habt ihr vielleicht eine bessere Lösung für mich? Meine scheint fürn Hintern zu sein  [/uploads/emoticons/icon_e_surprised.gif.a005678239f11b45b64b526b2c82e9a1.gif\" alt=\":o\" />]
Irgendwie klappt jetzt nur noch ein Link, obwohl ich nichts verändert habe. Schon sehr seltsam.

Mal switch probiert?

mclane

Ich weiß nicht so richtig wie ich das einbinden soll.
Hier mal mein, zweifellos schlimmer, Versuch /uploads/emoticons/icon_e_smile.gif.4a0acefcb917340d2c82e5239c009e6e.gif\" alt=\":)\" /> :

<?php error_reporting(E_ALL);   
$link = $_GET[\'link\']
switch ($link) {
case start:
   include(\"start.php\");
   break;
case aktuelles:
   include(\"aktuelles.php\");
   break;
case sportarten:
   include(\"sportarten.php\");
   break;
else
include(\"start.php\");
}

 
 
Mit \"$link = $_GET[\'link\']\" Versuche ich die Variable link zu definieren. Ich hätte gern, dass er den gegebenen Parameter aus der Url, bspw. index.php?link=start, nimmt.
Beim Switch nehme ich wieder die Variable link und je nach Zustand soll er eine Seite includen.
Am Ende setze ich ein else ein, kann mir vorstellen, dass das so gar nicht funktioniert. Aber damit möchte ich, dass wenn er keinen Parameter von link übernimmt oder der Wert fehlerhaft ist er die Seite start.php included.
 
Haut so nicht hin, was mach ich falsch?

mahe

du liest nicht das Manual ...
-> default:
das ganze ginge aber noch einfacher, nur hab ich gerade akuten Zeitmangel.

http://blog.mahe.at\" rel=\"external nofollow\">http://blog.mahe.at/wp-content/uploads/2007/06/88x31_1.jpg\" alt=\"88x31_1.jpg\">


Ja, diese Signatur dient zur Werbung!


Und dass ich meine Posts wiederfinde ...


mclane


Original von mahe du liest nicht das Manual ...
-> default:
das ganze ginge aber noch einfacher, nur hab ich gerade akuten Zeitmangel.
[/quote]
Oh, entschuldigung. Hab da gar nicht so weit gelesen. Also das da jetzt kein else hinkommt hab ich verstanden.
Und ich hab die Methode das Ganze mit array zu machen gefunden.
Ist das vielleicht was du als \"einfacher\" bezeichnet hast?
Das ganze sieht jetzt so aus, leider zeigt er die Seite jetzt gar nicht mehr:

 \'start.php\',
     \'aktuelles\' => \'aktuelles.php\'
  \'sportarten\' => \'sportarten.php\'
   );
   if(strlen($pages[$action]) > 0)
   {
     require $pages[$action];
   }
   else
   {
     require \'start.php\';
   }   
?>

 
 
Hoffe, daß ihr mir helfen könnt, weil ich jetzt echt verzweifle und die Page dadurch nicht fertig krieg.

joebot

hi,
zum Umlaute Problem: Hast du einen default-charset im Dokument angegeben ? Wenn nein, mach das!
zum anderen Problem:
$link = $_GET[\'link\'];
schreibt das was in der URL unter link steht in die Variable $link. Danach kannst du mit $link auf den Wert zugreifen.
Ich selber mach das auch noch mit nen großen if, aber mach noch explizit die Klammern dazu, hier mal dein Code bearbeitet:
 


 

 
 
nebenbei würde ich aber anstatt include auch lieber require nehmen...

mahe

Der Unterschied zwischen include() und require() liegt darin dass include() ein Warning ausgibt und das Skript weiter läuft. require() hingegen bricht das Skript mit einem Fatal Error ab.
Beides ist in meinen Augen hier eigentlich Humbug, da man entweder eine halbe Seite mit einem Fatal Error angezeigt bekommt oder eine Seite mit einem Warning.
Kurz, schmerzlos, allerdings auch ohne jeglichen Sicherheitschecks(!!!):
 

								

http://blog.mahe.at\" rel=\"external nofollow\">http://blog.mahe.at/wp-content/uploads/2007/06/88x31_1.jpg\" alt=\"88x31_1.jpg\">


Ja, diese Signatur dient zur Werbung!


Und dass ich meine Posts wiederfinde ...


joebot

@mahe
sorry, aber gerade sowas ist ein schlechtes Beispiel, deswegen wohl auch die Sicherheitschecks was...
Includie niemals eine Datei, dessen namen man über die URL erhält.

Beides ist in meinen Augen hier eigentlich Humbug, da man entweder eine halbe Seite mit einem Fatal Error angezeigt bekommt oder eine Seite mit einem Warning.[/quote]
Du vergisst, dass man solche Fehler eben auch mit Exceptions und ErrorHandling abfangen und weiter behandeln kann und auch sollte.
Fehlermeldungen sollten auf Livesystemen eh nie zum User durchgereicht werden.

mahe

Statler: Wenn man das macht. Das bezog sich auf den Code und da ist das ja nicht der Fall gewesen.
Das würde, so denke ich, aktuell auch etwas den Rahmen sprengen. (siehe OT, wie ich dazu denke)
JoeBot: Who cares? Was machts denn hier für nen Unterschied?
die \"..\" und \"/\" raus (basename()), die Seiten in einem eigenen Verzeichnis und weiter? Das braucht nichtmal eine Zeile im Code mehr ...
Abgesehn davon, wer sagt dass bei einem URL mit ?file=start wirklich die start.php eingebunden wird und nicht eine start.dat/start.inc/start.tpl/start.foobar/...
Aber viel Spaß mit if/else wenn du mal 20 oder noch viel mehr Files hast.
[OT]Ich hab es mir angewöhnt Beispiele zu posten und keinen fertigen Code den man 1zu1 übernehmen kann, da muss der/die FragestellerIn halt noch ein wenig Selbstinitiative zeigen.
Meiner Meinung nach ist da der Lerneffekt höher bzw. merkt man es sich einfach besser wenn man selbst drauf kommt.
Im Zweifelsfall kann er/sie dann immer noch detailierter nachfragen, das zeigt wenigstens auch Interesse und er/sie wird zur Antwort geführt /uploads/emoticons/icon_e_wink.gif.3167d127940f44558fbf1ccd9b6d60a9.gif\" alt=\";-)\" />
In weiterer Linie kann man dann natürlich noch Exceptions und Error-Handling einbauen, alles eben schön der Reihe nach.
Logarithmen werden auch nicht bereits in der ersten Schulstufe durchgenommen /uploads/emoticons/icon_e_wink.gif.3167d127940f44558fbf1ccd9b6d60a9.gif\" alt=\";-)\" />
Ich erkläre schon lange nichtsmehr Leuten die es eigentlich nicht intressiert und nur fertig haben wollen.
Das ist meine Art solche zu filtern.[/OT]
mclane:
Wenn du mehr statisch Seiten hast dann wär es (für die Zukunft) besser die in einer Datenbank liegen zu haben.
Dann brauchst nur eine Datei die den entsprechenden Content aus der DB holt, ggf. aufbereitet und dann ausgibt.
Im Endeffekt hast da dann zwar etwas mehr Code, aber x-beliebig viele Seiten die du dann auch per ACP ändern/anlegen kannst.
ACP müsstest dir dafür natürlich schreiben /uploads/emoticons/icon_e_wink.gif.3167d127940f44558fbf1ccd9b6d60a9.gif\" alt=\";-)\" />

http://blog.mahe.at\" rel=\"external nofollow\">http://blog.mahe.at/wp-content/uploads/2007/06/88x31_1.jpg\" alt=\"88x31_1.jpg\">


Ja, diese Signatur dient zur Werbung!


Und dass ich meine Posts wiederfinde ...


mclane

Endlich kommt der Thread mal in Schwung. Vielen Dank für eure Antworten!
 

Original von mahe mclane:
Wenn du mehr statisch Seiten hast dann wär es (für die Zukunft) besser die in einer Datenbank liegen zu haben.
Dann brauchst nur eine Datei die den entsprechenden Content aus der DB holt, ggf. aufbereitet und dann ausgibt.
Im Endeffekt hast da dann zwar etwas mehr Code, aber x-beliebig viele Seiten die du dann auch per ACP ändern/anlegen kannst.
ACP müsstest dir dafür natürlich schreiben /uploads/emoticons/icon_e_wink.gif.3167d127940f44558fbf1ccd9b6d60a9.gif\" alt=\";-)\" />
[/quote]
Mh, ob sich der Aufwand lohnen würde? Die Seite, an der ich gerade sitze, hat etwa 4 statische und eine dynamische (powie news) Seite. Den Code zum includen schreibe ich ja eigentlich nur einmal in die index.php und damit ist die Sache dann auch erledigt. Wenn ne neue Seite hinzukommt dann füg ich eine neue if Zeile ein und dann wars das auch (so war das früher, vor dem register_globals: off /uploads/emoticons/icon_e_smile.gif.4a0acefcb917340d2c82e5239c009e6e.gif\" alt=\":)\" /> ).
Klingt aber interessant.
 
Vielen Dank JoeBot für den Code! Werde den heut mittag gleich ausprobieren.

all your base are belong to us / Discord