0

我使用下面的这个例子来询问如何将数组传递给 Switch,而不是像这样将它们全部列出?

也许如果我从数据库中为所有“页面”获取一个数组作为页面。

我认为这种方法不是最优雅的方法。

switch($_GET['page'])
{
case 'home':
    include('home.php');
    break;
case 'oem-customers':
    include('oem-customers.php');
    break;
case 'job-shop': 
    include('job-shop.php');        
    break;
case 'anodized-magnet-coils':
    include('anodized-magnet-coils.php');
    break;
case 'design':
    include('design.php');
    break;
case 'services':
    include('services.php');
    break;
case 'black-foil':
    include('black-foil.php');
    break;  
case 'contact':
    include('contact.php');
    break;
case 'order';
    include('order.php');
    break;
default: 
    include('home.php');
}
4

7 回答 7

5

怎么样

switch($_GET['page'])
{
case 'home':
case 'oem-customers':
case 'job-shop': 
case 'anodized-magnet-coils':
case 'design':
case 'services':
case 'black-foil':
case 'contact':
case 'order';
    include("$_GET[page].php");
    break;
default: 
    include('home.php');
}
于 2012-09-20T23:25:26.030 回答
3

带有数组的示例:

$pages = array(
    'oem-customers',
    'job-shop',
    'anodized-magnet-coils',
    'design',
    'services',
    'black-foil',
    'contact',
    'order' 
);

if(in_array($_GET['page'], $pages)){
    include($_GET['page'].'.php');
}else{
    include('home.php');
}
于 2012-09-20T23:25:34.547 回答
3

您可以创建映射:

$mapping = array(
   'home' => 'home',
   'oem-customers' => 'oem-customers',
   #....
);

$page = $_GET['page'];
$file = isset($mapping[$page]) ? $mapping[$page] : 'home';
include($file.'.php');

或者首先查找文件,检查文件是否存在,如果需要,可能使用额外的映射。注意:清理输入,用户可以发送../../etc/whatever请求。

于 2012-09-20T23:25:59.680 回答
2

您可以执行以下操作:

switch($_GET['page']){
  case 'home':case 'oem-customers':case 'job-shop':case 'anodized-magnet-coils':
  case 'black-foil':case 'services':case 'design':case 'contact':case 'order':
    include($_GET['page'].'.php');
    break;
  default: 
    include('home.php');
}
于 2012-09-20T23:25:26.510 回答
2

好吧,您似乎在 和 页面的文件名之间有一个很好的匹配$_GET['page'];一个简单的事情是:

   $toInclude = "{$_GET['page']}.php";
   include($toInclude);

当然,你要小心;有人可以通过传入一些不好的东西来欺骗你page,比如'../../some_other_project/delete_all_data.php'。所以可以保留您允许的所有页面的验证列表:

   $validPages = array('order.php', 'home.php');
   if (!in_array($toInclude, $validPages))
       $toInclude = 'home.php';
于 2012-09-20T23:27:42.870 回答
2

如果是我,我会将您可以请求的脚本移动到requests/文件夹中并执行以下操作:

$script = basename( $_GET['page'] );
$dir = 'requests/';
$file = $dir . $script . '.php';
if ( !file_exists( $file ) ) {
  $file = $dir . 'home.php';
}
include( $file );
  1. 比其他任何东西都紧凑得多。
  2. 每当您添加新页面时都会自动更新。
  3. 在包含之前内置检查文件是否存在。
  4. 由于包含requests/文件夹和basename().
于 2012-09-20T23:36:57.387 回答
2

我会建议一种完全不同的方式:

$base_path = '/path/to/dir/';
$req = basename($_GET['page'] . '.php');
$page = $base_path . $req;
$file = file_exists($page) ? $page : $base_path . 'home.php'; 
include($file);
于 2012-09-20T23:37:53.437 回答