错误 1064:显示语法错误无法找到导致此错误的原因
Posted
技术标签:
【中文标题】错误 1064:显示语法错误无法找到导致此错误的原因【英文标题】:error 1064: showing syntax error not able to find whatss causing this error 【发布时间】:2021-08-14 10:29:23 【问题描述】:mysql.connector.errors.ProgrammingError: 1064 (42000): 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“%s”附近使用正确的语法
代码:
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()
cur.execute("select * from students where"+str(self.search_by.get())+" like '%"+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.commit()
con.close()
【问题讨论】:
search_data()
里面的SQL里面的where
后面应该有一个空格。
永远不要使用cur.execute("string_expression")
- 总是使用sql_text = "string_expression"
然后cur.execute(sql_text)
。这允许打印 sql_text
变量值并检查 SQL 是否有错误。
请不要使用字符串格式或连接来准备查询。这些很容易受到注入攻击。请改用prepared statements。
【参考方案1】:
你也可以试试这个:
cur.execute("DELETE FROM students WHERE roll_no=%s",
(
self.Roll_No_var.get(), # seperate your entries from the sql
)) # code
--------
cur.execute("SELECT * FROM students WHERE example=%s LIKE %s ORDER BY ....",
(
'%' + self.your_entries.get() + '%', # there are different ways for mysql
'%' + self.your_entries.get() + '%', # make sure, that your table, you created matched, with your entries.
#or you will get this mysql.errors
))
【讨论】:
添加关于提供的代码如何回答问题的解释总是更有用。 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation 将通过展示为什么这是解决问题的好方法,并使其对有其他类似问题的未来读者更有用,从而大大提高其长期价值。请edit您的回答添加一些解释,包括您所做的假设。 是的,但是我之前在写的时候看到了那个acw1668 postet,所以我用另一种方式发布了。但你说得对,我编辑 @JoeMo 您的答案比这里的其他答案要好,但是您缺乏解释。正如我之前所说,其他答案很容易出现 SQL 注入。【参考方案2】:在delete_data()
内部,cur.execute(...)
的第二个参数应该是一个元组或列表:
cur.execute("DELETE FROM students WHERE roll_no=%s", (self.Roll_No_var.get(),))
search_data()
函数内部的SQL语句中的where
后面应该有一个空格:
"select * from students where "+str(self.search_by.get())+" like '%"+str(self.search_text.get())+"%'"
使用 f-string 更具可读性:
sql = f"SELECT * FROM students WHERE self.search_by.get() LIKE %s"
cur.execute(sql, (f"%self.search_text.get()%",))
【讨论】:
你的查询容易被SQL注入 @CoolCloud 谢谢提醒。但是我仍然找不到指定字段名称的正确方法,因为它不能使用占位符作为字段名称。你能告诉我怎么做吗? 是的,字段名不能用作占位符,而是对字段名的输入进行白名单,现在看起来很好:D以上是关于错误 1064:显示语法错误无法找到导致此错误的原因的主要内容,如果未能解决你的问题,请参考以下文章
PHP 致命错误:未捕获的 PDOException:SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误
空字符串无法解释的MySQL错误#1064创建更新触发器后?
MySQL Workbench:查询中的错误(1064):第 1 行的“VISIBLE”附近的语法错误
SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MariaDB 对应的手册