2010-01-06 109 views
0

是否有一個類可以處理$_REQUEST,使php開發人員的生活更輕鬆? 我想更輕鬆地處理客戶端請求。 我不想用if(is_set($_REQUEST['blabla'])) {makesomthing();} 測試我希望可以有這樣的解決方案。如何處理PHP中的請求

class rpclike 
{ 
public function getMember() 
{ 
    $memberid = $this->inputhandler['memberid']; 
    $member = $this->memberclass->getmember($memberid); 

    foreach($member as $mem) 
    { 
    echo $mem->id; 
    } 
} 

} 

$rpc = new rpclike(); 

那麼,如果我從一個javascript調用rpclike這樣

<a href="#" onclick="GETURL("rpclike.php?getMember&memberid=22")">Get member</a> 

哪些類可以做這樣的事情?

+0

允許用戶決定將要調用的內容將始終以災難結束。 – Cfreak 2010-01-06 22:59:07

+0

我真的不能理解爲什麼這個問題是被拒絕投票,這是一個正常的問題。我認爲沒有理由倒票 – streetparade 2010-01-06 23:00:01

+0

我不喜歡它,因爲它容易出現安全問題。你在該類中放置的任何功能都將暴露給網絡。你可能是你項目的唯一開發人員,但其他人可能會看到這一點,並認爲這是一個好主意,實施它,有人在他們的項目上工作可能不知道曝光並實施delete_user方法或類似的東西。 – Cfreak 2010-01-06 23:09:07

回答

1

PHP並沒有真正具有默認的類結構,您可以以這種方式使用,因爲它的起源是基於過程的編程。

如果你覺得有必要創建一個這樣的類,那將是相當微不足道的。但是,你真的只是增加開銷。如果它的便利性對你來說是值得的,那麼你可以利用__get() and __set()方法來處理你的存在檢查。

事實上,您希望以更容易的方式處理客戶端請求,這可能是一個很好的指示器,您應該轉移到類似於MVC框架的東西,該框架通常處理URL並將它們自動路由到適當的方法。大多數PHP框架都會爲你做到這一點。想了解這個過程通常如何工作,你可以使用see how CodeIgniter does it

+0

謝謝你,你激勵我使用從現在開始和最多的時間只是框架codelgniter,有一個愉快的夜晚 – streetparade 2010-01-06 23:21:13

0

我不這麼認爲。能夠調用任意方法將是一個巨大的安全漏洞。

+0

當然,但如果(!$ this-> user-> isadmin()) 返回false,我會在做任何事之前先打電話; – streetparade 2010-01-06 22:58:01

+0

這不一定是關鍵。假設你的系統不安全(沒有系統是100%安全的),並且有人設法欺騙管理員憑證,他們可能會執行任何操作。如果你自己做派遣,你至少可以限制這一點。 – Joe 2010-01-06 23:25:07

2

不建議您使用$_REQUEST,因爲它會引起安全問題。您應該使用$_GET,$_POST$_COOKIE之一,具體取決於您嘗試檢索的全局請求變量。最好的辦法是將有類似以下內容:

class input { 

    public static function get($key, $value = false) { 
     return (!empty($_GET[$key])) ? $_GET[$key] : $value; 
    } 

    public static function post($key, $value = false) { 
     return (!empty($_POST[$key])) ? $_POST[$key] : $value; 
    } 

    public static function cookie($key, $value = false) { 
     return (!empty($_COOKIE[$key])) ? $_COOKIE[$key] : $value; 
    } 

} 

然後,您可以使用類,如:

if (input::post('field', null) != null) { 

} 

if (input::get('field', false) != false) { 

} 

儘管這仍然需要測試,您可以在沒有爲全局變量設置數據的情況下顯式設置返回值。

+0

不要忘記實施'get_magic_quotes_gpc()'解決方法。 – 2010-01-07 11:08:29

+0

非常真實,想到提起它......我只是習慣於讓它自己關閉。 – 2010-01-07 13:59:41

-1

做這樣的事情:

url: /foo/bar?req=getMembers&memberid=22 

然後,你可以這樣做:

$request = $_GET['req']; 
$request(); 

略少於危險的版本:

$req_methods = array(
    getMembers => 'some_function', 
    saveMembers => 'another_function', 
    sendMessage => 'send_him_an_email' 
); 
$request = $_GET['req']; 
$req_methods[$request](); 
+0

這似乎只是有點冒險。例如,如果某人請求/ foo/bar之類的內容?req = apache_child_terminate或其他一些危險函數? – 2010-01-06 23:06:47

+0

增加了一點危險的版本。 – slebetman 2010-01-06 23:11:01

+0

我仍然建議用'isset($ req_methods [$ request])來包裝後者' – 2010-01-06 23:17:20

1
從參與這一明顯的安全隱患

除此之外,它是可行的。這是在MVC系統中用於轉向請求的常見模式。

說你要求index.php?class = User & method = ViewProfile

$module = new $_GET['class'](); 
if(!method_exists($module,$_GET['method'])) 
$module->$eventName();