如何在PHP上准确验证字段


How can I exactly validate fields on PHP?

我有一个简单的编程练习,我正在尝试用PHP来做:确定学生是否通过了课程。如果学生三个年级的平均成绩大于或等于15分,他就会通过这门课程。如果学生通过或不通过,则显示一条消息,并在计算平均值之前验证三个成绩。如果分数有误,则显示错误消息。

我在伪代码和pseint中都有它,所以它很容易验证,因为我使用了一个do while循环,每次它要求我键入一个数字,而我做错了,它都会验证成绩:

Algorithm Exercise14
Define grade1, grade2, grade3, prom as Real;
Repeat
    print "Type the first grade: ";
    read grade1;
    if (grade1<0 | grade1>20) 
        print "Error! Invalid grade, type a valid grade.";
    endif
Until (grade1>=0 & grade2<=20);
Repeat
    print "Type the second grade: ";
    read grade2;
    if (grade2<0 | grade2>20) 
        print "Error! Invalid grade, type a valid grade.";
    endif
Until (grade2>=0 & grade2<=20);
Repeat
    print "Type the third grade: ";
    read grade3;
    if (grade3<0 | grade3>20) 
        print "Error! Invalid grade, type a valid grade.";
    endif
Until (grade3>=0 & grade3<=20);
prom = (grade1+grade2+grade3)/3;
if (prom>=15) 
    print "The student passed the course!";
    print "The average is: " prom;
else
    print "The student did not pass the course.";
    print "The average is: " prom;
endif
endAlgorithm

现在,我想用PHP来做这件事。我的问题是,我不能用这种方式进行验证,因为如果我这样做,浏览器只需要花很多时间来做出反应,它什么也不做,所以我在互联网上看了看,我需要一些功能来验证,但我不确定。我正在学习PHP,所以,如果这是一个重复的问题,或者很容易,请原谅,但我想知道,因为我正在学习。

最后一个问题是,如果我使用PHP,显然还有HTML5,我如何验证这些字段?

PHP代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Exercise 14</title>
    <meta charset="utf-8">
</head>
<body>
    <h2>PHP Exercises</h2>
    <h3>Exercise 14</h3>
    <form action="#" method="post" id="constant" name="constant">
        <div>
            <label for="text">Grade 1: </label>
    <input type="text" name="grade1" placeholder="Type grade1">
        </div>
        <div>
            <label for="text">Grade 2: </label>
        <input type="text" name="grade2" placeholder="Type grade 2">
        </div>
        <div>
            <label for="text">Grade 3: </label>
        <input type="text" name="grade3" placeholder="Type grade 3">
        </div>
        <div>
      <input type="submit" name="button" id="sending" value="Send">
        </div>
    </form>
    <?php
        if(isset($_POST['button'])){
            $grade1 = $_POST['grade1'];
            $grade2 = $_POST['grade2'];
            $grade3 = $_POST['grade3'];
            while($grade1<0){
                    echo "Error!";
            }
            do{
                if ($grade2<0 | $grade2>20) {
                    echo "Error!";
                }
            }while($grade2>=0 && $grade2<=20);
            do{
                if ($grade3<0 | $grade3>20) {
                    echo "Error!";
                }
            }while($grade3>=0 && $grade3<=20);
            $prom = ($grade1+$grade2+$grade3/3);
            if ($prom>=15) {
                echo "The averages is: " . $prom;
                echo "The student passed the course!";
            }else{
                echo "The averages is: " . $prom;
                echo "The student did not pass the course.";
            }
        }
    ?>
 </body>
</html>

PHP无法从命令提示符或其他立即刷新的输入中进行交互读取。为web客户端编写服务器端代码的模式始终是,web客户端(浏览器、HTML)发送一个包含数据的HTTP请求,服务器评估该数据,然后发送响应。在发出另一个HTTP请求之前,数据不会刷新。因此,在$_POST值上循环直到它是正确的值是没有意义的;在一次代码执行过程中,该值不会改变。你的逻辑必须是:

  1. 对每个输入进行一次评估
  2. 如果任何一个输入无效,则拒绝整个请求
  3. 只有在所有输入都有效的情况下,才可以执行您想要执行的操作
  4. 返回一个HTML响应,说明错误或成功之处

