• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

php Datei vom Unterordner includieren

E

emitremmus

Guest
Hallo,

bei meiner Seite werden im Moment die Dateien alle aus dem root includiert.
Nun möchte ich aber gerne etwas Strukur reinbringen und für gewisse Bereiche einen Ordner anlegen. Dort sollen dann einige php Dateien rein, welche dann von der index.php die sich im root befindet includiert werden.

Im Moment siehr mein Code so aus
Code:
<?php
switch ($_GET['datei']) {
    case "kontakt":
        include 'kontakt.php';
        break;
    case "impressum":
        include 'impressum.php';
        break;
    case "disclaimer":
    include 'disclaimer.php';
    break;
    case "busfahrplan":
    include 'busfahrplan.php';
    break;
    case "anfahrt":
    include 'anfahrt.php';
    break;
    case "hausordnung":
    include 'hausordnung.php';
    break;
    case "termine":
    include 'termine.php';
    break;
    default:
        include 'main.php';

Wie könnte ich nun die ganzen Dateien bis auf die index.php aus einem Ordner heraus includieren?
 
Ok, das funktioniert erstmal. Danke.

Nun habe ich aber noch folgendes Problem. Ich habe eine Datei "news01.php.". Diese befindet sich nun im Ordner "news". Bevor ich die Ordner angelegt habe, konnte ich die Datei per index.php?datei=news01 im Hauptfenster meiner Seite öffnen lassen, da sich die Datei eben im root befand.
Was muss ich jetzt schreiben, damit ich wieder den gleichen Effekt habe?
 
Nicht sicher zu sagen. Wahrscheinlich aber:

Code:
index.php?datei=news/news01

Diese Vorgehensweise könnte Sicherheitsrisiken beinhalten, weil Besucher den datei-Parameter ändern könnten. Wenn du magst, zeig doch mal den Code, in dem die Datei dann tatsächlich inkludiert wird. (Edit: Steht doch da...)
 
Zuletzt bearbeitet:
da du darauf in dem switch blcok nciht reagierst kann dir hier ohne code keiener genau sagen wie du es realisieren kannst...
es sei denn natürlich irgendjemand ist hier anwesend dessen glaskugel nicht gerade in reperatur ist
 
PHP:
<?php
if(file_exists($_GET["datei"].".php")
{
   include($_GET["datei"].".php")
}
else
{
   include("main.php");
}
index.php?datei=news/news01 -> included /news/news01.php
index.php?datei=foooobaaar -> included main.php

Ich gehe einfach mal davon aus, dass du wie in deiner switch anweisung die variable datei übergibst.
 
das ist absolut böser code den man nie benutzen sollte da so ALLE dateien eingebunden werden können auch dateien die keine .php dateien sind

index.php?datei=../../../../etc/passwd%00

mfg miah
 
Aus irgendeinem Grund habe ich den Code aus dem ersten Post übersehen.

Du könntest deine Whitelist einfach entsprechend erweitern:

PHP:
<?php
switch ($_GET['datei']) {
    case "kontakt":
        include 'kontakt.php';
        break;
    // ...
    case 'news/news01':
        include 'news/news01.php';
        break;
    // ...
    default:
        include 'main.php';
}

Oder mit weniger Getippe:

PHP:
$whitelist = array(
    'kontakt',
    'impressum',
    // ...
    'news/news01'
);

if (isset($_GET['datei']) && in_array($_GET['datei'], $whitelist)) {
    include $_GET['datei'] . '.php';
} else {
    include 'main.php';
}
 
Zuletzt bearbeitet:
PHP:
<?php
if(file_exists($_GET["datei"].".php")
{
   include($_GET["datei"].".php")
}
else
{
   include("main.php");
}
...

das ist absolut böser code den man nie benutzen sollte da so ALLE dateien eingebunden werden können auch dateien die keine .php dateien sind

index.php?datei=../../../../etc/passwd%00

mfg miah
nö, in diesem falle nicht, da die endung .php fest gecoded angehängt wird würde ../../../../etc/passwd%00.php abgefragt, aber im prinzip stimmt das schon, man sollte sehr bedacht mit sochem code umgehen.

man sollte aber immer
* auf das vorhandensein der datei auf dem eigenen webspace testen
* keine pfade mit übergeben sondern nur den dateinamen, den rest festgecoded zusammenbauen.

alternativ könnte man z.b. im stammverzeichnis für die news eine datei checknews.php anlegen, wo der pfade dann speziell zusammengebaut wird und die aufrufen.
 
Hallo,

erstmal vielen Dank für die zahlreichen Anregungen.

Das mit dem "bösen Code" verstehe ich allerdings nicht ganz.
Bei mir werden im Moment die Dateien folgendermaßen includiert

Code:
<?php
switch ($_GET['datei']) {
    case "kontakt":
        include './docs/kontakt.php';
        break;
    case "impressum":
        include './docs/impressum.php';
        break;
    case "disclaimer":
    include './docs/disclaimer.php';
    break;
    case "busfahrplan":
    include './docs/busfahrplan.php';
    break;
    case "anfahrt":
    include './docs/anfahrt.php';
    break;
    case "hausordnung":
    include './docs/hausordnung.php';
    break;
    case "termine":
    include './docs/termine.php';
    break;
    case "schulumbau":
    include './docs/schulumbau.php';
    case "news01":
    include './news/september2009/news01.php';
    break;
    case "unterrichtszeiten":
    include './docs/unterrichtszeiten.php';
    break;
    case "foerder":
    include './docs/foerder.php';
    break;
    default:
        include './docs/main.php';
}
?>
Ist da jetzt was falsch dran? Das mit der Whitelist könnte ich ja auch machen, wäre eine Überlegung wert. Müßte man nicht mehr so viel schreiben.
 
ACh du scheiße....was machst du wenn du 30 Menupunkte hast? 30x case?...du weißt schon, dass er bei jedem klick anfängt das switch von oben bis unten durchzurennen bis er das findet was du haben willst? -> Lange Ladezeit

Hast du dir schon einmal überlegt, dass ganze OOP zu bauen? Oder zumindest einfacher....

Menu.config.php:
PHP:
$aMenu = array(
   1 => array("Startseite", "startseite.php")
  ,2 => array("Kontakt", "kontakt.php")
  ,3 => array("Irgendwas", "irgendwas.php")
  ,4 => array("was anderes", "was_anderes.php")
);

NAV.php:
PHP:
<ul>
<?
include_once("./Menu.config.php");

function printMenu(){
  global $aMenu;
  echo "<ul>\n";
  foreach($aMenu as $k => $aSmEntry){
     echo "<li><a href=\"index.php?sitemapID=".$k."\">".$aSmEntry[0]."</a></li>\n";
  }
  echo "</ul>\n";
}

printMenu(); 
?>

load.php:
PHP:
<?
include("./Menu.config.php");

if(!isset($_REQUEST["sitemapID"]) or !array_key_exists($_REQUEST["sitemapID"], $aMenu))
	$_REQUEST["sitemapID"] = 1;
else
	$currentSM = (int)$_REQUEST["sitemapID"];

$content = $aMenu[$currentSM];

if($content[1] != "" && file_exists($content[1])){
	include_once($content[1]);
}
?>


index.php:
PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
<title></title>
<!-- META -->
</head>
<body>

<?
/* NAV */
include("./NAV.php");
?>

<?
/* CONTENT */
include("./load.php");
?>

</body></html>

Noch einfacher wäre es natürlich OOP und buffer (ob_gets_content) zu bauen....aber das wäre nun zu kompliziert und lange um es "schnell" zu erklären :-)

Gruß
Loon3y
 
Ok, erstmal vielen Dank für die Hilfe.
Ich habe das jetzt soweit versucht zu übernehmen. Allerdings zeigt es mir nun auf meiner Startseite, die ganzen Unterpunkte als Liste untereinander an, sie hier:

-Startseite
-Kontakt
-Anfahrt
-Termine
-Disclaimer
-Impressum
-News

Es ist in der Reihenfolge, wie es in der Menu.config.php, steht.
Das ist aber doch falsch. Ich habe ja einen Menübutton "Kontakt". Wenn ich auf diesen klicke, soll die Seite Kontakt.php im Hauptfesnter geladen werden.
Und wenn ich auf "Home" klicke, soll es die main.php öffnen.
Jetzt steht aber in meinem Hauptfenster diese Liste. Ich denke mal ich habe da noch irgendetwas falsch gemacht.
 
Hallo.

eigentlich müsste es soweit gehen. Gib mal links oder code von dir. Die Liste stimmt ja so, du hast ein Menu in Form einer Liste.

Was hier abläuft:

1. du klickst auf "irgendwas"

2. der link ist index.php?sitemapID=3

3. php geht hin und überprüft mit $_REQUEST["sitemap"] id ob diese id im array $aMenu (array_key_exists) existiert.
-> Wenn ja: er nimmt sie und speichert sie in $currentSM
-> wenn nein: er setzt sie auf 1 (home) und speichert sie in $currentSM

4. er greift direkt auf die position im array $aMenu zu -> $aMenu[$currentSM] ($aMenu[3] in diesem Fall)

5. er weißt $content diese zeile zu

6. er überprüft ob $content[1] (die php-datei existiert und nicht ein leerer string im array ist)

7. er includet die Datei


Gruß
Loon3y
 
Ja klar funktioniert es, aber wie bekomme ich denn diese Liste weg?

Ich weiß nicht, was du meinst mit Menü anpassen. Die Seiten, die schon fertig sind, habe ich ja verlinkt.
Also bei "Home" habe ich index.php?sitemapID=1 stehen, usw.
 
Gut, hab ich jetzt einfach mal rausgenommen...
 
Zuletzt bearbeitet von einem Moderator:
Vllt solltest du dir aber vorerst einmal html und css aneignen. Die Seite ist die reinste <div>-Suppe. PHP wäre dann die Fortsetzung.

Anbei... sogenanntes <div>-Layout ist schlimmer wie <table>-Layout. Denn Tabellen geben dem Inhalt wenigstens tabellarische Bedeutung. Div's sind "neutral" und geben keine Bedeutung.
 
Zurück
Oben