PHP违禁词检测自定义错误提示不显示问题求助
问题解决思路及修复代码
核心问题分析
- 你的代码完全没写输出错误提示的逻辑——只把
$boolean设为false,但没添加当验证不通过时显示那句提示的代码,所以违禁词评论提交后啥反应都没有。 - 之前修复时出现重复提示,大概率是你把
echo $error写到了循环里,每检测到一个违禁词就输出一次,自然会重复。 - 另外代码存在致命SQL注入漏洞,直接把用户输入拼进SQL语句,懂技术的攻击者能直接篡改甚至删除你的数据库,这个必须修复。
修复后的完整代码
<!DOCTYPE html> <html> <head> <title>Insert Page page</title> </head> <body> <center> <?php // 初始化错误提示 $error = "This is a family friendly website."; // 数据库连接 $conn = mysqli_connect("localhost", "root", "", "reviewsite"); if ($conn === false) { die("ERROR: Could not connect. " . mysqli_connect_error()); } // 先判断是否有表单提交,避免直接访问页面报错 if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['Rev'])) { $review = trim($_POST['Rev']); $originals = array("fuck", "damn", "ass", "shit", "instance8"); $isValid = true; // 检测违禁词,找到一个就停止循环,提升效率 foreach ($originals as $badWord) { if (stripos($review, $badWord) !== false) { $isValid = false; break; } } if ($isValid) { // 用预处理语句防止SQL注入,必须这么做 $sql = "INSERT INTO revtable (review_content) VALUES (?)"; // 替换成你表中实际的字段名 $stmt = mysqli_prepare($conn, $sql); mysqli_stmt_bind_param($stmt, "s", $review); if (mysqli_stmt_execute($stmt)) { echo "<h3> Thank you for your review! </h3>"; } else { echo "ERROR: Could not save review. " . mysqli_error($conn); } mysqli_stmt_close($stmt); } else { // 仅在验证不通过时输出一次错误提示 echo "<h3 style='color:red;'>$error</h3>"; } } ?> <!-- 补充评论提交表单,原代码缺失用户提交入口 --> <form method="post" action=""> <textarea name="Rev" rows="5" cols="50" placeholder="Enter your review..."></textarea><br> <input type="submit" value="Submit Review"> </form> </center> </body> </html>
关键修改点说明
- 增加表单提交判断:只有POST请求且存在评论内容时才处理逻辑,避免直接访问页面出现
Undefined index错误。 - 违禁词检测优化:用
foreach循环替代普通for循环,找到违禁词后立即break跳出,没必要继续检测剩余词汇。 - 错误提示逻辑:把提示输出放在循环外部,仅当验证不通过时执行一次,彻底解决重复提示问题。
- 修复SQL注入:改用预处理语句执行插入操作,彻底杜绝注入风险(注意把
review_content换成你数据库表中实际存储评论的字段名)。 - 补充提交表单:原代码没有用户提交评论的入口,补上后才能正常测试功能。
内容的提问来源于stack exchange,提问作者Damani Johnson
相关产品推荐
相关产品推荐

