
当html表单提交并重定向到新php页面(如prijsopgave.php)时,原页面的try-catch逻辑不会自动延续;需将验证逻辑迁移至目标页,并通过$_post安全接收数据、统一做服务端校验与异常处理。
当html表单提交并重定向到新php页面(如prijsopgave.php)时,原页面的try-catch逻辑不会自动延续;需将验证逻辑迁移至目标页,并通过$_post安全接收数据、统一做服务端校验与异常处理。
在PHP Web开发中,表单提交后的异常处理必须发生在接收请求的服务端页面上,而非提交页。你当前将try-catch写在表单同页(如index.php),但将
⚠️ 注意:移除onsubmit="event.preventDefault();..."等客户端JS拦截——它会阻止表单正常提交,导致$_POST无法到达服务器,反而使服务端验证失效。
2. 在 prijsopgave.php 中进行健壮的服务器端验证
<?php $hoogte = $_POST['hoogte'] ?? '';
$hoogteError = '';
try {
// 基础非空校验(防止未选择直接提交)
if (empty(trim($hoogte))) {
throw new InvalidArgumentException("Maak een keuze!");
}
// 白名单校验(更安全!避免伪造POST值)
$validHeights = ['13cm', '17cm', '21cm'];
if (!in_array($hoogte, $validHeights)) {
throw new InvalidArgumentException("Ongeldige hoogte opgegeven.");
}
// ✅ 验证通过:可继续处理业务逻辑(如存入数据库、计算价格等)
echo "<h2>Geselecteerde hoogte: {$hoogte}";
// ... 其他业务代码
} catch (InvalidArgumentException $e) {
$hoogteError = $e->getMessage();
} catch (Exception $e) {
// 捕获其他未预期异常(如DB连接失败)
error_log('Prijsopgave fout: ' . $e->getMessage());
$hoogteError = "Er is een technisch probleem opgetreden.";
}
?>
<!-- 显示错误信息 -->
<?php if ($hoogteError): ?><div class="error" style="color:red; font-weight:bold;">
<?php echo htmlspecialchars($hoogteError); ?>
</div>
<!-- 可选:返回上一页并保留已填数据 -->
<a href="javascript:history.back()">← Terug naar formulier</a>
<?php endif; ?>
3. 关键注意事项
- ? 永远不要依赖前端验证:required 或 JS 校验仅作用户体验优化,服务端校验是唯一可信防线;
- ? 始终过滤/转义输出:使用 htmlspecialchars() 防止XSS(如错误消息中含用户输入);
- ? 避免跨页状态丢失:若需在错误时回显表单(含已填值),应在 prijsopgave.php 中重新渲染表单,并用 value="= htmlspecialchars($_POST['hoogte'] ?? '') ?>" 回填;
- ? 如需“提交后停留原页+异步反馈”,才应使用AJAX(配合fetch()或XMLHttpRequest),此时try-catch保留在PHP接口中,前端仅处理响应JSON。
总结:PHP的try-catch是服务端机制,其作用域严格绑定于当前HTTP请求的脚本执行周期。将验证逻辑置于action指向的目标页,是保障异常处理可靠性的根本原则。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










