2009-02-13 8 views
1

Je veux url est comme index.php? Showuser = 512, index.php? Shownews = 317 pour les pages je reçois le contenu de db ... et pour les pages normales index.php? Page = environ et ainsi sur SANS mod-ré-écriture.

Invision Power Board a des adresses comme celle-ci. J'ai regardé leur code mais je n'arrive pas à comprendre comment ils le font.

je pouvais le faire comme ceci:

if (ctype_digit($_GET['shownews'])) include('shownews.php'); 
elseif (ctype_digit($_GET['showuser'])) include('showuser.php'); 

// regular pages 
elseif ($_GET['page'] == 'about') include('about.php'); 
elseif ($_GET['page'] == 'help') include('help.php'); 
elseif ($_GET['page'] == 'login') include('login.php'); 

Mais cela se sent trop en désordre. Juste curieux de savoir comment IPB fait cela. Y a-t-il un meilleur moyen de faire cela? SANS mod-ré-écriture. Quelqu'un sait? Je doute qu'ils le fassent comme ci-dessus.

Je ne peux pas faire:

if (preg_match('/^[a-z0-9]+$/', $_GET['page'])) include('$_GET['page']'); 

Alors j'obtenir des liens comme index.php showuser & id = 512 et que je n'aime pas?. Je sais que ce n'est pas sûr de montrer le principe)

J'aime ça de cette façon, ce n'est pas le meilleur mais je l'aime alors s'il vous plaît soyez tranquille sur les moteurs de gabarit, les cadres, etc. Soyez gentil et répondez à ma question ... Je veux juste savoir comment IPB fait cela.

Merci Tomek

Répondre

2

Je ne sais pas comment IPB-ce, nous allons obtenir que de la route. Mais, voici comment I aborderait ce problème:

D'abord, je reconnais qu'il existe deux types de paramètres GET: page/identifiant, et juste page. Ceux-ci seraient testés séparément. Deuxièmement, je reconnais que tous les paramètres get correspondent à leurs noms de fichiers sans le suffixe php, donc nous pouvons utiliser cela à notre avantage. L'une des choses les plus importantes à retenir est de ne jamais laisser les paramètres GET affecter notre code non-initié. Dans ce cas, nous savons quels types de pages nous pouvons et voulons montrer, nous pouvons donc en créer une liste blanche.

Ainsi, sur le code répartiteur pseudo-y:

$pagesWithId = array("shownews", "showuser", "showwhatever"); 
$justPages = array("about", "help", "login"); 

foreach ($pagesWithId as $page) { 
    if (isset($_GET[$page])) { 
    $id = (int)$_GET[$page]; 

    include($page.'.php'); 
    die(); 
    } 
} 

if (in_array($_GET['page'], $justPages)) { 
    include($_GET['page'].'.php'); 
    die(); 
} 

// page not found 
show404OrHandleOtherwise(); 
+0

Merci beaucoup! Beaucoup mieux –

0

Pour les pages vous suffit d'utiliser un simple tableau.

if (isset($pages[$_GET['page']])) include $pages[$_GET['page']]; 

Pour shownews = 317 Vous pouvez effectuer une conversion simple dans votre application. Selon la façon dont vous voulez donner la priorité à la page ou shownews etc:

if (isset($pages[$_GET['page']])) { 
    include $pages[$_GET['page']]; 
} else { 
    $possiblePages = array_filter(array_intersect_key($_GET, $pagesWithId), 'ctype_digit'); 
    if (!empty($possiblePages)) { 
    $id = reset($possiblePages); 
    $pageName = key($possiblePages); 
    $page = $pagesWithId[$pageName]; 
    include $page; 
    } else { 
    //no valid pages 
    } 
} 

Note: la page « noms » sont les clés du tableau, et la valeur est le chemin, le fichier et l'extension d'inclure. Plus personnalisable.

Questions connexes