2011-08-19 87 views
1

昨天我在代碼中搜索了幾個小時後發現了一個錯誤,我注意到這個奇怪的評估。我將分數傳遞給php,有時候分數= 0會導致問題。PHP if()評估問題需要重寫

發送PHP?等等=等等&得分= 0

if(!empty($_REQUEST['score']){ 
    //do database update stuff 
}else{ 
    // show entire webpage 
} 

它的偉大工程,除非得分= 0,如果()將評估爲false和整個網頁回到我的AJAX的處理程序和錯誤。我已經臨時將!empty更改爲isset,但是這會導致將來出現問題,因爲即使score值不在值的url字符串中,isset也會計算爲true。
例如:(?等等=等等&得分= &東西=其他)

我的問題是:什麼是重新編寫這個現在和將來能夠正常工作的最佳方法?

編輯:這裏有幾個工作答案,我很欣賞每個人的時間。很難選擇答案

+0

嘗試使用'$ _GET'代替'$ _REQUEST'的? – nkcmr

+0

然後你可能想使用'strlen()'。 – mario

回答

1

嘗試做

if (isset($_REQUEST['score']) && ($_REQUEST['score'] !== '')) { 
... 
} 

的isset將處理存在/不存在查詢參數,嚴格字符串(!==)比較將處理'score'查詢存在但沒有值的情況。 PHP將來自_GET/_POST/_REQUEST的所有數據視爲字符串,因此該測試100%可靠。

+0

選擇了這一個,因爲雖然它不像我做的其他一些答案那樣擴展,但它確實回答了我的問題。謝謝 –

3

manual所述,如果變量具有空的或零值,則認爲該變量爲empty()

所以它會將您的變量錯誤地視爲空,儘管0在您的情況下是一個完全可接受的值。

如果您需要score是一個數字,你可以結合使用isset()is_numeric()檢查代替:

if((isset($_REQUEST['score']) and (is_numeric($_REQUEST['score'])){ 

退房手冊頁以查看類型的值is_numeric()接受。如果score始終是一個整數,那麼也可以使用is_int((int)$_REQUEST['score']),但它會將無效輸入值轉換爲0

此外,正如@sightofnick所說,最好使用明確的$_GET$_POST而不是$_REQUEST

回覆您的更新:

在這種情況下,我會

  1. 做檢查變量是否"0"(字符串 「零」)
  2. 如果"0",使0(整數「零」)
  3. 如果它不是0,將其轉換爲整數(int)$_REQUEST["score"])
  4. 如果轉換導致0,它是無效輸入 - 退出
  5. 您有一個有效的整數變量。
+0

我剛纔解釋了爲什麼我不能使用isset ..我不認爲你讀完整個問題。 –

+0

@Johnny足夠公平,增加了更準確的替代 –

+0

我很欣賞很好解釋的答案。不幸的是is_numeric也可以允許字母與數字混合在一起,這會導致我的巨大問題 –

2

如果值爲零,empty()將返回false。使用isset()array_key_exists()相反,如果你想檢查是否在數組中的變量設置:

if (array_key_exists('score', $_REQUEST)) {...} 
+0

我喜歡這一個,不幸的是我可以改變'分數'爲'任何',它仍然返回true。 –

0
if(isset($_REQUEST['score']) && $_REQUEST['score'] != ''){ 
    //do database update stuff 
}else{ 
    // show entire webpage 
} 
+0

!=''將會失敗。 0和''相當於每個,PHP根據需要高興地轉換它們。它應該是!== –

+0

沒有人爭辯,但實際上你在這裏弄錯了我的朋友 - 如果你不相信我,就把我的上面的代碼插入到PHP中,然後按照預期工作。此外,!==''甚至沒有意義,!==意思是「不計算爲」,所以你基本上說「如果$ _REQUEST ['score']不計算爲false」,這將永遠是如果$ _REQUEST ['score']被設置,則返回true。 – streetlogics

+0

試圖編輯我的評論,但錯過了窗口 - 看起來像我們的兩個解決方案工作。我假設我的工作原因是因爲從技術上講,0的$ _REQUEST值被傳遞爲一個字符串而不是一個整數0值,因此PHP不會自動將它轉換爲等同於'' – streetlogics

0

您可能能夠解決與

if (isset($_REQUEST['score']) && is_numeric($_REQUEST['score'])) {} 

那當然如果scrore只能包含數值