带有表单验证的简单php计算器

时间:2017-07-17 17:34:59

标签: php validation

今天我写了一个简单的计算器,但是表单验证有问题。我确实执行验证,因为我希望计算器计算数字,而不是对象或数组等。当我执行验证时,输入不能被验证为数字,因为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也一样。

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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