2012-01-19 107 views
2

現在我發現自己正在通過很多其他人的代碼工作。我注意到一些代碼中的if (isset($_POST)),並確保解決該問題。 (它總是會評估true)。然後我開始看到這個:

if ($_POST) 

經過這個想法後,它讓我很煩,但似乎仍然有效。有沒有人看到用這個來檢查表單是否被提交的問題?如果$_POST數組爲空,則它的計算結果爲false。任何特殊情況下,這可能無法正常工作?

+2

Btw爲什麼你檢查POST數組?您將檢查POST變量是否正確? '$ _POST [「data1」]' –

+1

最好檢查個別'POST'變量的有效性,但使用它的一個很好的理由是在用戶手動導航到表單處理頁面,在這種情況下'POST'數組將是空的,你可以相應地處理這種情況。我不認爲有這樣的情況,儘管這些代碼會失敗。我認爲最好的辦法就是使用它,然後在'if'中單獨檢查每個變量。 – martincarlin87

+0

我總是檢查特定的值。我只是想知道是否應該通過編輯在其他人的代碼中找到的數百個if($ _POST)實例。 – teynon

回答

6

這是一個不可靠的測試 - 它假定至少會提交一個表單元素。完全可以在沒有提交數據的情況下執行POST,這會使if ($_POST)的計算結果爲false,但是由於實際執行的是POST,所以是錯誤的。

適當的100%可靠的測試是

if ($_SERVER['REQUEST_METHOD'] == 'POST') { ... } 
1

不應該有任何情況下,它不會(不,我能想到的,反正),但我仍然會做:

if (!empty($_POST)) { 

這樣可以很清楚自己在做什麼。這實際上是相同的陳述,但更明顯。

+0

空的不正確。如果數組(0)它也是空的。使用['count'](http://php.net/count)檢查大小。 –

+0

@WouterJ'如果數組(0)它也是空的 - 不正確。試試這個'$ arr = array(0); var_dump(empty($ arr));' – DaveRandom

+0

@DaveRandom,試試這個:if(empty(array(0)))echo「我是空的」; – HappyTimeGopher

0
[[email protected]/var/www]telnet localhost 80 
Trying 127.0.0.1... 
Connected to localhost. 
Escape character is '^]'. 
GET /test.php HTTP/1.0 
Host: localhost 

HTTP/1.0 200 OK 
X-Powered-By: PHP/5.3.6-13ubuntu3.3 
Content-type: text/html 
Content-Length: 13 
Connection: close 

array(0) { 
} 

似乎GET-Requests也沒問題。但使用!empty($_POST)或類似軟件可讀性更強。

0

在程序員不希望發佈的表單的情況下,這是一個非常危險的測試。我的模式來測試每個字段我想到:

if (isset($_POST['foo_id']) && is_numeric($_POST['foo_id']) 
    && isset($_POST['name']) 
    && isset($_POST['value']) 
) { 

這樣,我可以肯定沒有處理錯誤的形式的機會。

3

要檢查如果數組是空的,你應該使用count()sizeof()並檢查是否大於零:

if(count($_POST) > 0) 
{ # Array not empty 
} 

檢查表單是否已提交的更好方法是檢查是否發送了後續變量:

if($_SERVER['REQUEST_METHOD'] === 'POST') 
{ # Form submitted 
} 
1

在PHP 4.1之前沒有$ _POST。取而代之的是一個叫做$ HTTP_POST_VARS的變量,除了它不是一個超級全局變量之外,其他變量都是一樣的。 $ HTTP_POST_VARS已被棄用,希望您不必擔心太多,但如果您運行php安裝,則$ _POST檢查可能實際返回false,因此您的代碼可能已檢查過該代碼。

if ($_POST)的行爲等同於if (!empty($_POST))除了一個重要的區別:第一個版本將拋出一個通知,如果沒有設置$ _ POST,空() - 版本將不會拋出的通知(當然error_output必須設置爲呼應通知爲你看到的東西)。如果您正在檢查的變量可能未被設置,則應始終使用空值。

我想說,如果你發現if ($_POST)比這是一種難聞的氣味。您已經注意到原始編碼器的意圖不清楚。如果他想知道HTTP-Request使用了POST方法,那麼Wouter的回答使得這個意圖更清晰。如果他想檢查$ _POST是否存在(檢查舊的PHP版本),那麼isset($_POST)更清晰。如果他想檢查一個POST請求是否至少有一個使用POST發送的參數,那麼empty($_POST)就更清晰了,這樣的意圖也應該是非常少見的。

我的建議是繼續閱讀源代碼,並檢查是否可以找出原始編碼器的意向,然後相應地替換構造(或至少對該行發表評論)。

+0

這使得更多的意義,因爲我正在與史前代碼工作。 – teynon