Есть ли способ упростить это утверждение случая? - PullRequest
8 голосов
/ 25 июля 2011

У меня есть этот PHP-оператор case

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), и я хотел бы знать, есть ли способ заставить этот оператор case работать сничего, поэтому я не должен делать 190 условий случая.Я думал, что могу использовать условие в этом случае и, возможно, посмотреть, если этот файл присутствует, и если да, то отобразить, а если нет, то, возможно, страницу 404, но я не был уверен, что хороший способ сделать это ... любые идеи помогутмного

Ответы [ 7 ]

15 голосов
/ 25 июля 2011

Вы можете предварительно определить имена файлов в массиве, а затем использовать 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");
}
4 голосов
/ 25 июля 2011

Если это не пользовательский ввод, вы можете сделать это как

$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 голосов
/ 25 июля 2011

Убедитесь, что файл существует, а затем включите его.

Обратите внимание, что вы ДОЛЖНЫ проверить содержимое $page, чтобы убедиться, что он не содержит путь, подобный /../../../../, для попытки чтения в другом месте вашей файловой системы, если это должен быть ввод пользователя.

Если вы знаете, например, что все ваши пути будут буквенно-цифровыми с подчеркиванием, вы можете сделать:

$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");
  }
}
2 голосов
/ 25 июля 2011

Это простая реализация без проверок безопасности:

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

Например, чтобы сделать ее более безопасной, вы можете удалить косую черту из $parts[count($parts) - 1]

1 голос
/ 25 июля 2011

Другой подход заключается в проверке, существует ли данный файл в определенном каталоге:

$file = $_SERVER['DOCUMENT_ROOT'] . '/' . basename($parts[count($parts) - 1]) . '.php';
if (is_file($file)) include($file);
1 голос
/ 25 июля 2011
if (file_exists($path = $_SERVER['DOCUMENT_ROOT'].'/pages/'.$parts[count($parts) - 1].'.php')
{
    include $path;
}
1 голос
/ 25 июля 2011

Почему бы не что-то подобное?

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

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