
当表单提交后跳转到新php页面(如prijsopgave.php)时,原页面的try-catch逻辑不会自动执行——因为异常校验必须在接收数据的目标页面中完成,而非仅靠前端拦截。正确做法是在目标页进行服务端验证并保留错误信息,再通过会话($_session)或get参数回传提示。
当表单提交后跳转到新php页面(如prijsopgave.php)时,原页面的try-catch逻辑不会自动执行——因为异常校验必须在接收数据的目标页面中完成,而非仅靠前端拦截。正确做法是在目标页进行服务端验证并保留错误信息,再通过会话($_session)或get参数回传提示。
要在表单提交并重定向至 prijsopgave.php 时仍有效触发异常处理与错误提示,关键在于:将验证逻辑移至目标页面(即 prijsopgave.php),并利用 PHP 会话($_SESSION)暂存错误信息,再安全地重定向回原表单页展示错误。这比依赖 JavaScript onsubmit 拦截更可靠、更安全(防止绕过)且符合服务端优先原则。
✅ 正确实现步骤如下:
-
启用会话(两页均需开头调用):
<?php session_start(); ?>
-
修改表单指向目标页(无需 JS 拦截):
立即学习“PHP免费学习笔记(深入)”;
<form action="prijsopgave.php" method="post"> <select name="hoogte" required> <option value="">Kies een hoogte</option> <option value="13cm">13cm</option> <option value="17cm">17cm</option> <option value="21cm">21cm</option> </select> <span class="error"><?php echo $_SESSION['hoogteError'] ?? ''; ?></span> <button type="submit">Verstuur</button> </form> -
在 prijsopgave.php 中执行服务端验证与异常处理:
<?php session_start(); // 仅处理 POST 请求 if ($_SERVER['REQUEST_METHOD'] === 'POST') { $hoogte = $_POST['hoogte'] ?? ''; try { if (empty($hoogte) || $hoogte === 'Kies een hoogte') { throw new Exception("Maak een keuze!"); } // ✅ 验证通过:可继续处理业务(如保存、计算价格等) // $_SESSION['success'] = "Gegevens ontvangen."; // header('Location: bevestiging.php'); // exit; } catch (Exception $e) { // ❌ 验证失败:保存错误信息,并重定向回原表单页 $_SESSION['hoogteError'] = $e->getMessage(); // 可选:同时保留用户输入(提升体验) $_SESSION['hoogte'] = $hoogte; header('Location: index.php'); // 假设原表单在 index.php exit; } } ?> -
在原表单页(如 index.php)中读取并显示错误/恢复输入:
<?php session_start(); $hoogteError = $_SESSION['hoogteError'] ?? ''; $hoogte = $_SESSION['hoogte'] ?? ''; // 清除已使用的会话数据,避免重复显示 unset($_SESSION['hoogteError'], $_SESSION['hoogte']); ?> <form action="prijsopgave.php" method="post"> <select name="hoogte"> <option value="">Kies een hoogte</option> <option value="13cm" <?= $hoogte === '13cm' ? 'selected' : '' ?>>13cm</option> <option value="17cm" <?= $hoogte === '17cm' ? 'selected' : '' ?>>17cm</option> <option value="21cm" <?= $hoogte === '21cm' ? 'selected' : '' ?>>21cm</option> </select> <span class="error"><?= htmlspecialchars($hoogteError) ?></span> <button type="submit">Verstuur</button> </form>
⚠️ 注意事项:
- 永远不要仅依赖前端验证(如 onsubmit + JS):用户可禁用 JS 或直接发送恶意请求;服务端验证是强制且不可绕过的。
- 使用 htmlspecialchars() 输出错误信息,防止 XSS 攻击。
- unset() 会话变量至关重要,否则错误消息会在后续刷新中持续出现。
- 若需更复杂的流程(如多步表单、AJAX 提交),可扩展为 JSON 响应 + Fetch API,但基础场景推荐上述服务端重定向模式。
总结:PHP 的 try-catch 是服务端机制,必须在接收 $_POST 的页面中执行;通过 $_SESSION 在页面间传递状态,是实现“提交→验证→反馈”闭环的标准、健壮方案。



















