返回

表单验证的隐患:避免批量更新陷阱,实现可靠验证

php

表单验证利器:利用 foreach 逐行检查,避免批量更新的批量处理陷阱

导言:

在处理批量更新时,表单验证至关重要,它确保数据在提交到数据库之前是有效且完整的。然而,如果不小心,你可能会陷入一个陷阱,即表单验证只处理第一个 ID,而忽略其余 ID。

问题剖析:

当你在表单验证中使用 foreach 循环时,你可能会遇到这样的问题:它只对第一个 ID 进行验证,而忽略其余 ID。这是因为 header location 的位置不正确。如果将它放在 foreach 循环内部,那么在验证失败后,它将立即重定向到错误页面,而不会继续检查其余的 ID。

解决方案:

解决这个问题的方法是将 header location 移动到 foreach 循环之外。这样,只有在所有 ID 都验证成功后,才会重定向到成功页面。

优化代码:

以下是如何优化代码:

if ($_SERVER["REQUEST_METHOD"] == "POST" AND $_POST["type"] == "bulk-update") {
    $ids = explode(',', $_GET['ids']);
    $errors = []; // 存储验证错误

    foreach ($ids as $id) {
        $post_data = [
            'team' => $_POST['team_' . $id],
            'player1' => $_POST['player1_' . $id],
            'email' => $_POST['email_' . $id],
        ];

        // 验证代码

        if (empty($post_data["team"])) {
            $errors["team_$id"] = "Fyll i namnet på laget";
        } else {
            $team = test_input($post_data["team"]);
        }

        if (empty($post_data["player1"])) {
            $errors["player1_$id"] = "Fyll i namn på spelare 1";
        } else {
            $player_1 = test_input($post_data["player1"]);
            // check if name only contains letters and whitespace
            if (!preg_match("/^[a-zåäöÅÄÖ -]+$/i",$player_1)) {
                $errors["player1_$id"] = "Bara bokstäver och mellanslag är giltiga";
            }
        }

        if (empty($post_data["email"])) {
            $errors["email_$id"] = "Fyll i en e-postadress";
        } else {
            $email = test_input($post_data["email"]);
            $email = strtolower($email);
            // check if e-mail address is well-formed
            if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
                $errors["email_$id"] = "Detta är inte en giltig e-postadress";
            }
        }
    }

    if (empty($errors)) { // 没有验证错误
        // Update the teams in the database
        foreach ($ids as $id) {
            $stmt = $db->prepare('UPDATE anmalningar SET team = ?, player1 = ?, email = ? WHERE id = ?');
            $stmt->execute([ $team, $player_1, $email, $id ]);
        }

        // Redirect and output message
        header("Location: /tavlingar/skapa_csv.php?bulk-upd&ids={$_GET['ids']}");
        exit();
    } else {
        // Display validation errors
        foreach ($errors as $error) {
            echo "<p>$error</p>";
        }
    }
}

function test_input($data) {
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    $data = ucwords($data);
    return $data;
}

结论:

通过遵循这些步骤,你可以在表单验证中有效地使用 foreach 循环,确保对所有 ID 进行验证,并在批量更新过程中避免只处理首条数据的陷阱。这将确保你的应用程序可靠且用户友好。

常见问题解答:

  1. 为什么我需要使用 foreach 循环进行批量更新验证?

    • foreach 循环允许你逐个检查每个 ID,并对每个 ID 执行必要的验证。
  2. 如果我对没有验证错误的 ID 进行更新,该怎么办?

    • 通过将 header location 移到 foreach 循环之外,只有在所有 ID 都验证成功后,才会执行更新。
  3. 我可以将此解决方案用于其他语言或框架吗?

    • 虽然代码片段是用 PHP 编写的,但 underlying principles 可应用于其他语言和框架。
  4. 如何确保表单验证始终有效?

    • 定期测试你的表单验证,以确保它能正确捕获所有必需的验证规则。
  5. 我可以在哪里找到有关表单验证的更多信息?

    • 有许多资源可供使用,例如 MDN Web Docs 和 W3Schools,它们提供了关于表单验证的详细说明。