2011-03-21 136 views
18

如果我發出HTTP DELETE,我該如何訪問PHP正文/變量?我知道如果您發佈POST,您可以通過$_POST['varname']訪問它,但如果它是DELETE而不是POST,您如何訪問它?說這裏的varname是ID。得到一個PHP刪除變量

+0

它是http:// stackoverflow的副本。 com/questions/1405505/access-delete-from-jquery-in-php,但我不知道答案是否對你有幫助。 – 2011-03-21 07:21:36

+0

檢查出來,不幫助我 – aherlambang 2011-03-21 07:23:34

+0

你可以在'$ _GET'中獲得變量。如果該方法不是'GET'並且'POST'請求​​將以'GET'方法發送 – 2011-03-21 07:28:37

回答

12

您可能需要查看直接從php://input流讀取數據。

我知道這就是你需要做的PUT請求和一些快速的谷歌搜索表明該方法也適用於DELETE

例如參見herehere。評論here表示此方法也適用於DELETE

這裏是一個有趣的代碼示例,這將有助於(從爲了簡潔改變輕微symfony的1.4.9框架的sfWebRequest.class.php):

public function initialize(...) 
{ 
    ... code ... 

    $request_vars = array(); 
    if (isset($_SERVER['REQUEST_METHOD'])) 
    { 
    switch ($_SERVER['REQUEST_METHOD']) 
    { 
     case 'PUT': 
     if ('application/x-www-form-urlencoded' === $this->getContentType()) 
     { 
      parse_str($this->getContent(), $request_vars); 
     } 
     break; 

     case 'DELETE': 
     if ('application/x-www-form-urlencoded' === $this->getContentType()) 
     { 
      parse_str($this->getContent(), $request_vars); 
     } 
     break; 
    } 
    ... more code ... 
} 

public function getContent() 
{ 
    if (null === $this->content) 
    { 
    if (0 === strlen(trim($this->content = file_get_contents('php://input')))) 
    { 
     $this->content = false; 
    } 
    } 

    return $this->content; 
} 

此代碼示例放PUTDELETE或請求參數進入$request_vars陣列。一個限制似乎是表單(如果您使用另一個內容類型標題)必須是'application/x-www-form-urlencoded',一些快速的谷歌搜索證實了這一點。

+0

這麼說之後,我可以通過$ request_vars ['id']來訪問它嗎? – aherlambang 2011-03-21 13:14:59

+0

是的,基本上。您將無法按原樣使用代碼,因爲它是大類的一部分,但它是您所需的模板。 – xzyfer 2011-03-21 21:12:04

4

file_get_contents('php://input')應該總是給你完整的請求體。請注意,它可能只能讀取一次。更大的問題是DELETE請求是否可能包含一個正文,這似乎是unanswered question,但可能工作。

我想說,在身體發送身份證有點RESTless雖然。相關實體應該被URL稱爲example.com/foo/42,所以DELETE請求應該說DELETE /foo/42,而不是DELETE /foo與請求正文中的id。

+0

那我該如何得到具體的變量名?我必須對字符串進行解析嗎? – aherlambang 2011-03-21 07:27:23

+2

@Equ [是](http://php.net/parse_str)。 – deceze 2011-03-21 07:29:02

1

正如上面的人所說的,PHP確實有而不是有一個全局變量來快速訪問DELETE請求中的數據。爲什麼,我不知道;它歷史上可能還沒有被用作GETPOST

您必須使用$_SERVER['REQUEST_METHOD']檢查請求類型,然後使用php://input流檢索整個正文並從中提取數據。如果您希望保持類似的代碼外觀(假設您使用的是$_POST$_GET),則可以創建一個函數在每個請求上執行此操作並將其保存在名爲$_DELETE的全局變量中。你甚至可以修補你的PHP來做到這一點,並編譯你自己的PHP版本,但這當然會讓試圖在另一個PHP安裝上運行你的代碼的人感到困惑:)