Jump to content
Sign in to follow this  
mclane

Include Problem

Recommended Posts

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


Line 72 ist

if ($link == 'start')

 



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

Share this post


Link to post
Share on other sites
Guest

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

Share this post


Link to post
Share on other sites

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 ;-)

näheres dazu siehe: vordefinierte Variablen


btw.: Warum soviele if/else und nicht ein switch()?

Share this post


Link to post
Share on other sites

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 :(



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.

Share this post


Link to post
Share on other sites

Oder habt ihr vielleicht eine bessere Lösung für mich? Meine scheint fürn Hintern zu sein [:o]


Irgendwie klappt jetzt nur noch ein Link, obwohl ich nichts verändert habe. Schon sehr seltsam.

Share this post


Link to post
Share on other sites

Ich weiß nicht so richtig wie ich das einbinden soll.


Hier mal mein, zweifellos schlimmer, Versuch :) :

<?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?

Share this post


Link to post
Share on other sites

du liest nicht das Manual ...

-> default:


das ganze ginge aber noch einfacher, nur hab ich gerade akuten Zeitmangel.

Share this post


Link to post
Share on other sites
Original von mahe

du liest nicht das Manual ...

-> default:


das ganze ginge aber noch einfacher, nur hab ich gerade akuten Zeitmangel.



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.

Share this post


Link to post
Share on other sites

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...

Share this post


Link to post
Share on other sites

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(!!!):

 




			
		

Share this post


Link to post
Share on other sites

@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.

Share this post


Link to post
Share on other sites
Guest
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.

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.

Share this post


Link to post
Share on other sites

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 ;-)

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 ;-)


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 ;-)

Share this post


Link to post
Share on other sites

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 ;-)



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 :) ).


Klingt aber interessant.



Vielen Dank JoeBot für den Code! Werde den heut mittag gleich ausprobieren.

Share this post


Link to post
Share on other sites

Mh, der Code funktioniert, nur das else geht nicht.


Wenn eine Seite nicht gefunden wird dann zeigt er keine Seite an, anstatt die else Seite :(



Habt ihr ne Idee warum?

Share this post


Link to post
Share on other sites

Hm - ich sehe auch keinen fehler... (?)


kann nur sagen wie ich es gelöst habe - und es bisher fuer die eleganteste halte... die ich bisher verwendet habe.


Vielleicht kann sie ja jemand gebrauchen:

		   if (!isset($_GET['site'])) { $_GET['site']="news"; }
	   if (file_exists("tmpl/".$_GET['site'].".php"))
	   	{ include("tmpl/".$_GET['site'].".php"); }
	   else
	   	{ echo " Noch nicht implementiert ";  }

 

einfach wie gehabt immer auf die index verlinken mit

index.php?site=seite

Share this post


Link to post
Share on other sites

Wow, super! Ist wirklich sehr einfach und funktioniert 1A!

Vielen Dank!



Jetzt hab ich nur noch ein Problem mit Powie News und dem include.

Ohne include funktioniert Powies News 1a, wenn ich die Seite include dann werden aus den Umlauten Rauten mit nem Fragezeichen drin �.


Hab schon in der htaccess dieses hier angegeben, um bei meinen anderen Includeseiten ein Problem mit den Umlauten zu lösen:

AddDefaultCharSet utf-8
AddCharSet utf-8 .shtml .htm .html .php

 

Funktioniert leider nicht mit der Powies News Seite.

Share this post


Link to post
Share on other sites
Guest
if (!isset($_GET[\'site\'])) { $_GET[\'site\']="news"; }
          if (file_exists("tmpl/".$_GET[\'site\'].".php"))
              { include("tmpl/".$_GET[\'site\'].".php"); }
          else
              { echo " Noch nicht implementiert ";  }


Dein Code ist anfällig für Directory-Traversal-Attacken und verursacht Race Conditions. Die Verwendung ist ausdrücklich nicht empfohlen.

Share this post


Link to post
Share on other sites
Guest
Ohne include funktioniert Powies News 1a, wenn ich die Seite include dann werden aus den Umlauten Rauten mit nem Fragezeichen drin �.

Powies Skripte geben Code als IS0-8859-1 aus - teilweise mit und teilweise ohne Deklaration. Wenn Du UTF-8 forcierst wirst Du die von dir beschriebenen Nebeneffekte feststellen.


pSkripte kann man nicht includen!!!

Das ist so pauschal falsch. Man kann es. Aber man kann sich auch selbst in den Fuß schießen.

Share this post


Link to post
Share on other sites

Hi Statler - In wieweit ist das was ich nun verwende angreifbar...


Ich fange die Var ja per GET ab - und gebe nur einen einzigen Ordner zur verfügung - wo die dateien drinne liegen können...


Kannst du vielleicht explizieter erklären - was ich ändern sollte - um etwaige risiken aus dem weg zu räumen?!

Danke!

Share this post


Link to post
Share on other sites
Guest

Stichwörter habe ich dir ja bereits genannt: Double Dot Directory Traversal und Race Conditions.

Share this post


Link to post
Share on other sites
Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...