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

PHP检测字符串是否含数组禁用词的表单验证问题排查

问题修正:表单禁用词包含验证逻辑

原代码核心问题

  1. SQL查询无效绑定:SELECT * FROM nl_filters语句无占位符,却调用bind_param,属于冗余错误操作。
  2. 禁用词数组构建错误:$disallowed_terms[] = $row将整行数据库记录(数组)存入数组,而非提取具体的禁用词文本。
  3. 验证逻辑偏差:使用in_array仅检查输入内容是否完全等于禁用词,而非包含禁用词;strpos参数顺序颠倒且引用对象错误,导致混合内容时验证失效。

修正后的完整代码

// 初始化禁用词数组
$disallowed_terms = [];

// 修正SQL查询,仅获取禁用词字段(假设字段名为term,需匹配实际表结构)
$disallowed = $ww_mysqli->prepare("SELECT term FROM nl_filters");
$disallowed->execute();
$s_result = $disallowed->get_result();

// 构建纯文本禁用词数组
while ($row = $s_result->fetch_assoc()) {
    $disallowed_terms[] = trim($row['term']);
}

// 通用检查函数:判断字符串是否包含任意禁用词
function containsBannedWord($str, $bannedWords) {
    if (empty($str) || empty($bannedWords)) {
        return false;
    }
    foreach ($bannedWords as $word) {
        // stripos为不区分大小写检查,需区分则替换为strpos
        if (stripos($str, $word) !== false) {
            return true;
        }
    }
    return false;
}

// 检查所有表单字段,触发错误标记
$reasons = '';
if (containsBannedWord($sprequests, $disallowed_terms)) $reasons .= '|error';
if (containsBannedWord($theirname, $disallowed_terms)) $reasons .= '|error';
if (containsBannedWord($email, $disallowed_terms)) $reasons .= '|error';
if (containsBannedWord($phone, $disallowed_terms)) $reasons .= '|error';

关键优化点

  • SQL精简:仅查询禁用词字段,避免冗余数据,移除无效参数绑定。
  • 数组标准化:确保$disallowed_terms存储纯禁用词文本,而非整行数据库记录。
  • 验证逻辑修正:用stripos/strpos判断输入是否包含禁用词,只要匹配到任意禁用词即触发错误。
  • 逻辑解耦:将数据库读取与验证逻辑分离,代码更易维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 01:34:57