返回
表单验证的隐患:避免批量更新陷阱,实现可靠验证
php
2024-03-18 20:18:35
表单验证利器:利用 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 进行验证,并在批量更新过程中避免只处理首条数据的陷阱。这将确保你的应用程序可靠且用户友好。
常见问题解答:
-
为什么我需要使用 foreach 循环进行批量更新验证?
- foreach 循环允许你逐个检查每个 ID,并对每个 ID 执行必要的验证。
-
如果我对没有验证错误的 ID 进行更新,该怎么办?
- 通过将 header location 移到 foreach 循环之外,只有在所有 ID 都验证成功后,才会执行更新。
-
我可以将此解决方案用于其他语言或框架吗?
- 虽然代码片段是用 PHP 编写的,但 underlying principles 可应用于其他语言和框架。
-
如何确保表单验证始终有效?
- 定期测试你的表单验证,以确保它能正确捕获所有必需的验证规则。
-
我可以在哪里找到有关表单验证的更多信息?
- 有许多资源可供使用,例如 MDN Web Docs 和 W3Schools,它们提供了关于表单验证的详细说明。