PHP Links mit Include

Hallo

ich habe da mal eine Frage.

Zur Erklärung:
Ich erstelle mir gerade meine Site mit includes und php Links. Bisher bin ich bei einem Paramert, der "site" heißt. Nun möchte ich aber weitere Parameter anhängen, um auch auf weitere Seiten zu kommen. Dies funktioniert aber leider nicht.

Hier mal mein code:
PHP:
//Seite, in die alles includet wird:

<?php 
include('links.php'); 

if(isset($_GET['site']) AND isset($dateien[$_GET['site']]))
{
 if(!file_exists($dateien[$_GET['site']])) echo "Die Datei ist nicht vorhanden.";

 elseif(file_exists($dateien[$_GET['site']]))
 {
 include $dateien[$_GET['site']];
 }
} 
else
{
 include $dateien['home'];
}
?>

//Links.php

<?php 
$dateien = array();
$dateien['home'] = "home.php";
$dateien['about'] = "infos/lao/index.php";
$dateien['contact&mode=mail'] = "contact/conMai/index.php";
?>

//Die Links in allen Seiten:
index.php?site=home (funktioniert)
index.php?site=about (funktioniert)
index.php?site=contact&mode=mail (funktioniert leider nicht)

Kann mir da einer vielleicht auf die Sprünge helfen? Ich möchte natürlich auch noch mehrere Parameter mit anhängen, ich glaube maximal komme ich auf 7.

Vielen Dank schonmal
euer Monchichi
 
Das &-Zeichen definiert eine neue $_GET Variable. D.h. wenn du es so machst "index.php?site=contact&mode=mail" hast du folgendes im $_GET Array stehen:
PHP:
array(2) {
  ["site"]=>
  string(7) "contact"
  ["mode"]=>
  string(4) "mail"
}

Nun könntest du das auf verschiedenem Wege lösen.
Wenn du deinen Code nicht umbauen möchtest, könntest du das $_GET einfach umschreiben zu:
PHP:
// -> index.php?site=contact+mode=mail
$dateien['contact+mode=mail'] = "contact/conMai/index.php";
Oder aber du fragst in der "contact" Seite noch die Variable $_GET['mode'] ab, und rufst dann die gegebene Datei auf. Oder aber du machst dir ein mehrdimensionales Array.

Sowas wie:
PHP:
$dateien['contact'] = 'datei1';
$dateien['contact']['mail'] = 'datei2';
$dateien['contact']['mail']['send'] = 'datei3';

// Aufrufen dann per 
$includePage = $dateien[$_GET['site']][$_GET['mode']][$_GET['action']];
 
Welche Varainte wäre denn die bessere? Es soll nicht bequem für mich sein sondern wirklich die prfessionellste Art es zu regeln.

Ich denke (da ich es schon oft woanders gesehen habe) die Variante mit dem &, oder?

Wie würde dann der Code aussehen in der index.php?

Also ich meine der Code hier:
PHP:
<?php  
include('links.php');  

if(isset($_GET['site']) AND isset($dateien[$_GET['site']])) 
{ 
 if(!file_exists($dateien[$_GET['site']])) echo "Die Datei ist nicht vorhanden."; 

 elseif(file_exists($dateien[$_GET['site']])) 
 { 
 include $dateien[$_GET['site']]; 
 } 
}  
else 
{ 
 include $dateien['home']; 
} 
?>

Oder muss ich dann auch etwas woanders ändern? Entschuldige ich bin noch ein wenig neu auf diesem Gebiet...
 
Ich würde es über ein [phpf]switch[/phpf] erledigen, hier mal ein Beispiel:

PHP:
// Fehlerseite
$errorPage = '404.php';

switch($_GET['site'])
{
	// Kontakt Seite
    case 'contact':
    	$includePage = 'contact.php';
    	// Falls ein Mode übergeben wird,
    	// den auswählen
        if(isset($_GET['mode']))
        {
	        switch($_GET['mode'])
	        {
	        	case 'mail':
	        		$includePage = 'contact/conMai/index.php';
	        		break;
				case 'send':
	        		$includePage = 'contact/conMai/send.php';	 
					break;       		
	        }
	    }    
	    break;    
	// Info Seite    
    case 'info':
   		$includePage = 'info.php';
    	// Falls ein Mode übergeben wird,
    	// den auswählen
        if(isset($_GET['mode']))
        {
	        switch($_GET['mode'])
	        {
	        	case 'view':
	        		$includePage = 'info/info/index.php';
	        		break;
				case 'print':
	        		$includePage = 'info/print/index.php';	 
					break;       		
	        }	      
		}	  
		break;	   
	// Standard bzw. Startseite	
	default:
   		$includePage = 'index.php';		     
}
if(file_exists($includePage))
{
	include($includePage);
}
else
{
	include($errorPage);
}

Wenn du allerdings keine Lust hast, was zu verändern, nehm einfach die Variante mit dem "+" Zeichen anstelle des "&" Zeichens:
PHP:
$dateien['contact+mode=mail'] = "contact/conMai/index.php";
Ist zwar etwas unsauberer, geht aber auch ;)
 
Schönen Dank schonmal, ich komme der Sache schon immer näher.

Nur eine Warnung bekomme ich jetzt:

