2011-07-25 31 views
8

我有這個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),我很想知道,如果有一種方法,使這種情況下語句什麼很多工作,所以我不必做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

我會upvote一旦安全檢查添加到示例。 – 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個條目(很可能會改變)至少是很麻煩的。最好使用pages /目錄中的scandir()構建白名單,並將該目錄用作白名單本身。 –

+0

你將如何使用scandir()構建該白名單() – Trace

1

另一種方法是檢查給定文件是否在特定目錄真的存在:

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