今天我写了一个简单的计算器,但是表单验证有问题。我确实执行验证,因为我希望计算器计算数字,而不是对象或数组等。当我执行验证时,输入不能被验证为数字,因为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为整数,第3行的./file.php中给出字符串
警告:filter_input()期望参数3为整数,第4行的./file.php中给出字符串
警告:filter_input()期望参数3为整数,第5行的./file.php中给出字符串 参数无效。
我也对滤波器输入感兴趣。当我写:FILTER_VALIDATE_STRING没有&#34; &#39; &#34;然后我得到了额外的警告: 警告:使用未定义的常量FILTER_VALIDATE_STRING - 假设&#39; FILTER_VALIDATE_STRING&#39; (这将在PHP的未来版本中引发错误)在第4行的./file.php中 filter_validate_float也一样。
我做错了什么,我应该在这种表单验证中改进什么?
答案 0 :(得分:0)
根据您的说法,您的代码应正确无误。 PHP尽可能将字符串转换为数字,因此它应该能够相乘。警告不是实际问题。 IE,如果你调用一个未设置的变量,它会给你一个警告,告知你没有定义变量。在这种情况下,您不需要执行filter_var。事实是,如果变量不是数字但是它已经不起作用,你想要阻止它工作。您无法从表单中获取 true 数字输入,即使您输入数字输入类型,因为默认情况下它将被视为平面文本。你可以做什么但是如果你想改进以确保只输入 的数字,你可以将你的文字输入改为:
<input type='number' name='B' />
这将确保输入数字。但是,它不会阻止URL注入。
如果您有任何其他问题,请在评论中告诉我们:)