FILTER_SANITIZE与FILTER VALIDATE,有什么不同 - 以及使用哪些?

spe*_*orx 8 php filter-input

目前我在PHP中使用表单作为输入方法制作类似计算器的应用程序.为了确保输入,我正在使用filter_input()功能.作为过滤器,此函数从两组中获取一个元素:FILTER_SANITIZE并且FILTER_VALIDATE,我应该使用哪一个来过滤来自表单的输入?

$number1 = trim(filter_input(INPUT_GET, 'number1', FILTER_VALIDATE_FLOAT));
Run Code Online (Sandbox Code Playgroud)

要么

$number1 = trim(filter_input(INPUT_GET, 'number1', FILTER_SANITIZE_FLOAT));
Run Code Online (Sandbox Code Playgroud)

Qir*_*rel 15

这取决于您的需求或适合您的应用,真的.一个人会验证它,并说"是的,这是(或不是)一个有效的浮动",而另一个会清除它的任何不可接受的值并返回,并且如果原始输入有效或者没有说什么不要一开始.

这同样适用于其他FILTER_SANITIZE_*FILTER_VALIDATE_*常量,但在这个例子中,我们将看原始问题中提到的浮点验证和卫生.

让我们来看看!

$float = 0.032;
$not_float = "0.03b2";

var_dump(filter_var($float, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));
var_dump(filter_var($not_float, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));

var_dump(filter_var($float, FILTER_VALIDATE_FLOAT));
var_dump(filter_var($not_float, FILTER_VALIDATE_FLOAT));
Run Code Online (Sandbox Code Playgroud)

从上面的转储返回将是

string(5) "0.032"  // $float          FILTER_SANITIZE_NUMBER_FLOAT
string(5) "0.032"  // $not_float      FILTER_SANITIZE_NUMBER_FLOAT
float(0.032)       // $float          FILTER_VALIDATE_FLOAT
bool(false)        // $not_float      FILTER_VALIDATE_FLOAT
Run Code Online (Sandbox Code Playgroud)

FILTER_SANITIZE_NUMBER_FLOAT将返回一个已清理值的字符串(PHP不是强类型语言,所以"0.032" == 0.032).
您还应该注意该FILTER_FLAG_ALLOW_FRACTION标志,它保持小数位(没有它将返回的标志0032).

正如您所看到的,如果它不是有效的float,则FILTER_VALIDATE_FLOAT返回一个布尔值,false如果它是有效的,则返回实际的浮点值(这是一个"真实的"值).请记住,这0.00将是一个"虚假"值,因此如果您想检查验证是否失败,您应该使用严格比较,以防输入为零,但仍然有效.

if (filter_var($input, FILTER_VALIDATE_FLOAT) === false) {
    // Oh noes! $input wasn't a valid float!
}
Run Code Online (Sandbox Code Playgroud)

你可以在这个现场演示中亲眼看到它.

总结
如果你想在计算中使用它,你可能想要验证它,并让用户知道它的格式无效,但你可以清理它,并且无论如何都要使用它.

其他过滤器
此处的检查显示了其用途FILTER_SANITIZE_FLOAT,但还有其他验证和santation过滤器.有关完整说明,请参阅以下链接.

  • 感谢您的精彩回答,现在事情对我来说更加清晰. (2认同)