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

在PHP中验证数据类型和范围的表单输入,php,validation,Php,Validation,我的问题相当简单。我需要验证用户是否输入了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)

我的问题相当简单。我需要验证用户是否输入了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";
}


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

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

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

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

例如:

if(isset($_POST['grade1']))
{
    $grade1=$_POST['grade1'];
}
因此,如果用户未提交等级1的值,您将不会得到未定义的索引错误


同样,对于错误变量
$error\u message
,也是如此。因为如果没有错误,比如用户输入了3个介于0和100之间的整数,您将得到未定义的变量
$error\u message

问题来自
is\u int()
它检查变量是否为整数,但是客户端输入(POST、get、Header等)总是字符串。这就是它失败的原因

if (!is_numeric($grade1) && !is_numeric($grade2) && !is_numeric($grade3)) {
    $error_message = 'Please enter three numeric grades.'; 
}
此外,您还需要检查这些值中是否有任何值是整数,而不是所有值。因此,用&&(and)替换| |(or)


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

错误消息包含什么?您是否尝试过初始化变量:
$error\u message='
?因此,如果有错误,请输入错误?什么不起作用?如果未设置为捕获和显示,请使用错误报告Don check with
is\u int()
,这适用于php变量,但不适用于用户输入,因为$\u POST和$\u GET是字符串。您可以使用
is\u numeric()
实际上,用户浏览器提交的所有内容都是字符串。我会回答的。。
<?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";
}