GET include

Zdravím potřeboval bych poradit jak mám udělat něco takového

<?php
if (isset($_GET["stranka"]))
$stranka = $_GET["stranka"];

else
$stranka = "uvod";

$soubor = "stranky/$stranka.php";
include $soubor;
?>

jenže abych mohl zadávat cestu takhle:

index.php?serial=futurama&stranka=titulky
soubor by to vzalo tento futurama/titulky.php

index.php?serial=dexter&stranka=wallpaper
soubor by to vzalo tento dexter/titulky.php

Předem díky :)
Zeptám hned na úvod, co se ti nelíbí na adrese domain.tld/futurama/titulky.php? Obsahuje pouze smysluplné slova, tak by adresa klidně mohla vypadat a byla by z hlediska SEO určitě lepší než požadovaná ?serial=futurama&stranka=titulky.

Na konstrukci typu include $_GET['stranka']; rovnou zapomeň (to je ve zkratce přesně to, co jsi uvedl). Takto by si návštěvník mohl do stránky vložit, co jej napadne (skvělou zábavu obstará například ?stranka=index s rekurzivním voláním include ;).

V zásadě je třeba držet si nějaký seznam povolených hodnot:

$serials = array('dexter','futurama');
if(in_array($serials,$_GET['serial']))
{

if(empty($_GET['stranka']))
{
$_GET['stranka'] = 'uvod';
}

switch($_GET['stranka'])
{
case 'ahoj':
case 'tralala':
case 'troll':
include $_GET['serial'].'/'.$_GET['stranka'].'.php';
// Tady máš seznam hodnot omezený
// Musíš ale zajistit, aby existovaly všechny dostupné kombinace
// tzn. pro oba seriály by měly existovat všechny tři soubory (ahoj.php, tralala.php, troll.php)
break;
case 'jine':
include 'else.php';
break;
case 'uvod':
include 'uvod.php';
break;
default:
// Error 404
// Případně:
header('Location: /'); // Nechceš zobrazovat úvod nebo neexistující adresou
}

}
else
{
// V adrese je neexisujici serial
}
Tu hezkou adresu už by mi zařídilo .htaccess přes rewrite mod a u té první verze bych zakázal lomítko takže k index.php by se nemohl dostat.. :) Tento způsob co si ukázal je moc dlouhý a kdybych dělal třeba stránku na, které by bylo 10 seriálu tak bych určitě nezařídil aby u každého seriálu byly stejné substránky jako třeba to ahoj.php, tralala.php... :)
Dej ty podstránky do databáze, nejlépe asi SQLite. Potom nebudeš muset řešit rozcestník přes switch, ale použiješ jeden SELECT. Jenom v té databázi nebudeš moct mít kód v PHP, což je jedině dobře. Můžeš se úplně obejít bez include().
Kite to budeš těžký já jsem nikdy z databází nikdy nedělal... Takže si musím udělat nějakým tým způsobem, o kterým jsem mluvil.. :)
Když vidím rozsah tvých stránek, tak by se už ta databáze docela hodila. A bude se hodit i na automatické generování levostranného menu.

Možná na to někdy udělám nějaký jednoduchý framework, protože použití databáze je mnohem jednodušší, než přes switch a include. Bonusem je pak možnost vytvářet a upravovat články mimo FTP přímo přes webové rozhraní.

Jen bych se vyvaroval použití MySQL na WZ. Databáze SQLite má k tomuto účelu mnohem lepší vlastnosti. Hlavně je výkonnější a spolehlivější.
A poradíte mi někdo jak má teda vypadat php script když chci aby mi po zadání adresy
1) index.php?serial=futurama&stránka=titulky
2) index.php?serial=dexter&stránka=novinky
3) index.php?serial=tahm&stránka=wallpapery
4) index.php?serial=mentalista&stránka=tvurci

includovalo soubor

1) /futurama/titulky
2) /dexter/novinky
3) /tahm/wallpapery
4) /mentalista/tvurci

A aby to tady takhle fungoval po zadání čehokoliv třeba i

index.php?serial=rohlikschlebem&stránka=pastika

/rohlikschlebem/pastika

Předem díky.
Nechceš databázi, switch se ti taky nelíbí, tak co potom s tebou?!

To, co hledáš je @include $_GET['serial'].'/'.$_GET['stranka'].'.php'; (jak jsem uvedl nahoře dříve rámci switche). Zavináč je tam pro potlačení chybové zprávy, pokud soubor neexistuje. Je to z hlediska optimalizace rychlejší než dělat file_exists() a potom include.

Jenomže tahle include konstrukce je v praxi nepoužitelná; uvedu dva příklady, jaký bude jejich výsledek s použitím zmíněného include si zvládněš představit jistě sám:
a) index.php?serial=&stranka=index
b) index.php?serial=../..&stranka=jinysoubor

Navíc je v takovém případě problematické kontrolovat, jestli jsi soubor zpracoval nebo jestli soubor neexistoval a máš zobrazit chybu 404 (to je třeba řešit zase rozdělením na file_exists() zmíněné dříve).

V zásadě se takový problém dá vyřešit pouze omezeným seznamem hodnot (abys rohlíkyschlebem nikam nepouštěl, pokud to dopředu nenastavíš). Další konstrukce může být třeba vícerozměrné pole (jeho obsah je samozřejmě lepší získávat z databáze a nemít jej v nějakém nastavení staticky):

$exists = array(
'dexter' => array('titulky' => true,'tvurci' => true),
'futurama' => array('titulky')
);

if(!empty($exists[$_GET['serial']][$_GET['stranka']]))
{
include $_GET['serial'].'/'.$_GET['stranka'].'.php';
}
else
{
// Nepovolena kombinace, chyba 404
}
Ještě na tom chci trochu zapracovat ale je to to co jsem po vás chtěl... :)

<?php
$serial = $_GET["serial"];
$stranka = $_GET["stranka"];

$soubor = "$serial/$stranka.php";
include $soubor;
?>

Mimochodem Freeze díky moc tomu tvýmu kódu nerozumím ale zdá se mi, že si byl nejblíž nebo to už je dokonce to co jsem chtěl.. ;) :)
Jestli jsi to ještě nepochopil, tak to co ti napsal Freeze je velmi snadno zneužitelné útočníkem, který může tvou stránku úplně rozbít. Napsal ti jen co hledáš, ale musíš si to zabezpečit.

Funkce file_exist() je jednou z pojistek proti útočníkům. Když ji tam nedáš,...