2013-01-22 91 views
2

我的網站使用PHP來檢查用戶使用「get」方法提交的值是否爲某個整數。該代碼是沿PHP - 字符串和整數

if ($_GET['input']==2) { ... } 

線的東西不過,我最近發現,如果用戶輸入類似2a2two甚至2omdodonsos,它仍然被認爲是由PHP值2。但是,如果用戶輸入23eee23twenty23ofnofnonf,則不會將其視爲2。爲什麼會發生?將使用此代碼:

if ($_GET['input']="2") { ... } 

解決問題?

回答

2

你可以(也應該)使用input filtering淘汰壞的輸入:

if (is_null($input = filter_input(INPUT_GET, 'input', FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE))) { 
    // an entry that was not an integer 
} elseif ($input === 2) { 
    // input was 2 
} 

參見:filter_input()

+1

PHP的過濾器功能被充分利用。慚愧,他們很好。 Upvoted。 –

0

您可以檢查GET值是數字,然後將其與2號比較:

if (is_numeric($_GET['input'])) { 
    switch($_GET['input']) { 
     case 1: 
     case 2: 
     // write your code here 
     break; 
     default: 
     //Default option 
    } 
} 

或直接使用===比較運算符作爲@fab建議。

http://php.net/manual/en/language.operators.comparison.php

1

對於爲什麼出現這種情況的解釋,閱讀type juggling的文檔。

的解決方案是一個安全型的比較(===

$_GET['input'] === '2' 
+0

此外,'(int)sprintf('%d',$ _GET ['input'])'可以確保您使用的是乾淨的數字。如果輸入變量不能被解析成十進制數,它將返回'0'。 –

+0

@Cobra_Fast:這應該在功能上等同於'intval($ _ GET ['input'])'或'(int)$ _ GET ['input']'。 'sprintf'是多餘的。當然,只要輸入將用於除「等於2」檢查以外的其他地方,它就會變得相關。 –