[PHP] - Probleme mit include()

tiefi

Cadet
Mitglied seit
19.04.2003
Beiträge
29
Renomée
1
Standort
Mödling
hallo leute!

also ich habe folgendes problem und es will mir einfach nicht gelingen, es zu lösen:

ich fang mal mit der orderstruktur auf meinem server an:
es gibt die index.php, den ordner includes, und einen ordner namens gbook.
soweit so gut.
für das normale includen verwende ich folgendes skript:
PHP:
<?
		if($_GET['site']!= "")
			{
				if(file_exists("./includes/".$_GET['site'].".php"))
				{
					include("./includes/".$_GET['site'].".php"); 
				} 
				else
				{
					include("./includes/home.php"); 
				}
			} 
		else 
			{
				include("./includes/home.php"); 
			}
		?>

die links in html habe ich folgendermaßen realisert:
HTML:
<a href="index.php?site=home">home</a>

also das normale includen von *.php files, die im ordner /includes liegen, funktioniert problemlos.

nun zum eigentlichen problem, dem gästebuch:

im ornder ./gbook/ gibt es eine guestbook.php

wie kann ich diese php datei in meine hauptseite einbinden?
mit dieser version:
PHP:
<?
		if($_GET['site']!= "")
		{
			if(file_exists("./includes/".$_GET['site'].".php"))
			{
				switch($_GET['site'])
				{
					case 'gbook': include("./gbook/guestbook.php"); break;
					default: include("./includes/".$_GET['site'].".php"); break; 
				}
			} 
		}
		?>
geht es auch nicht. (auch nicht, wenn in der guestbook.php nur ein satz drinsteht)

Wie kann ich das problem (ohne iframe (!)) lösen?

danke im voraus!

ps: sry, wegen der kleinschreibung :-*

mfg
 
...

wie kann ich diese php datei in meine hauptseite einbinden?
mit dieser version:
PHP:
<?
        if($_GET['site']!= "")
        {
            if(file_exists("./includes/".$_GET['site'].".php"))
            {
                switch($_GET['site'])
                {
                    case 'gbook': include("./gbook/guestbook.php"); break;
                    default: include("./includes/".$_GET['site'].".php"); break; 
                }
            } 
        }
        ?>
geht es auch nicht. (auch nicht, wenn in der guestbook.php nur ein satz drinsteht)

Wie kann ich das problem (ohne iframe (!)) lösen?

danke im voraus!

ps: sry, wegen der kleinschreibung :-*

mfg
Du hast da einen kleinen Denkfehler drin.
Wenn die Variable $_GET['site'] = gbook lautet, dann prüfst Du zunächst, ob die Datei ./includes/gbook.php existiert.
Das ist höchstwahrscheinlich nicht der Fall, da die Datei guestbook.php heisst und im ./gbook/ Verzeichnis liegt.

Also Abfragenkonstruktion umstellen:
PHP:
<?
if($_GET['site']!= "")
        {
            switch($_GET['site'])
             {
                 case 'gbook': include("./gbook/guestbook.php"); break;
                 default: if(file_exists("./includes/".$_GET['site'].".php")) include("./includes/".$_GET['site'].".php"); break; 
              }
        } 
?>
Damit müsste es funktionieren.

AndyK
 
Du hast da einen kleinen Denkfehler drin.
Wenn die Variable $_GET['site'] = gbook lautet, dann prüfst Du zunächst, ob die Datei ./includes/gbook.php existiert.
Das ist höchstwahrscheinlich nicht der Fall, da die Datei guestbook.php heisst und im ./gbook/ Verzeichnis liegt.

:o das ich das selbst nicht bemerkt habe - danke :)

