如何用Python在MySQL中根据姓名查询特定客户数据行?
问题分析与修复方案
原代码的核心问题
- 输入判断逻辑无效:
if name == "%s"这个条件永远不会成立,用户输入的是姓名,不可能等于%s,导致整个查询逻辑根本不会执行。 - SQL参数传递错误:SQL语句需要两个参数(
first_name和last_name),但直接把整个输入的name字符串传进去,参数数量不匹配;且重复执行cur.execute(name),会把用户输入的姓名当成SQL语句执行,属于严重错误,还存在SQL注入风险。 - 结果处理错误:
cur.fetchone()返回的是单条记录的元组(如(1, 'John', 'Doe', ...)),不是包含行的结果集,for row in results会遍历每个字段值而非行,导致后续解包失败。 - 异常处理逻辑混乱:“未找到数据”不属于数据库异常,不应放在
except块中,需在结果为空时单独处理。
修正后的代码
def filter_data(cur): name_input = input("Enter the client's first and last name: ") # 拆分输入为名字和姓氏,处理格式错误 name_parts = name_input.strip().split(maxsplit=1) if len(name_parts) != 2: print("请输入正确格式:名 姓") return first_name, last_name = name_parts try: # 正确传递参数:元组对应SQL中的两个占位符,避免注入风险 cur.execute('''SELECT * FROM renters WHERE first_name = %s AND last_name = %s;''', (first_name, last_name)) # 获取所有匹配结果(支持多个同名客户) results = cur.fetchall() if not results: print("未找到匹配的客户信息") return # 优化表头格式,添加分隔线提升可读性 print("%-5s %-12s %-12s %-15s %-25s %-30s %-15s %-10s" % ("ID", "First Name", "Last Name", "Phone Number", "Email Address", "Street Address", "City", "State")) print("-" * 120) # 遍历并打印每条记录 for row in results: cid, first, last, phone, email, street, city, state = row print("%-5s %-12s %-12s %-15s %-25s %-30s %-15s %-10s" % (cid, first, last, phone, email, street, city, state)) except mysql.connector.Error as error: print(f"数据库错误:{str(error)}")
关键修改说明
- 输入处理:用
split(maxsplit=1)拆分输入,确保能正确分离名和姓,同时校验输入格式。 - SQL执行:仅执行一次
cur.execute,用元组传递参数,严格对应SQL中的两个占位符,既保证逻辑正确,又避免SQL注入。 - 结果处理:改用
fetchall()获取所有匹配记录,支持多个同名客户的场景;结果为空时直接提示,无需进入异常流程。 - 格式优化:调整输出格式,添加分隔线,让查询结果更清晰易读。
内容的提问来源于stack exchange,提问作者Brandonman1
相关产品推荐
相关产品推荐

