提交无内容仍跳转至action页面,如何实现表单校验拦截?
哈哈,这个问题太常见了!要解决表单未填写就跳转的问题,得双管齐下——前端给用户即时提示,后端做最后兜底(毕竟前端校验可被绕过),我给你拆解具体实现方式:
一、前端JavaScript校验(提升用户体验)
先给表单绑定提交前的校验逻辑,没填内容就阻止页面跳转,还给用户弹出提示。
假设你的HTML表单结构是这样:
<form method="POST" action="你的提交页面.php" onsubmit="return validateForm()"> <input type="text" name="name" id="name" placeholder="请输入姓名"> <input type="email" name="email" id="email" placeholder="请输入邮箱"> <textarea name="comment" id="comment" placeholder="请输入评论"></textarea> <button type="submit" name="submit">提交评论</button> </form>
然后添加JavaScript校验函数:
function validateForm() { // 获取输入值并去除首尾空格 const name = document.getElementById('name').value.trim(); const email = document.getElementById('email').value.trim(); const comment = document.getElementById('comment').value.trim(); // 校验姓名 if (!name) { alert('请填写姓名哦!'); return false; // 返回false阻止表单提交 } // 校验邮箱:先判空,再做格式校验 if (!email) { alert('请填写邮箱地址!'); return false; } const emailRule = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRule.test(email)) { alert('请输入有效的邮箱格式!'); return false; } // 校验评论 if (!comment) { alert('评论内容不能为空呀!'); return false; } // 所有校验通过,允许表单提交 return true; }
小提示:也可以用HTML5原生的
required属性(比如<input type="text" name="name" required>),但这种方式的提示样式没法自定义,不同浏览器显示效果不一样,所以自定义JS校验更灵活。
二、后端PHP校验(核心兜底,必须做!)
前端校验只能防君子,没法防恶意请求(比如有人用工具直接发POST请求),所以后端必须再做一遍校验,同时还要修复你代码里的SQL注入风险!
结合你给的代码片段,修改后的PHP逻辑如下:
<?php // 判断是否是表单提交请求 if (isset($_POST["submit"])) { // 初始化错误信息数组 $errors = []; // 获取输入值并去除首尾空格 $name = trim($_POST['name'] ?? ''); $email = trim($_POST['email'] ?? ''); $comment = trim($_POST["comment"] ?? ''); // 校验姓名 if (empty($name)) { $errors[] = '姓名不能为空'; } // 校验邮箱 if (empty($email)) { $errors[] = '邮箱不能为空'; } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $errors[] = '邮箱格式不正确'; } // 校验评论 if (empty($comment)) { $errors[] = '评论内容不能为空'; } // 没有错误才执行数据库操作 if (empty($errors)) { global $connect; // 重点:用预处理语句防止SQL注入!不要直接把变量拼进SQL $sql = "INSERT INTO entries (fullName,email,comment) VALUES (?, ?, ?)"; $stmt = $connect->prepare($sql); $stmt->bind_param("sss", $name, $email, $comment); $result = $stmt->execute(); if ($result) { echo "提交成功!"; // 也可以跳转到成功页面:header("Location: success.php"); exit; } else { $errors[] = '提交失败,请稍后重试'; } } // 有错误就输出提示(或者把错误存进session跳回表单页面显示) if (!empty($errors)) { foreach ($errors as $error) { echo "<p style='color: red;'>{$error}</p>"; } } } ?>
重要提醒:你原来的代码直接把POST变量拼进SQL语句,存在严重的SQL注入风险,一定要用预处理语句(上面用的是mysqli预处理,也可以用PDO)。
内容的提问来源于stack exchange,提问作者coder
相关产品推荐
相关产品推荐

