You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

关键功能说明

  1. 粘性字段实现:

    • 输入框通过htmlspecialchars($submittedData['name'])保留用户输入,同时防范XSS攻击
    • 多选框用in_array()判断选中状态并保留checked属性
    • 下拉框通过对比提交值设置selected属性
  2. 验证规则落地:

    • 姓名正则/^[A-Za-z]+(?: [A-Za-z]+)*$/严格限制格式
    • 星期多选同时校验数量和必填周末条件
    • 活动下拉通过预设合法选项数组做校验
  3. 不可选标题:

    • 使用<span class="section-title">实现不可点击的分组标题,通过CSS样式区分
  4. 表单切换逻辑:

    • 通过$isValid标记控制页面显示:验证失败显示带错误提示的原表单,验证成功切换为结果展示卡片

内容的提问来源于stack exchange,提问作者YannisAm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 14:25:16