2014-09-04 61 views
0

所以我有一個帶有2個文本輸入的表單。 一個是價格,另一個是數量。 在保存表單之前,有一些檢查可以防止篡改用戶輸入和SQL注入。防止篡改用戶輸入和SQL注入失敗

所以其中之一是:

if(strval(floatval($quantity)) === $quantity && strval(floatval($price)) === price) { 
     $errors = false; 
    } 

與此檢查的問題是,如果我們有$價格=「47.80」例如 floatval()爲我們提供了47.8,然後strval()給了我們「 47.8「,這不等於」47.80「 所以檢查失敗,我們得到一個錯誤。

我想知道你是否可以想辦法解決這個問題,而不必更改邏輯。

+3

這是爲什麼?如果你的數量是整數 - 檢查它是否是整數。如果你的價格是浮動的 - 檢查它是否浮動。例如,對於字符串表示的數字,存在諸如「is_numeric()」之類的東西。但真的:[this](http://us1.php.net/filter_var)和[this](http://us1.php.net/ctype) – 2014-09-04 10:54:07

+0

真正的解決方案是使用準備好的語句,而不必擔心關於sql注入。 – 2014-09-04 10:55:55

+0

這不是一個浮動。它實際上是一個來自數據庫的字符串。它也存儲爲一個字符串。再加上輸入是一個帶有字符串值的文本框。這就是表單的方式,就像我說過的,我不想因爲各種原因而改變它。所以我必須找到一種方法來操縱它。 – 2014-09-04 10:55:57

回答

0

您可以使用過濾器擴展:

$price = filter_var($price, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION); 

它刪除一切,不是一個數字或一個週期。

如果數字必須有兩個小數點,那麼你必須以某種方式強制執行。您可以不允許沒有兩位小數的數字,也可以自己修改輸入。像這樣的事情應該這樣做:

$price= number_format($price, 2, '.', null);