現在我發現自己正在通過很多其他人的代碼工作。我注意到一些代碼中的if (isset($_POST))
,並確保解決該問題。 (它總是會評估true
)。然後我開始看到這個:
if ($_POST)
經過這個想法後,它讓我很煩,但似乎仍然有效。有沒有人看到用這個來檢查表單是否被提交的問題?如果$_POST
數組爲空,則它的計算結果爲false
。任何特殊情況下,這可能無法正常工作?
現在我發現自己正在通過很多其他人的代碼工作。我注意到一些代碼中的if (isset($_POST))
,並確保解決該問題。 (它總是會評估true
)。然後我開始看到這個:
if ($_POST)
經過這個想法後,它讓我很煩,但似乎仍然有效。有沒有人看到用這個來檢查表單是否被提交的問題?如果$_POST
數組爲空,則它的計算結果爲false
。任何特殊情況下,這可能無法正常工作?
這是一個不可靠的測試 - 它假定至少會提交一個表單元素。完全可以在沒有提交數據的情況下執行POST,這會使if ($_POST)
的計算結果爲false,但是由於實際執行的是POST,所以是錯誤的。
適當的100%可靠的測試是
if ($_SERVER['REQUEST_METHOD'] == 'POST') { ... }
不應該有任何情況下,它不會(不,我能想到的,反正),但我仍然會做:
if (!empty($_POST)) {
這樣可以很清楚自己在做什麼。這實際上是相同的陳述,但更明顯。
空的不正確。如果數組(0)它也是空的。使用['count'](http://php.net/count)檢查大小。 –
@WouterJ'如果數組(0)它也是空的 - 不正確。試試這個'$ arr = array(0); var_dump(empty($ arr));' – DaveRandom
@DaveRandom,試試這個:if(empty(array(0)))echo「我是空的」; – HappyTimeGopher
[[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)
或類似軟件可讀性更強。
在程序員不希望發佈的表單的情況下,這是一個非常危險的測試。我的模式來測試每個字段我想到:
if (isset($_POST['foo_id']) && is_numeric($_POST['foo_id'])
&& isset($_POST['name'])
&& isset($_POST['value'])
) {
這樣,我可以肯定沒有處理錯誤的形式的機會。
在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)
就更清晰了,這樣的意圖也應該是非常少見的。
我的建議是繼續閱讀源代碼,並檢查是否可以找出原始編碼器的意向,然後相應地替換構造(或至少對該行發表評論)。
這使得更多的意義,因爲我正在與史前代碼工作。 – teynon
Btw爲什麼你檢查POST數組?您將檢查POST變量是否正確? '$ _POST [「data1」]' –
最好檢查個別'POST'變量的有效性,但使用它的一個很好的理由是在用戶手動導航到表單處理頁面,在這種情況下'POST'數組將是空的,你可以相應地處理這種情況。我不認爲有這樣的情況,儘管這些代碼會失敗。我認爲最好的辦法就是使用它,然後在'if'中單獨檢查每個變量。 – martincarlin87
我總是檢查特定的值。我只是想知道是否應該通過編輯在其他人的代碼中找到的數百個if($ _POST)實例。 – teynon