PHP数组实现黑名单优化:修复checkout.php的两个校验问题
结账页面黑名单组合拦截优化方案
需求说明
在checkout.php中实现黑名单拦截逻辑,要求仅当用户提交的姓名和地址同时命中预设的黑名单组合时,才禁止结账,而非单独命中任一条件就拦截。
原代码存在的问题
- 姓名校验使用
stripos做包含匹配,导致类似输入"Raju"时,因包含黑名单中的"raj"被误拦截,需要改为精确大小写匹配 - 当前逻辑为姓名或地址单独命中就触发拦截,不符合「姓名+地址组合匹配才拦截」的需求,且报错分字段提示,需改为统一错误提示
优化后的代码
// 定义黑名单组合:仅当姓名和地址同时匹配其中一组时,才拦截 $blacklist_combinations = [ ['name' => 'raj', 'address' => '1, Vee Street'], ['name' => 'ken', 'address' => '2,BB Street'], ['name' => 'ber', 'address' => 'street2'], // 可继续添加更多需要拦截的姓名+地址组合 ]; $is_blacklisted = false; $user_name = $post['firstname']; $user_address = $post['address']; // 遍历黑名单组合,检查是否匹配 foreach ($blacklist_combinations as $combination) { // 精确大小写匹配姓名和地址 if ($user_name === $combination['name'] && $user_address === $combination['address']) { $is_blacklisted = true; break; // 匹配到后直接跳出循环,无需继续检查 } } // 如果命中黑名单组合,抛出统一错误 if ($is_blacklisted) { $error[$type . '_checkout'] = "Oops! Something went wrong. Contact the administrator"; }
优化说明
- 组合式黑名单:将黑名单改为姓名+地址的组合数组,从根源上确保只有二者同时匹配才触发拦截,避免单独字段重复导致的误拦截
- 精确匹配:使用严格相等运算符
===做精确大小写匹配,彻底解决包含匹配带来的误拦截问题 - 统一错误提示:仅在组合命中时抛出一个统一的错误提示,不再分字段报错,符合需求逻辑
内容的提问来源于stack exchange,提问作者VSR
相关产品推荐
相关产品推荐

