实现黑名单:仅匹配同行列的姓名与地址时阻止结账
修正结账环节黑名单联合校验逻辑
问题根源在于原逻辑分别校验firstname和street address是否存在于黑名单表的任意行,而非校验二者是否属于黑名单表的同一行配对,导致不同行的姓名+地址组合被误拦截。
错误逻辑示例(以SQL和Java为例)
-- 错误:分别查询姓名和地址是否存在于黑名单的任意行 SELECT COUNT(*) FROM blacklist WHERE firstname = ?; SELECT COUNT(*) FROM blacklist WHERE street_address = ?;
// 错误:只要姓名和地址各自在黑名单中,就拦截 boolean nameBlacklisted = blacklistDao.existsByFirstname(userFirstname); boolean addrBlacklisted = blacklistDao.existsByStreetAddress(userStreetAddr); if (nameBlacklisted && addrBlacklisted) { blockCheckout("您的信息在黑名单中"); }
修正后的正确逻辑
核心是在一次查询中同时匹配同一行的两个字段,仅当存在同时满足firstname和street address的记录时,才触发拦截:
SQL层面修正
-- 正确:查询是否存在同一行同时匹配姓名和地址的记录 SELECT COUNT(*) FROM blacklist WHERE firstname = ? AND street_address = ?;
代码层面修正(Java示例)
// 正确:仅当姓名+地址的组合在黑名单的同一行时,才拦截 boolean comboBlacklisted = blacklistDao.existsByFirstnameAndStreetAddress(userFirstname, userStreetAddr); if (comboBlacklisted) { blockCheckout("您的信息在黑名单中"); }
代码层面修正(Python示例)
# 正确:校验姓名和地址的组合是否存在于黑名单的同一行 from sqlalchemy import func combination_count = db.session.query(func.count(Blacklist.id)).filter( Blacklist.firstname == input_firstname, Blacklist.street_address == input_street_address ).scalar() if combination_count > 0: return {"error": "无法结账,您的信息在黑名单中"}
逻辑说明
修正后的逻辑直接校验用户输入的firstname和street address是否作为配对存在于黑名单的某一行:
- 当输入
Ben+Street1时,若黑名单存在该行记录,会触发拦截(符合需求) - 当输入
Raj+Street3时,由于二者分属黑名单的不同行,不会触发拦截(解决误拦截问题)
内容的提问来源于stack exchange,提问作者VSR
相关产品推荐
相关产品推荐

