MySQL报错1064(42000)SQL语法错误,无法定位错误原因求解决
错误诱因&修复方案
你触发1064语法错误存在两处独立问题:
1. delete_data方法参数传递错误
mysql.connector的execute()方法要求第二个参数为可迭代的参数序列,你直接传入单个值时,程序会把字符串按字符拆分迭代,和SQL语句中单个%s占位符数量不匹配,触发语法报错。
修复方式:把传入的值包装为元组,末尾加逗号明确声明为元组类型:
# 错误写法 cur.execute("DELETE FROM students WHERE roll_no=%s",self.Roll_No_var.get()) # 正确写法 cur.execute("DELETE FROM students WHERE roll_no=%s", (self.Roll_No_var.get(),))
2. search_data方法SQL拼接错误
你写的SQL语句中where关键字后面没有加空格,和后续拼接的字段名直接连在一起,会生成select * from students wherename like '%xxx%'这类非法语法;同时直接拼接用户输入存在SQL注入风险,建议改为参数化查询写法:
# 错误写法 cur.execute("select * from students where"+str(self.search_by.get())+" like '%"+str(self.search_text.get())+"%'") # 正确写法(先拼接合法的字段位置,再用参数化传值避免注入) search_field = str(self.search_by.get()) # 先校验字段名是否合法,避免恶意传入非法字段 allow_fields = ['roll_no', 'name', 'class', 'phone'] # 替换为你表的实际字段名 if search_field not in allow_fields: return sql = f"SELECT * FROM students WHERE {search_field} LIKE %s" cur.execute(sql, (f"%{str(self.search_text.get())}%",))
修复后完整代码
def delete_data(self): con = mysql.connector.connect(host="localhost", user="root", password="Satpute@223", database="stm") cur = con.cursor() # 修复参数传递格式 cur.execute("DELETE FROM students WHERE roll_no=%s", (self.Roll_No_var.get(),)) con.commit() con.close() self.fetch_data() self.clear() def search_data(self): con = mysql.connector.connect(host="localhost", user="root", password="Satpute@223", database="stm") cur = con.cursor() # 修复SQL拼接逻辑+参数化查询 search_field = str(self.search_by.get()) # 这里替换为你students表允许搜索的实际字段名,避免非法传参 allow_search_fields = ['roll_no', 'name', 'gender', 'class', 'contact'] if search_field not in allow_search_fields: con.close() return sql = f"SELECT * FROM students WHERE {search_field} LIKE %s" cur.execute(sql, (f"%{str(self.search_text.get())}%",)) rows = cur.fetchall() if len(rows) != 0: self.Student_table.delete(*self.Student_table.get_children()) for row in rows: self.Student_table.insert('', END, values=row) con.close()
内容的提问来源于stack exchange,提问作者Shivam Satpute
相关产品推荐
相关产品推荐

