错误 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创建更新触发器后?

如何解决 JAVA SQL 语法错误:错误代码 1064

错误 #1064 - 您的 SQL 语法有错误

MySQL Workbench:查询中的错误(1064):第 1 行的“VISIBLE”附近的语法错误

SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MariaDB 对应的手册