Python从SQL表取信息及Discord ID匹配SQL数据问题排查
Discord用户ID与SQL数据库匹配问题修复
问题说明
我需要将Discord用户ID与SQL数据库中的记录匹配:
- 若ID存在,打印
insert_time、platform、gamertag、kills、downs、kdRatio字段值 - 若ID不存在,输出你未注册
当前代码会打印数据库内所有ID,不符合需求。
原代码问题分析
- SQL注入风险+类型不匹配:用f-string直接拼接SQL语句,不仅有安全隐患,还可能因Discord ID的类型差异(数据库中为字符串,代码中为整数)导致WHERE条件失效,返回所有行。
- 逻辑冗余且错误:查询已通过WHERE筛选匹配ID,循环内再判断
row[0] == ctx.author.id完全多余;同时未处理查询结果为空的情况,无法输出未注册提示。 - 输出逻辑混乱:循环内每一行都打印ID,且错误触发else分支。
修正后的代码
print(logTime, ">", ctx.author.name, ">", "Me command starting here...") import mysql.connector mydb = mysql.connector.connect( host=SQL_HOST, user=SQL_USER, password=SQL_PASSWORD, database=SQL_DATABASE ) # 使用参数化查询,避免注入并保证类型匹配 sql_select_query_register = "SELECT * FROM data WHERE discord_id = %s" mycursor = mydb.cursor() # 传入参数时转成字符串,匹配数据库字段类型 mycursor.execute(sql_select_query_register, (str(ctx.author.id),)) records = mycursor.fetchall() if not records: print("你未注册") else: # discord_id是主键,最多返回一条记录 row = records[0] print(row[0]) # 打印匹配的discord_id # 按需求打印指定字段 print(f"{row[1]}, {row[2]}, {row[3]}, {row[4]}, {row[5]}, {row[6]}") mycursor.close() mydb.close()
验证结果
原实际输出
30.10.2022 14:08:37 > jcK. > Me command starting here... 176432554692313087 you are not registered 176432554692313088 you are not registered
修正后期望输出
30.10.2022 13:34:22 > jcK. > Me command starting here... 176432554692313088 30.10.22 13:14:53, acti, jcK_#2039728, 8840.0, 8672.0, 1.4203084832904884
内容的提问来源于stack exchange,提问作者jcK.
相关产品推荐
相关产品推荐

