2012-06-14 21 views
0

我看到一些網站(例如): 如果你想查看你的消息框,那麼它是:example.com/file.php?action=pm,如果你想再次發送消息的地址和文件是一樣的,但$_GET是不同:example.com/file.php?action=sendpm

它是如何工作的?

難道僅僅是:

if ($_GET['action'] == "pm") 
{ 
    //lots of html code(divs, forms, etc) paste here for action=pm. 
} 
else 
{ 
    //lots of html code paste here for action=send 
} 

而不是有文件:pm.php,send.php ...或者該機制是不同的?

我看到SMF使用這種機制,我也看到類似於facebook.com/?ref=something的東西。

它是如何工作的?

回答

6

最簡單的方法是這樣的:

$action = isset($_GET['action']) ? $_GET['action'] : 'default'; 
if(!in_array($action, array('list', 'of', 'allowed', 'pages'))) 
    $action = 'default'; 
include($action . '.php'); 

注意,驗證步驟是非常重要。如果未正確驗證該值,則會導致用戶讀取任何可以執行任意代碼的用戶可以訪問的文件的安全漏洞。

將所有代碼放入單個文件中,就像您在您的問題中所建議的一樣,這是一個壞主意,因爲它會導致代碼不可讀。尤其是當你在你的問題建議(如:使用模板引擎!)相同的文件混合PHP和HTML!

+0

是「包括()」函數像C++,並粘貼action.php的在這個頁面的代碼,那麼會是像我的建議,但太乾淨了嗎?這是主要想法嗎? –

+1

它與'#include'類似,但不是由預處理器執行。請參閱php.net/include – ThiefMaster

0

你可以有一個switch語句。例如

example.com/file.php?action=pm or example.com/file.php?action=sendpm 


if (isset($_REQUEST['action'])) { 
$param = $_REQUEST['action']; 
    switch($param) { 
    case "pm": 
     // Code goes here 
     break; 
    case "sendpm": 
     // Do something here 
     break; 
    default: 
     // handle the default case 
     break; 
    } 
} else { 
    // Handle it here 
} 

那麼還有其他方法可以做到這一點! 開關是最簡單的方法之一!