jetzt, wo das includen funktioniert, ist aber das nächste GBook problem dar :(

wenn ich im gästebuch eine aktion (zb. eintragen) anklicke, meldet er, dass er die seite nicht finden kann, da er sie nicht im /gbook verzeichnis sucht, sondern eine ebene drüber (also auf der hauptebene)

www.abc.com/eintragen.php -> fehler, weil sie in www.abc.com/gbook/eintragen.php liegt.

mfg
 
Das ist ebenso wieder ein kleiner Denkfehler: Du hast zwar jetzt die richtige Datei included, im Browser in der URL oben bist Du aber noch außerhalb des gbook-Verzeichnisses, was zur Folge hat, dass Links auch außerhalb davon landen.

Ich möchte Dir aber zu Deinem anderen Code noch ein paar Vorschläge machen: Du solltest nicht einfach mit
Code:
if ( $_GET['site']!="" ) {...}
überprüfen, ob die Variable "site" übergeben wurde. Wenn sie nämlich nicht übergeben wurde, gibt PHP einen Fehler aus (man kann die Fehlerausgabe in der PHP-Konfiguration auch unterdrücken, aber es sollte besser auch ohne solche Mittel funktionieren). Die korrektere Variante wäre
Code:
if ( [COLOR="Blue"]isset($_GET['site']) &&[/COLOR] $_GET['site']!="" ) {...}
Hiermit gibt es dann zumindest keine potentielle Fehlermeldung mehr.

Trotzdem solltest Du bei Deinem Mechanismus noch darauf achten, dass er wie dargestellt eine ziemliche Sicherheitslücke darstellt, da man beim Parameter 'site' einfach irgendwas eingeben kann. Ich würde an Deiner Stelle mind. noch eine Grundabsicherung einbauen, dass man nur erlaubte Zeichen darin platzieren darf. Hier nochmal am Beispiel des Korrekturvorschlags von oben:

Code:
if ( isset($_GET['site']) && [COLOR="Blue"]preg_match("/^[a-z]+\$/",$_GET['site'])[/COLOR] ) {...}

Das preg_match() überprüft im Beispiel, ob der übergebene String ausschliesslich aus den Kleinbuchstaben im Bereich von "a" bis "z" besteht und gleichzeitig auch, ob mind. ein Zeichen vorhanden ist, damit kann man die vorherige Überprüfung mit Leerstring-Test weglassen.
 
Damit dein Gästebuch geht. könntest du ein <base /> im Head-Teil der (X)HTML-Datei deines Gästebuchs vergeben:
HTML:
<base href="./gbook/" />
 
Zuletzt bearbeitet:
Das ist ebenso wieder ein kleiner Denkfehler: Du hast zwar jetzt die richtige Datei included, im Browser in der URL oben bist Du aber noch außerhalb des gbook-Verzeichnisses, was zur Folge hat, dass Links auch außerhalb davon landen.
jop, das war mir eigentlich eh klar, wollte nur wissen, wie man das beheben kann ;D - danke an \²³/, es hat geklappt.

ps: echt super hier, der planet :)
 
ok, bin gerade draufgekommen, dass das includen nur mit opera richtig funktioniert....:]
mit firefox und IE gibts nur probs :(

anscheinend interpretieren die beiden anderen browser das <base href="./gbook/" /> falsch bzw. garnicht?

weiß irgendwer, wie ich das problem beheben kann?

danke!

mfg tiefi
 
PHP:
 <?
if ( isset($_GET['site']) && preg_match("/^[a-z,0-9]+$/i",$_GET['site']) )
        {
            switch($_GET['site'])
             {
                 case 'gbook': 
                              include("./gbook/guestbook.php");
                              $urlplus = "./gbook/";
                              break;
                 default:
                              if(file_exists("./includes/".$_GET['site'].".php"))
                                include("./includes/".$_GET['site'].".php"); 
                              $urlplus = "./";
                              break; 
              }
        } 
?>
Jetzt musst Du nur noch wo immer eine URL gebildet wird die Variable $urlplus vorweg einbinden, beispiel:
PHP:
<?
echo "<a href='{$urlplus}seite.php'>Linkname</a>";
?>
<!-- html code here... -->
<a href="<?=$urlplus?>seite2.php">Linkname 2</a>

@Rones: Eine Frage hab ich zu Deinem preg_match noch:
Warum fragst Du am Ende nach einem $-Zeichen ab?
Du hast es ja durch den \ "escaped" also wirkt es nicht als Stringende-Zeichen, sondern als normales $-Zeichen.
Oder meinstest Du eigentlich:
PHP:
preg_match("/^[a-z,0-9]+$/i",$_GET['site'])
Das heisst: Die URL muss aus normalen Buchstaben und/oder Zahlen bestehen, ohne auf Großschreibung zu achten.
Bei Dir war es vorher: nur Kleinbuchstaben waren gültig und der String musste mit einem $-Zeichen Enden.
War das so beabsichtigt?

AndyK
 
Zuletzt bearbeitet:
@AndyK: kann sein, dass der Backslash vor dem $ falsch war, ich habe das vor dem Posten nicht getestet. Meine Absicht war, dass der Dollar auch tatsächlich im regulären Ausdruck ankommt und nicht als Anfang eines Variablennamen mißverstanden wird. Vielleicht habe ich hier einen kleinen Fehler gemacht. :]
 
Passiert schon mal *oink* ;)
Geht mir auch öfters so.

War mir eben nur nicht sicher, ob es mit Absicht war, hätte ja sein können, dass ich was übersehen habe.

AndyK
 
zuerst einmal ein danke an alle :)

ich habe es jetzt doch mit einem iframe gemacht, weil die meisten pfade im gästebuch trotz dem
HTML:
<base href="./gbook/" />
nicht richtig sind...

mfg
 
[...] ich habe es jetzt doch mit einem iframe gemacht, weil die meisten pfade im gästebuch trotz dem
HTML:
<base href="./gbook/" />
nicht richtig sind [...].

Benutzt du HTML oder XHTML? Bei HTML musst du
HTML:
<base href="./gbook/">
notieren, bei XHTML
HTML:
<base href="./gbook/" />
.
 
Zurück
Oben Unten