如何编写代码避免MySQL插入姓名和手机号重复的参与者记录?
正确实现方案
你需要把查询条件里的邮箱匹配规则移除,仅保留姓名(姓、名、中间名)和手机号的匹配即可。另外你当前的SQL直接拼接用户输入存在严重的SQL注入风险,推荐使用参数化查询的写法,更安全可靠。
修正后的代码示例
// 预处理用户输入 string firstName = txtFName.Text.Trim(); string lastName = txtLName.Text.Trim(); string middleName = txtMName.Text.Trim(); string contactNo = txtContact.Text.Trim(); // SQL仅保留姓名和手机号的匹配条件,移除邮箱匹配逻辑 string checkRepeatSql = "SELECT COUNT(*) FROM participants_tbl WHERE firstname = @firstName AND lastname = @lastName AND middlename = @middleName AND contact_no = @contactNo"; command = new MySqlCommand(checkRepeatSql, con); // 使用参数化查询避免SQL注入风险 command.Parameters.AddWithValue("@firstName", firstName); command.Parameters.AddWithValue("@lastName", lastName); command.Parameters.AddWithValue("@middleName", middleName); command.Parameters.AddWithValue("@contactNo", contactNo); // 判断是否存在重复记录 int repeatCount = Convert.ToInt32(command.ExecuteScalar()); if(repeatCount > 0) { // 重复判定触发,执行禁止插入的业务逻辑即可 MessageBox.Show("该姓名和手机号已存在报名记录,请勿重复提交"); return; } // 无重复,后续执行正常的插入逻辑
规则说明
- 原有代码将
email字段加入了WHERE判断条件,导致只要邮箱不一致,就算姓名和手机号完全重复也会被判定为新记录,移除该条件后就符合你的业务需求:只要三段姓名+手机号匹配,不管提交的邮箱是什么,都会被判定为重复记录。 - 参数化查询是数据库操作的标准规范,可避免恶意用户输入特殊SQL片段篡改、泄露你的数据库内容。
内容的提问来源于stack exchange,提问作者John Vince Andres
相关产品推荐
相关产品推荐

