2011-07-25 3 views
8

у меня есть это 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, но я не был уверен, что это хороший способ ... любые идеи помогут много

ответ

4

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

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

повторять, не делайте этого, если $ включают заполняется от входа пользователя!

+0

Вы уверены в 'file_exists ($ include)'? Это просто часть пути. Он всегда будет «ложным». –

+0

Я отредактировал его за несколько минут до вашего комментария – genesis

+0

Извините :) +1 для просмотра кода в ответе :) –

2

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

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

Чтобы сделать его более безопасным, например, вы можете удалить слэш из $parts[count($parts) - 1]

+0

Это огромный риск для безопасности, если он вводит пользователя! ../../../../etc/passwd ??? – genesis

+0

Как я уже сказал, я не писал проверки безопасности, но вы можете, например, удалить косые черты или двойные точки. – mck89

+0

Я поднимусь, как только проверки безопасности будут добавлены в пример. – mskfisher

1

Почему не что-то вроде этого?

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

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

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

Обратите внимание, что вы ДОЛЖНЫ проверить содержимое $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"); 
    } 
} 
+0

второй оператор if, который делает preg_match ... должен идти до $ page = $ parts [count ($ parts)] - 1; или после и что именно он проверяет – Trace

+0

@Tamer поместите 'if()' внутри 'preg_match() if()' Я изменю ответ выше. –

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"); 
} 
+2

+1 для подбора белого списка –

+1

Белый список - хорошая концепция, но ручное сохранение 190 записей (что более чем вероятно изменится), по крайней мере, громоздко. Было бы предпочтительнее создать белый список с помощью scandir() в каталоге pages/и использовать этот каталог в качестве самого белого списка. –

+0

Как бы вы построили этот белый список с помощью scandir() – Trace

1

Другой подход должен был бы проверить, если данный файл действительно существует в определенном каталоге:

$file = $_SERVER['DOCUMENT_ROOT'] . '/' . basename($parts[count($parts) - 1]) . '.php'; 
if (is_file($file)) include($file); 
Смежные вопросы