Php 包括带有$\u GET的页面

Php 包括带有$\u GET的页面,php,Php,我想要像index.php?showuser=512,index.php?shownews=317这样的url,用于我从db获取内容的页面。。。对于常规页面index.php?page=about等,无需修改重写 Invision电源板的URL如下所示。我看过他们的代码,但我不知道他们是怎么做到的 我可以这样做: if (ctype_digit($_GET['shownews'])) include('shownews.php'); elseif (ctype_digit($_GET['sho

我想要像index.php?showuser=512,index.php?shownews=317这样的url,用于我从db获取内容的页面。。。对于常规页面index.php?page=about等,无需修改重写

Invision电源板的URL如下所示。我看过他们的代码,但我不知道他们是怎么做到的

我可以这样做:

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'); 
但这感觉太乱了。 只是好奇IPB是如何做到这一点的。有没有更好的办法?没有任何修改。有人知道吗?我怀疑他们会像上面那样做

我做不到:

if (preg_match('/^[a-z0-9]+$/', $_GET['page'])) include('$_GET['page']');
然后我会得到像index.php?showuser&id=512这样的链接,这是我不喜欢的。(我知道仅仅展示Princi是不安全的)

我喜欢这种方式,这不是最好的,但我喜欢它,所以请安静的模板引擎,框架等只是善良的回答我的问题。。。我只是想知道IPB是如何做到这一点的

谢谢
托梅克

我不知道IPB是如何做到这一点的,让我们把它放在一边。但是,我会这样处理这个问题:

首先,我认识到有两种GET参数:page/identifier和just page。这些将分别进行测试

第二,我认识到所有get参数都与它们的文件名匹配,没有php后缀,因此我们可以利用这一点

要记住的最重要的事情之一是永远不要让GET参数影响未初始化的代码。在这种情况下,我们知道可以显示哪些类型的页面,并且希望显示哪些类型的页面,因此我们可以从中创建一个白名单

因此,在伪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();

对于页面,您只需使用一个简单的数组

if (isset($pages[$_GET['page']])) include $pages[$_GET['page']];
对于shownews=317,您可以在应用程序中进行简单转换。根据您希望对页面或shownews等进行优先级排序的方式:

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
  }
}

注意:页面“名称”是数组键,值是要包含的路径、文件和扩展名。更加可定制。

非常感谢!好多了