示例免费:

<?php
    $errors = [];
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        if ($_POST['grade1'] < 0) {
            $errors['grade1'] = 'Too low';
        }
        ...
        if (!$errors) {
            // validation successful, do something 
        }
    }
?>
<form method="post">
    <input name="grade1" value="<?= htmlspecialchars($_POST['grade1'] ?? null); ?>">
    <?php if (isset($errors['grade1'])) : ?>
        <span class="error"><?= $errors['grade1']; ?></span>
    <?php endif; ?>
    ...
</form>
<!DOCTYPE html>
<html lang="en">
<head>
    <title>Exercise 14</title>
    <meta charset="utf-8">
</head>
<body>
    <h2>PHP Exercises</h2>
    <h3>Exercise 14</h3>
    <form name="exer14" action="#" method="post" id="constant" name="constant">
        <div>
            <label for="text">Grade 1: </label>
            <input type="number" name="grade1" placeholder="Type grade 1"  required>
        </div>
        <div>
            <label for="text">Grade 2: </label>
            <input type="number" name="grade2" placeholder="Type grade 2"  required>
        </div>
        <div>
            <label for="text">Grade 3: </label>
            <input type="number" name="grade3" placeholder="Type grade 3"  required>
        </div>
        <div>
            <input type="submit" name="button" id="sending" value="Send">
        </div>
    </form>
    <?php
    if(isset($_POST['button'])){
        $grade1 = $_POST['grade1'];
        $grade2 = $_POST['grade2'];
        $grade3 = $_POST['grade3'];
        $count = 0;
        $errors = array("Error1" => "Error! The grade $grade1 is invalid. Type a grade between 0 and 20.",
                        "Error2" => "Error! The grade $grade2 is invalid. Type a grade between 0 and 20.",
                        "Error3" => "Error! The grade $grade3 is invalid. Type a grade between 0 and 20.");
        if (empty($_POST['grade1']) || empty($_POST['grade2']) || empty($_POST['grade3'])) {
            echo "Complete all inputs.";
        }elseif (is_numeric($grade1)==false || is_numeric($grade2)==false || is_numeric($grade3)==false) {
            if (is_numeric($grade1)==false) {
                echo "Error! Invalid grade: '$grade1' contains letters. Type a grade between 0 and 20." . "<br>";                   
            }
            if (is_numeric($grade2)==false) {
                echo "Error! Invalid grade: '$grade2' contains letters. Type a grade between 0 and 20." . "<br>";                   
            }
            if (is_numeric($grade3)==false) {
                echo "Error! Invalid grade: '$grade3' contains letters. Type a grade between 0 and 20." . "<br>";                   
            }
        }elseif ($grade1<0 || $grade1>20 || $grade2<0 || $grade2>20 || $grade3<0 || $grade3>20) {
            if ($grade1<0 || $grade1>20){
                echo $errors["Error1"] . "<br>";
            }
            if ($grade2<0 || $grade2>20){
                echo $errors["Error2"] . "<br>";
            }
            if ($grade3<0 || $grade3>20){
                echo $errors["Error3"] . "<br>";
            }
                //print_r($errors);
        }elseif (($grade1>=0 || $grade1<=20) && ($grade2>=0 || $grade2<=20) && ($grade3>=0 || $grade3<=20)) {
            $prom = ($grade1+$grade2+$grade3)/3;
            if ($prom>=15) {
                echo "The student average is " . $prom . "<br>";
                echo "The student passed the course!";
            }else{
                echo "The student average is " . $prom . "<br>";
                echo "The student failed the course.";
            }
        }else{
            echo "Enter the right grades.";
        }
    }
    ?>
</body>

我已经用这种方法解决了这个问题。我可以用几个大小写、字母和数字范围来验证这些输入。这个练习真的很简单,但我是在Pseint和C++中完成的,所以它们与PHP非常不同。我现在明白了服务器客户端是关于什么的。