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

如何用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)}")

关键修改说明

  1. 输入处理:用split(maxsplit=1)拆分输入,确保能正确分离名和姓,同时校验输入格式。
  2. SQL执行:仅执行一次cur.execute,用元组传递参数,严格对应SQL中的两个占位符,既保证逻辑正确,又避免SQL注入。
  3. 结果处理:改用fetchall()获取所有匹配记录,支持多个同名客户的场景;结果为空时直接提示,无需进入异常流程。
  4. 格式优化:调整输出格式,添加分隔线,让查询结果更清晰易读。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 12:55:22