SQLite3.ProgrammingError求助:绑定数量不匹配问题排查
错误原因分析
参数传递格式错误
第二个cursor.execute调用中,参数(invites[1])不是合法的元组。如果invites[1]是一个长度为7的字符串,Python会把它当成字符序列展开,导致传入7个参数,而SQL语句只定义了1个占位符?,从而触发绑定数量不匹配的错误。SQL注入风险(额外问题)
第一个execute用f-string直接拼接SQL语句,当member.guild.id或member.id包含特殊字符时,会引发SQL注入漏洞,同时也可能导致语法错误。
解决方法
修正参数传递格式
单个元素的元组需要在末尾添加逗号,确保Python将其识别为元组而非普通序列:cursor.execute(f"SELECT leaves FROM invite_ge WHERE spieler = {invites[0]} AND invite = ?", (invites[1],))替换f-string拼接为参数化查询(推荐)
两个SQL查询都改用参数化写法,避免SQL注入并提升代码安全性:# 第一个查询改用参数化 cursor.execute("SELECT player, invites FROM join WHERE server = ? AND spieler = ?", (member.guild.id, member.id)) invites = cursor.fetchone() # 第二个查询修正参数格式并保持参数化 cursor.execute("SELECT leaves FROM invite_ge WHERE spieler = ? AND invite = ?", (invites[0], invites[1]))
注意:如果invites可能为None(即第一个查询没找到结果),建议先判断invites是否存在,避免索引错误:
if invites: cursor.execute("SELECT leaves FROM invite_ge WHERE spieler = ? AND invite = ?", (invites[0], invites[1])) # 后续处理逻辑 else: # 处理未找到数据的情况 pass
内容的提问来源于stack exchange,提问作者Schiffskapitän
相关产品推荐
相关产品推荐

