有没有办法简化这种案例陈述?

时间:2011-07-25 15:21:44

标签: php loops directory switch-statement

我有这个PHP案例陈述

switch ($parts[count($parts) - 1]) {
    case 'restaurant_pos':
        include($_SERVER['DOCUMENT_ROOT'] . '/pages/restaurant_pos.php');
        break;
    case 'retail_pos':
    include($_SERVER['DOCUMENT_ROOT'] . '/pages/retail_pos.php');
        break;  
    .....

}

哪个效果很好,但我有很多文件(比如190),我很想知道是否有办法让这个案例陈述很多可以解决任何问题,所以我不必做190个案例。我想我可以在案件中使用condtion并且可能看看该文件是否存在,如果是,那么显示,如果没有那么可能是404页但我不确定这样做的好方法...任何想法都会有帮助很多

7 个答案:

答案 0 :(得分:15)

您可以在数组中预定义文件名,然后使用in_array来检查名称是否存在:

$files = array('restaurant_pos', 'retail_pos', ......);
$file = $parts[count($parts) - 1];
if (in_array($file, $files)) {
    include($_SERVER['DOCUMENT_ROOT'] . "/pages/$file.php");
}

答案 1 :(得分:4)

如果不是用户输入,可以像

那样进行
$include = $parts[count($parts) - 1];
if ($include) {
    if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/pages/'.$include.'.php')){
          include $_SERVER['DOCUMENT_ROOT'] . '/pages/'.$include.'.php';
    }
}

重复,如果从用户的输入填充$ include,请不要这样做!

答案 2 :(得分:2)

这是一个没有安全检查的简单实现:

$file=$_SERVER['DOCUMENT_ROOT']."/pages/".$parts[count($parts) - 1].".php";
if(file_exists($file)) include $file;
else show404();

为了使其更安全,例如您可以从$parts[count($parts) - 1]

中删除斜杠

答案 3 :(得分:2)

检查文件是否存在,然后将其包含在内。

请注意,您必须验证$page的内容,以确保它不包含类似/../../../../的路径,以尝试读取文件系统上的其他位置(如果这是用户输入的话)。 / p>

如果您知道,例如您的所有路径都是带下划线的字母数字,您可以这样做:

$page = $parts[count($parts)] - 1;

if (preg_match('/^[A-Z0-9_]+$/i', $page)) {
  // it's okay, so include it.
  if (file_exists($_SERVER['DOCUMENT_ROOT'] . "/pages/$page.php") {
    include($_SERVER['DOCUMENT_ROOT'] . "/pages/$page.php");
  }
}

答案 4 :(得分:1)

为什么不是这样的?

$include_file = $_SERVER['DOCUMENT_ROOT'] . '/pages/' . $parts[count($parts) - 1] . '.php';

if (file_exists( $include_file ))
{
    include( $include_file );
}

答案 5 :(得分:1)

if (file_exists($path = $_SERVER['DOCUMENT_ROOT'].'/pages/'.$parts[count($parts) - 1].'.php')
{
    include $path;
}

答案 6 :(得分:1)

另一种方法是检查给定文件是否确实存在于特定目录中:

$file = $_SERVER['DOCUMENT_ROOT'] . '/' . basename($parts[count($parts) - 1]) . '.php';
if (is_file($file)) include($file);