PHP双文件结构下验证失败后保留用户输入的实现方案
双PHP文件结构下,表单校验错误后保留正确输入、清空错误字段的实现方案
核心逻辑
因为表单提交到registrationErrors.php而非自身,所以校验出错时需要把用户的有效输入和错误字段标记通过Session传递回registration.php,在注册页根据这些数据决定每个字段是否保留输入值。
1. 修改registrationErrors.php的校验逻辑
在这个文件里完成校验后,把没问题的输入存起来,出错的字段直接从保存的数组中移除,再把数据和错误信息存入Session,最后重定向回注册页。
<?php session_start(); // 初始化变量 $errors = []; $savedInputs = $_POST; // 示例校验规则 if (empty(trim($_POST['firstname']))) { $errors['firstname'] = '名字不能为空'; unset($savedInputs['firstname']); // 清空出错的字段 } if (strlen($_POST['password']) < 6) { $errors['password'] = '密码长度至少6位'; unset($savedInputs['password']); // 清空出错的字段 } // 其他字段的校验逻辑... if (!empty($errors)) { // 把数据存入Session $_SESSION['saved_inputs'] = $savedInputs; $_SESSION['errors'] = $errors; // 重定向回注册页 header('Location: registration.php'); exit; } else { // 校验通过,执行注册逻辑(比如写入数据库) // ... // 注册成功后清理Session,避免残留数据 session_destroy(); header('Location: success.php'); exit; } ?>
2. 修改registration.php的表单渲染逻辑
在页面开头启动Session,读取保存的输入和错误信息,渲染表单时对应字段使用Session里的值(如果存在),同时显示错误提示。渲染完成后要立即清空Session里的临时数据,防止刷新页面重复显示旧数据。
<?php session_start(); // 读取Session中的数据,没有则设为空数组 $savedInputs = $_SESSION['saved_inputs'] ?? []; $errors = $_SESSION['errors'] ?? []; // 清空Session临时数据,避免刷新重复加载 unset($_SESSION['saved_inputs']); unset($_SESSION['errors']); ?> <form action="registrationErrors.php" method="post"> <div> <label for="firstname">名字:</label> <input type="text" id="firstname" name="firstname" value="<?php echo htmlspecialchars($savedInputs['firstname'] ?? '', ENT_QUOTES); ?>"> <?php if (isset($errors['firstname'])): ?> <span style="color: red;"><?php echo $errors['firstname']; ?></span> <?php endif; ?> </div> <div> <label for="lastname">姓氏:</label> <input type="text" id="lastname" name="lastname" value="<?php echo htmlspecialchars($savedInputs['lastname'] ?? '', ENT_QUOTES); ?>"> <?php if (isset($errors['lastname'])): ?> <span style="color: red;"><?php echo $errors['lastname']; ?></span> <?php endif; ?> </div> <div> <label for="password">密码:</label> <input type="password" id="password" name="password" value="<?php echo htmlspecialchars($savedInputs['password'] ?? '', ENT_QUOTES); ?>"> <?php if (isset($errors['password'])): ?> <span style="color: red;"><?php echo $errors['password']; ?></span> <?php endif; ?> </div> <button type="submit">提交注册</button> </form>
重要注意事项
- 所有用到Session的页面,必须把
session_start()放在任何输出之前(包括HTML标签、空格、换行),否则Session无法正常初始化。 - 用
htmlspecialchars()转义输出的用户输入,这是防止XSS攻击的必要操作,不要省略。 - 必须用
header('Location: ...')重定向,不能直接include registration.php,否则会导致表单提交逻辑混乱,刷新页面还会重复提交数据。
内容的提问来源于stack exchange,提问作者Tobias Kastl
相关产品推荐
相关产品推荐