Notice: Undefined index: site in /is/htdocs/wp1050442_I4VP0FSVFT/index.php on line 33

Das ist diese Zeile:
PHP:
switch($_GET['site'])

Das passiert auch nur, wenn in der URL noch kein Parameter steht. Also wird die Seite defaulf geladen, dann steht die Warnung dort. Gebe ich den Parameter (?site=home) von Hand ein, dann gehts. Muss man da vielleicht noch ne Weiche einbauen damit es funktioniert?


Wie sieht es aus mit XSS also Cross Site Scripting, bin ich mit dem Code von dir dagegen geschützt?

Vielen Dank
 
Schönen Dank schonmal, ich komme der Sache schon immer näher.

Nur eine Warnung bekomme ich jetzt:

Notice: Undefined index: site in /is/htdocs/wp1050442_I4VP0FSVFT/index.php on line 33

Das ist diese Zeile:
PHP:
switch($_GET['site'])
Da fehlt noch ein
PHP:
if(isset($_GET['site']))
Und das am besten auch unten beim include
Hier nochmal aufgeräumter:
PHP:
$errorPage = '404.php';
if(isset($_GET['site']))
{
	switch($_GET['site'])
	{
		// Kontakt Seite
	    case 'contact':
	    	$includePage = 'contact.php';
	    	// Falls ein Mode übergeben wird,
	    	// den auswählen
	        if(isset($_GET['mode']))
	        {
		        switch($_GET['mode'])
		        {
		        	case 'mail':
		        		$includePage = 'contact/conMai/index.php';
		        		break;
					case 'send':
		        		$includePage = 'contact/conMai/send.php';	 
						break;       		
		        }
		    }    
		    break;    
		// Info Seite    
	    case 'info':
	   		$includePage = 'info.php';
	    	// Falls ein Mode übergeben wird,
	    	// den auswählen
	        if(isset($_GET['mode']))
	        {
		        switch($_GET['mode'])
		        {
		        	case 'view':
		        		$includePage = 'info/info/index.php';
		        		break;
					case 'print':
		        		$includePage = 'info/print/index.php';	 
						break;       		
		        }	      
			}	  
			break;	   
		// Standard bzw. Startseite	
		default:
	   		$includePage = 'index.php';		     
	}
}
if(isset($includePage) && file_exists($includePage))
{
	include($includePage);
}
else
{
	include($errorPage);
}

Was das XSS angeht bin ich leider ein wenig überfragt.

Es dürfte aber eigentlich nichts passieren, da für den Fall, dass keine Möglichkeit gefunden wird (case) die $errorPage geladen wird. Aber wie gesagt, da bin ich überfragt ;)
 
Das sollte eigentlich sicher sein.
Wenn du total auf Nummer sicher gehen willst kannst du ja ganz am Anfang des Scriptes folgendes setzen:
$includePage = 0;

Somit ist gewährleistet, dass die Variable $includePage keinen bösen Code enthält. Und da du die GET-Eingabe ja nicht direkt der Variable $includePage zuweist, kann da auch nichts Böses mehr eingeschleust werden.
 
Ist alles bestens, bloß wenn kein Parameter vorhanden ist, dann passiert folgendes:

Code:
Warning: include(404.php) [function.include]: failed to open stream: No such file or directory in /is/htdocs/wp1050442_I4VP0FSVFT/index.php on line 79

Warning: include(404.php) [function.include]: failed to open stream: No such file or directory in /is/htdocs/wp1050442_I4VP0FSVFT/index.php on line 79

Warning: include() [function.include]: Failed opening '404.php' for inclusion (include_path='.:/usr/share/pear/php5') in /is/htdocs/wp1050442_I4VP0FSVFT/index.php on line 79

@slaughter89:
vielen Dank für den Tip. Habs gleich mit eingebaut!
 
Zuletzt bearbeitet:
Das müsste hinhauen:

PHP:
$includePage = 0;
$errorPage = '404.php';
if(isset($_GET['site']))
{
    switch($_GET['site'])
    {
        // Kontakt Seite
        case 'contact':
            $includePage = 'contact.php';
            // Falls ein Mode übergeben wird,
            // den auswählen
            if(isset($_GET['mode']))
            {
                switch($_GET['mode'])
                {
                    case 'mail':
                        $includePage = 'contact/conMai/index.php';
                        break;
                    case 'send':
                        $includePage = 'contact/conMai/send.php';     
                        break;               
                }
            }    
            break;    
        // Info Seite    
        case 'info':
               $includePage = 'info.php';
            // Falls ein Mode übergeben wird,
            // den auswählen
            if(isset($_GET['mode']))
            {
                switch($_GET['mode'])
                {
                    case 'view':
                        $includePage = 'info/info/index.php';
                        break;
                    case 'print':
                        $includePage = 'info/print/index.php';     
                        break;               
                }          
            }      
            break;       
        // Standard bzw. Startseite    
        default:
               $includePage = 'index.php';             
    }
} else {
               $includePage = 'index.php';    
}
if(isset($includePage) && file_exists($includePage))
{
    include($includePage);
}
else
{
    include($errorPage);
}

Außerdem brauchste die 404.php noch ;)
 
Zurück