PHP单文件表单验证后无法跳转新表单问题求助
单文件PHP粘性表单实现方案
以下是完整的单文件PHP代码,满足你的所有需求:
<?php // 初始化变量 $errors = []; $submittedData = [ 'name' => '', 'days' => [], 'activity' => '' ]; $isValid = false; // 处理表单提交 if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 获取并清理提交数据 $submittedData['name'] = trim($_POST['name'] ?? ''); $submittedData['days'] = $_POST['days'] ?? []; $submittedData['activity'] = $_POST['activity'] ?? ''; // 姓名验证:字母+单空格,无首尾/连续空格 if (empty($submittedData['name'])) { $errors['name'] = '请输入姓名'; } elseif (!preg_match('/^[A-Za-z]+(?: [A-Za-z]+)*$/', $submittedData['name'])) { $errors['name'] = '姓名仅允许字母和单个空格,不能有首尾或连续空格'; } // 星期多选验证:至少选2天,且包含周六/周日 if (count($submittedData['days']) < 2) { $errors['days'] = '至少选择2天'; } elseif (!in_array('Saturday', $submittedData['days']) && !in_array('Sunday', $submittedData['days'])) { $errors['days'] = '必须包含周六或周日'; } // 活动下拉验证:必须为预设选项 $validActivities = ['hiking', 'swimming', 'cycling', 'reading']; if (!in_array($submittedData['activity'], $validActivities)) { $errors['activity'] = '请选择有效的活动'; } // 验证通过标记 if (empty($errors)) { $isValid = true; } } ?> <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>活动报名表单</title> <style> .form-group { margin: 15px 0; } .error { color: #dc3545; font-size: 0.9em; margin-top: 5px; } .section-title { font-weight: bold; margin-right: 10px; } .result-card { border: 1px solid #dee2e6; border-radius: 4px; padding: 20px; margin-top: 20px; max-width: 400px; } .result-card p { margin: 8px 0; } </style> </head> <body> <h1>活动报名</h1> <?php if (!$isValid): ?> <form method="post" action=""> <!-- 姓名输入框 --> <div class="form-group"> <label for="name">姓名:</label> <input type="text" id="name" name="name" value="<?php echo htmlspecialchars($submittedData['name']); ?>"> <?php if (isset($errors['name'])): ?> <div class="error"><?php echo $errors['name']; ?></div> <?php endif; ?> </div> <!-- 星期多选框(带不可选标题) --> <div class="form-group"> <span class="section-title">选择参与天数:</span> <label><input type="checkbox" name="days[]" value="Monday" <?php echo in_array('Monday', $submittedData['days']) ? 'checked' : ''; ?>> 周一</label> <label><input type="checkbox" name="days[]" value="Tuesday" <?php echo in_array('Tuesday', $submittedData['days']) ? 'checked' : ''; ?>> 周二</label> <label><input type="checkbox" name="days[]" value="Wednesday" <?php echo in_array('Wednesday', $submittedData['days']) ? 'checked' : ''; ?>> 周三</label> <label><input type="checkbox" name="days[]" value="Thursday" <?php echo in_array('Thursday', $submittedData['days']) ? 'checked' : ''; ?>> 周四</label> <label><input type="checkbox" name="days[]" value="Friday" <?php echo in_array('Friday', $submittedData['days']) ? 'checked' : ''; ?>> 周五</label> <label><input type="checkbox" name="days[]" value="Saturday" <?php echo in_array('Saturday', $submittedData['days']) ? 'checked' : ''; ?>> 周六</label> <label><input type="checkbox" name="days[]" value="Sunday" <?php echo in_array('Sunday', $submittedData['days']) ? 'checked' : ''; ?>> 周日</label> <?php if (isset($errors['days'])): ?> <div class="error"><?php echo $errors['days']; ?></div> <?php endif; ?> </div> <!-- 活动下拉选择框 --> <div class="form-group"> <label for="activity">选择活动:</label> <select id="activity" name="activity"> <option value="">--请选择--</option> <option value="hiking" <?php echo $submittedData['activity'] === 'hiking' ? 'selected' : ''; ?>>徒步</option> <option value="swimming" <?php echo $submittedData['activity'] === 'swimming' ? 'selected' : ''; ?>>游泳</option> <option value="cycling" <?php echo $submittedData['activity'] === 'cycling' ? 'selected' : ''; ?>>骑行</option> <option value="reading" <?php echo $submittedData['activity'] === 'reading' ? 'selected' : ''; ?>>阅读</option> </select> <?php if (isset($errors['activity'])): ?> <div class="error"><?php echo $errors['activity']; ?></div> <?php endif; ?> </div> <button type="submit">提交</button> </form> <?php else: ?> <!-- 验证通过后显示的结果表单 --> <div class="result-card"> <h2>报名成功!</h2> <p><strong>姓名:</strong> <?php echo htmlspecialchars($submittedData['name']); ?></p> <p><strong>参与天数:</strong> <?php $dayMap = [ 'Monday' => '周一', 'Tuesday' => '周二', 'Wednesday' => '周三', 'Thursday' => '周四', 'Friday' => '周五', 'Saturday' => '周六', 'Sunday' => '周日' ]; $displayDays = []; foreach ($submittedData['days'] as $day) { $displayDays[] = $dayMap[$day] ?? $day; } echo implode(', ', $displayDays); ?> </p> <p><strong>选择的活动:</strong> <?php $activityMap = [ 'hiking' => '徒步', 'swimming' => '游泳', 'cycling' => '骑行', 'reading' => '阅读' ]; echo $activityMap[$submittedData['activity']] ?? $submittedData['activity']; ?> </p> <p><a href="">返回重新报名</a></p> </div> <?php endif; ?> </body> </html>
关键功能说明
粘性字段实现:
- 输入框通过
htmlspecialchars($submittedData['name'])保留用户输入,同时防范XSS攻击 - 多选框用
in_array()判断选中状态并保留checked属性 - 下拉框通过对比提交值设置
selected属性
- 输入框通过
验证规则落地:
- 姓名正则
/^[A-Za-z]+(?: [A-Za-z]+)*$/严格限制格式 - 星期多选同时校验数量和必填周末条件
- 活动下拉通过预设合法选项数组做校验
- 姓名正则
不可选标题:
- 使用
<span class="section-title">实现不可点击的分组标题,通过CSS样式区分
- 使用
表单切换逻辑:
- 通过
$isValid标记控制页面显示:验证失败显示带错误提示的原表单,验证成功切换为结果展示卡片
- 通过
内容的提问来源于stack exchange,提问作者YannisAm
相关产品推荐
相关产品推荐

