正在验证PHP中数据类型和范围的表单输入


Validating form input for data type and range in PHP

我的问题很简单。我需要验证用户是否输入了3个整数值,每个整数值都在0到100之间,或者打印一条错误消息。

现在错误消息工作正常,但当我输入3个正确的数字时,我仍然会收到一个错误。

<?php
// get the data from the form
$grade1 = $_POST["grade1"];
$grade2 = $_POST["grade2"];
$grade3 = $_POST["grade3"];
// TEST FOR INTEGER
if (!is_int($grade1) || !is_int($grade2) || !is_int($grade3)) {
    $error_message = 'Please enter three numeric grades.'; 
}
// TEST FOR RANGE
if ($grade1 < 0 || $grade1 > 100 || $grade2 < 0 || $grade2 > 100 || $grade3 < 0 || $grade3 > 100) {
    $error_message = 'You must enter grades between 0 and 100.';
}
if ($error_message != '') {
    include('index.php');
    exit();
}
// calculate grade average
$average = ($grade1 + $grade2 + $grade3) / 3;
$average_f = number_format($average, 0);
// calculate letter grade
if ($average >= 90 && $average <= 100) {
    $letter = "A";
} else if ($average >= 80 && $average < 90) {
    $letter = "B";
} else if ($average >= 70 && $average < 80) {
    $letter = "C";
} else if ($average >= 60 && $average < 70) {
    $letter = "D";
} else if ($average >= 0 && $average < 60) {
    $letter = "F";
}

?>

我希望能很容易地说出我想做什么以及我是如何做的。提前感谢您的建议:)

一般建议,可能是您遇到的错误:

如果不检查变量是否已设置,您几乎无法使用这些变量。

在检查变量和$_POST类型之前,需要使用isset

示例:

if(isset($_POST['grade1']))
{
    $grade1=$_POST['grade1'];
}

因此,如果用户不提交grade1的值,则不会出现未定义索引错误

对于您的错误变量$error_message也是如此。因为如果没有错误,比如说用户输入了0和0之间的3个整数;100,则会得到未定义的变量$error_message

问题来自is_int(),它检查变量是否为整数,但客户端输入(POST、GET、headers等)始终为字符串。这就是它失败的原因。

if (!is_numeric($grade1) && !is_numeric($grade2) && !is_numeric($grade3)) {
    $error_message = 'Please enter three numeric grades.'; 
}

此外,您还可以检查这些值中是否有整数,而不是全部。因此,将||(或)替换为&amp;(和)。

此外,将$error_message与空字符串进行比较,检查$error_message是否为isset()或检查其empty()是否更容易读取,执行速度也更快。但总的来说,这没什么好担心的,因为无论哪种方式,如果出现错误,它都会返回true。