简单的 php 计算器与表单验证



今天我写了一个简单的计算器,但我在表单验证方面遇到了问题。我确实执行验证,因为我希望计算器计算数字,而不是对象或数组等。当我执行验证时,输入无法验证为数字,因为无论我输入什么,php 都会警告我传递字符串而不是数字。

这是我的代码:

<?php
$A = trim(strip_tags(filter_input(INPUT_GET, 'A', 'FILTER_VALIDATE_FLOAT')));
$B = trim(strip_tags(filter_input(INPUT_GET, 'B', 'FILTER_VALIDATE_FLOAT')));
$operation = trim(strip_tags(filter_input(INPUT_GET, 'operation', 'FILTER_VALIDATE_STRING')));
if(isset($A) && isset($B) && isset($operation)){
if(!is_numeric($A) || !is_numeric($B)){
echo "Invalid parameters.";
}
else{
if($operation == 'plus'){
echo "$A + $B = ", $A + $B;
}
else if($operation == 'minus'){
echo "$A - $B = ", $A - $B;
}
else if($operation == 'multiplication'){
echo "$A * $B = ", $A * $B;
}
else if($operation == 'division'){
echo "$A / $B = ", $A / $B;
}
else{
echo "Invalid operator.";
}
}
} else {
echo "No operators.";
}
?> 
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<form name='form1' action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method='get'>
<div>
<p>argument 1 <input type='text' name='A'></p>
+ <input type='radio' name='operation' value='plus' checked='checked'>
- <input type='radio' name='operation' value='minus'>
* <input type='radio' name='operation' value='multiplication'>
/ <input type='radio' name='operation' value='division'>
<p>argument 2 <input type='text' name='B'></p>
<input type='submit' value="Calculate">
</div>
</form>
</body>
</html>

这些是我在浏览器中打开文件时收到的警告消息: 警告:filter_input(( 期望参数 3 是整数,字符串在 ./file.php 第 3 行给出

警告:filter_input(( 期望参数 3 是整数,字符串在第 4 行的 ./file.php 中给出

警告:filter_input(( 期望参数 3 是整数,字符串在 ./file.php 第 5 行给出 参数无效。

我也得到了关于过滤器输入的有趣事情。当我写:FILTER_VALIDATE_STRING没有" ' "时,我会收到额外的警告: 警告:在第 4 行的 ./file 中使用未定义的常量FILTER_VALIDATE_STRING - 假设"FILTER_VALIDATE_STRING"(这将在未来的 PHP 版本中抛出错误.php filter_validate_float也是如此。

我做错了什么,我应该在此表单验证中改进什么?

鉴于你所说的,你的代码应该是正确的。 PHP 尽可能将字符串转换为数字,因此它应该能够乘法。警告不是实际问题。IE,如果您调用未设置的变量,它会向您发出警告,指出该变量未定义。在这种情况下,您不需要执行filter_var。事实是,如果变量不是数字,您想阻止它工作,但它已经不起作用。您无法从表单中获取真正的数字输入,即使您输入数字输入类型,默认情况下它将被视为平面文本。但是,如果您想改进以确保只输入数字,您可以做什么,您可以将文本输入更改为:

<input type='number' name='B' />

这将确保输入数字。但是,它不会阻止 URL 注入。

如果您有任何其他问题,请在评论中告诉我:)

最新更新