Switch Include erweiterung

M-GT

Erfahrenes Mitglied
Hallo Leute
Ich hab ein Problem und zwar folgendes:
Ich will auf meiner Seite per Switch Include die Inhalte holen, und das sieht jez so aus:
PHP:
<?php 
switch($show) {
case news:
include('news.php');
break;
case news2:
include('news2.php');
break;
default;
include('fehler.php');
}
?>

Jo und immer wenn ich eine neue Seite hinzufüge müsste ich ja auch hier immer
Code:
case XXX:
include('XXX.php');
break;

hinzufügen...
Lässt sich das irgendwie umgehen?
Oder wisst ihr vl eine bessere Lösung...
Imprinzip soll es so wie bei frames
aber es soll eben mit PHP gehen ;)


Helft mir bitte^^
 
Hallo!

Hinter default gehört ein Doppelpunkt.
Auch würde ich die Strings als solche kennzeichnen.
PHP:
<?php 
switch($show) { 
case 'news': 
include('news.php'); 
break; 
case 'news2': 
include('news2.php'); 
break; 
default: 
include('fehler.php'); 
} 
?>
Bleibt nur zu hoffen, dass $show nicht durch z.b. ein Link oder Formular übergeben wird (Stichwort: register_globals).

Gruss Dr Dau
 
schnellantwort:

Nimm lieber:

<?PHP
if (file_exists($show.'.php')) include($show.'.php');
else include('fehler.php');
?>

Dann kannst du alles für $show angeben und wenn es dazu keine php gibt wird "Fehler.PHP" aufgerufen.
 
ZodiacXP hat gesagt.:
schnellantwort:

Nimm lieber:

<?PHP
if (file_exists($show.'.php')) include($show.'.php');
else include('fehler.php');
?>

Dann kannst du alles für $show angeben und wenn es dazu keine php gibt wird "Fehler.PHP" aufgerufen.
Das Problem daran ist, dass diese Variante, wenn allow_url_fopen in der php.ini on gesetzt ist, wahrscheinlich Cross-Site-Scripting erlaubt.
include() kann auf jeden Fall ueber HTTP arbeiten, vorausgesetzt allow_url_fopen ist on, bei file_exists() gehe ich auch davon aus.
Daher sollte eher sowas wie das hier genutzt werden:
PHP:
if (isset($_GET['subsite']))
	{
		$subsite=$_GET['subsite'];
	}
if (isset($subsite))
	{
		if ((strpos($subsite,"index.php")>-1) || (strpos($subsite,"http:")>-1) || (strpos($subsite,"https:")>-1) || (strpos($subsite,"ftp:")>-1))
			{
				header("Location:index.php");
				exit;
			}
		else
			{
				include($subsite);
			}
	}
else
	{
		include("welcome.php");
	}
Diesen Code hab ich mir fuer meine Website gebastelt und soweit keine Probleme feststellen koennen. Es kamen keine Beschwerden vom Hoster, meine eigenen Tests wurden alle erfolgreich vereitelt und auch hier im Forum hab ich den Code schon ein paar Mal gepostet und bisher keinerlei negative Kommentare dazu erhalten.
Wie auch die vorigen Male bitte ich darum mir eventuelle Sicherheitsprobleme zu melden.
 
PHP:
if (isset($_GET['subsite']))
    {
        $subsite=$_GET['subsite'];
    }
if (isset($subsite)) ..........

Ich weis ja das es von der Performance her schneller geht Arrays in einfachen Variablen zu speichern oder eine Verbindung dazu zu machen ...
Aber warum solch eine if() vorangesetzt?

Wäre es nicht einfacher direkt das zu verwenden:
PHP:
$subsite = $_GET['subsite'];
if (empty($subsite)) ...............
- Klammern in der IF müssen dabei vertauscht sein oder man verwendet !empty($subsite) -

Diese erste IF nimmt soviel ich weis und gelesen hab 4ms (bei 1000 Aufrufen) und das isset() jeweils 1,5ms (bei 1000 Aufrufen). Macht 7ms insgesamt.

Jetz fällt das erste IF weg und im zweiten IF wird mit dem "langsameren" empty() gearbeitet (2ms bei 1000 Aufrufen)
Noch schneller als die IF wäre ein Switch-Case.

Zusammenfassend:
Wir haben insgesamt 7ms weggeworfen und durch 2ms ersetzt. Ersparnis von 5ms (bei 1000 Aufrufen).

Warum schreib ich das alles? Weil ich wissen möchte ob ich richtig gedacht hab oder ob da ein Fehler drin ist.
 
Zuletzt bearbeitet:
Natuerlich koennte man theoretisch auch gleich $subsite = $_GET['subsite'] schreiben.
Das Problem ist jedoch, dass bei vollem Error-Reporting eine Warning oder Notice geworfen wird wenn $_GET['subsite'] nicht uebergeben wurde.
Darum das zusaetzliche IF.

Man koennte sich auch $subsite komplett sparen indem man ueberall mit $_GET['subsite'] arbeitet.
Ich hab das halt nur mal so aus meinem Script kopiert, und das ist halt mit der Zeit so gewachsen. ;)
Ueberarbeitungen sind aber geplant, und dazu gehoert auch unnoetige Variablenzuweisungen zu entfernen.
 
Wow, 5ms. ;)

Nagut, dann gehe ich jetzt auch mal davon aus dass $show per GET übergeben wird:
PHP:
<?php
if(isset($_GET['show'])) { /* Wurde 'show' per GET übergeben? */
	 switch($_GET['show']) { /* Prüfe ob der Wert existiert, der mit 'show' übergeben wurde. */
		 case "news": include("news.php"); break; /* Wurde 'show=news' übergeben, dann binde die news.php ein. */
		 case "news2": include("news2.php"); break; /* Wurde 'show=news2' übergeben, dann binde die news2.php ein. */
		 default: include("welcome.php"); /* Wurde ein Wert übergeben der nicht existiert (z.b. 'show=bla'), dann binde die Startseite ein. */
	 }
} else {
	 include("welcome.php"); /* Wenn 'show' nicht per GET übergeben wurde, dann binde die Startseite ein. */
}
?>
 
Ich denke es waere besser mit !empty() ansatt mit isset() zu arbeiten.
Denn so wird auch geprueft ob auch ein Wert uebergeben wurde und nicht nur eine leere Variable.
Man kann ja auch durchaus einen Link wie den folgenden uebergeben und isset() wuerde dabei wohl true liefern.
Code:
http://www.kleinelustigetesturl.de/index.php?show
 
Und genau da greift default: include("welcome.php").
Denn auch kein Wert ist ein nicht existenter Wert.

Code:
index.php?show
index.php?show=
index.php?show=bla
Diese Varianten würden auf default greifen.


Code:
index.php
index.php?blub
index.php?blub=
index.php?blub=bla
Hier würde die else-Anweisung greifen.


Code:
index.php?
Hier bin ich mir nicht ganz sicher, ob hier default oder die else-Anweisung greifen würde..... ich tendiere aber eher zu letzterem.

Mit anderen Worten, alles wofür es kein case gibt greift default bzw. die else-Anweisung.
 
Zurück