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

php Datei vom Unterordner includieren

Ich hab noch ein kleines Problem. Wenn ich die Seite direkt aufrufe, lädt es ja die index.php. Allerdings fehlt hier die main.php im Hauptfenster.
Wie bekomme ich diese noch includiert?

Das mit den divs werde ich noch überarbeiten.
 
Wenn du im array $aMenu auf dem key 1 die "main.php" hast und in der funktion unten nichts geändert haben solltest, dann müsste die main.php kommen. Denn wenn du die Startseite aufrufst kommt ein "erzwungener Fehler":

-> finde keine $_REQUEST["sitemapID"] ( !isset($_REQUEST["sitemapID"]) )
-> setzt sie auf 1
 
Das ist es ja, habe es so übernommen. Eigentlich müßte es auch gehen.

Menu.config.php
PHP:
<?
$aMenu = array(
   1 => array("Startseite", "./docs/main.php")
  ,2 => array("Kontakt", "./docs/kontakt.php")
  ,3 => array("Anfahrt", "./docs/anfahrt.php")
  ,4 => array("Termine", "./docs/termine.php")
  ,5 => array("Disclaimer", "./docs/disclaimer.php")
  ,6 => array("Impressum", "./docs/impressum.php")
  ,7 => array("News", "./news/september2009/news01.php")
);
?>
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]);
}
?>
 
PHP:
<?

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


$currentSM = (int)$_REQUEST["sitemapID"];
$content = $aMenu[$currentSM];
?>

Mein Fehler. Entferne mal das "else".
 
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

Bei jedem Reload der Seite das komplette Array neu zu befüllen, ist natürlich wesentlich schneller. ;)

Okay, ernsthaft, Switch-Case ist hier selbstverständlich die schlechtere Wahl (weil unhandlich). Aber an der Stelle ist Geschwindigkeit das geringste Problem.
 
Ja, dagegen wollte ich nichts sagen.

Naja das war ja, wie oben geschrieben, die kurze lösung ;) natürlich oop und mit buffern gebaut usw...da wäre das ganze ziemlich perfomanter. :P


EDIT:

Bei jedem Reload der Seite das komplette Array neu zu befüllen, ist natürlich wesentlich schneller.

wieso neu befüllen? es ist doch befüllt? ;) Ich greife über den key aus dem $_REQUEST direkt auf die stelle im array zu. Das ist wesentlich schneller wie switch. Selbst wenn ich ein array einmal befülle, reicht ein include_once aus um zu verhindern das es nochmal gefüllt wird bzw das füllen ausgeführt wird...
 
Zuletzt bearbeitet:
Das wäre vielleicht so, wenn PHP-Skripte permanent im Speicher gehalten und nicht bei jedem neuen Aufruf der Seite neu geladen würden. Aber das ist im Standardfall nunmal nicht so, sie werden neu geladen. Sämtliche Includes und Initialisierungen werden bei jedem neuen Seitenaufruf erneut eingebunden bzw. durchgeführt, auch dein Array wird bei jedem HTTP-Request neu befüllt.

Die Lookup-Zeit von O(1) in dem gehashten Array würde dann was bringen, wenn öfter als einmal pro Request etwas aus dem Array abgefragt würde. Ansonsten -- also bei nur einer Abfrage, mehr haben wir hier ja nicht -- gehe ich sehr stark davon aus, dass die Switch-Case-Variante schneller ist und auch weniger Arbeitsspeicher verbraucht, weil der Initialisierungs-Overhead des Arrays wegfällt und weil nicht alle Einträge des Arrays permanent im Speicher gehalten werden müssen.

Trotzdem ist das Array die bessere Wahl, weil es flexibler einzusetzen ist und weil Abstraktion und bessere Lesbarkeit in der Regel wichtiger sind als schnellstmöglicher Code. Aber je stärker abstrahiert wird (sprich: je mehr OOP), desto langsamer wird die ganze Chose, denn Objekte erzeugen Einiges an Overhead. Das fällt aber natürlich selten ins Gewicht, die bottlenecks sitzen üblicherweise anderswo (DB-Abfragen, Dateisystemzugriffe oder komplexe Schleifen und Berechnungen etwa). Das sind also alles keine Argumente, um nicht möglichst abstrakt zu programmieren, ich betone es noch mal. Die fraglichen Abläufe sind oft so schnell, dass es keine Rolle spielt, ob die doppelte Zeit oder die halbe Zeit oder die zehnfache Zeit gebraucht wird.

Output Buffer sind übrigens speichertechnisch nicht wirklich effizient. Ausgaben werden nicht direkt an den Browser durchgereicht, sondern müssen von PHP erst im Arbeitsspeicher herumkopiert werden.

PHP:
<?php

// ob_*-Zeilen für Test ein- bzw. auskommentieren

$start = microtime(true);

#ob_start();
echo '<div style="display: none;">';
for ($i = 0; $i < 1000; $i++) {
    // 1000 Strings mit je 1000 Zeichen ausgeben
    echo str_repeat('x', 1000);
}
echo '</div>';
#ob_end_flush();

echo memory_get_peak_usage() . ' Bytes<br />';
echo round((microtime(true) - $start) * 1000) . ' ms';

Speicherverbrauch ohne Buffer: 64 832 Bytes
Speicherverbrauch mit Buffer: 1 058 664 Bytes

Mit der tollen Idee...

PHP:
$s = ob_get_contents();
ob_end_clean();

echo $s;

...verdoppelt sich der Verbrauch dann auf 2 MB.
 
Zurück
Oben