将数据从python发送到MySQL后返回“None”行

2024-06-02 06:43:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在进行我的项目,但我面临着将数据从python传递到MySQL的问题 代码运行良好,没有给我一个错误,但是它在表中插入了“None”!!我不知道错误在哪里

def report_proble():
top=Toplevel()
top.title('Report problem window')
name = Label(top, text = "Name:",bg='#BFD5ED').place(x = 300,y = 50)
email = Label(top, text = "Email:",bg='#BFD5ED').place(x = 300, y = 90) 
problem=Label(top, text = "Report your problem:",bg='#BFD5ED').place(x = 300, y = 130)
e1 = Entry(top).place(x = 340, y = 50)
e2 = Entry(top).place(x = 340, y = 90)
Text1=tk.Text(top, height=10,width=50).place(x=300,y=170)

bmitbtn = Button(top, text = "Submit",activebackground = '#3C919D', activeforeground = "blue",command=lambda:db(name,email,problem)).place(x=450,y=340)

def db(name,email,problem)
if(name=="" or email=="" or problem==""):
    MessageBox.showinfo("Insert Status","All fields are required")
else:
    mycursor.execute ("INSERT INTO problem(name,email,problem) values('%s','%s','%s')"%(name,email,problem))
    mycursor.close()
    mydb.commit()

    MessageBox.showinfo("Thank you for the feedback!")
    mydb.close()

MySQL中的表是

姓名、电子邮件、问题
“无”、“无”、“无”


Tags: textnamereportdbemailtopdef错误
2条回答

我看不到与数据库的连接,我很确定你可以使用values(%s,%s,%s) 相反values('%s','%s','%s')

或者给你一个更好的例子:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="yourusername",
  passwd="yourpassword",
  database="mydatabase"
)

mycursor = mydb.cursor()

sql = "INSERT INTO problem (name, email,problem) VALUES (%s, %s,%s)"
val = ("yourdata", "yourdata", "yourdata")
mycursor.execute(sql, val)

mydb.commit()

print(mycursor.rowcount, "record inserted.")

您的代码已编辑:

def report_proble():
top=Toplevel()
top.title('Report problem window')
name = Label(top, text = "Name:",bg='#BFD5ED').place(x = 300,y = 50)
email = Label(top, text = "Email:",bg='#BFD5ED').place(x = 300, y = 90) 
problem=Label(top, text = "Report your problem:",bg='#BFD5ED').place(x = 300, y = 130)
e1 = Entry(top).place(x = 340, y = 50)
e2 = Entry(top).place(x = 340, y = 90)
Text1=tk.Text(top, height=10,width=50).place(x=300,y=170)

bmitbtn = Button(top, text = "Submit",activebackground = '#3C919D', activeforeground = "blue",command=lambda:db(name,email,problem)).place(x=450,y=340)

def db(name,email,problem)
if(name=="" or email=="" or problem==""):
    MessageBox.showinfo("Insert Status","All fields are required")
else:
    sql = "INSERT INTO problem (name, email,problem) VALUES (%s, %s,%s)"
    val = (name, email, problem)
    mycursor.execute(sql, val)

    mydb.commit()

    MessageBox.showinfo("Thank you for the feedback!")
    mydb.close()

更新:

val = (name, email, problem)更改为val = (e1, e2, text1) 因为你在这里收集的数据不是名字,不是电子邮件,也不是问题

让我们看看这段代码:

name = Label(...).place(...)
email = Label(...).place(...)
problem=Label(...).place(...)

这是将nameemailproblem全部设置为None。这是因为在python中x = y().z()x设置为z。因为.place(...)总是返回None,所以变量被设置为None

因此,正因为如此:

bmitbtn = Button(..., command=lambda:db(name,email,problem))....

。。。您总是将None, None, None传递给函数

作为最佳实践,您不应该在创建小部件的同一行上调用packplacegrid。这是一个坏习惯,会导致这样的错误

如果希望nameemailproblem作为小部件的引用,则需要将小部件创建与小部件布局分开:

name = Label(...)
email = Label(...)
problem=Label(...)

name.place(...)
email.place(...)
problem.place(...)

现在,让我们看一下db函数:

def db(name,email,problem)
    if(name=="" or email=="" or problem==""):
        MessageBox.showinfo("Insert Status","All fields are required")

值将永远不会是空字符串。现在他们总是None,因为这就是你要传递的东西。但是,即使nameemailproblem不是None,它们也永远不会是空字符串,因为您试图传递的是小部件引用而不是字符串

尽管如此,将标签传递给函数没有什么意义。用户输入的数据将不在标签中。相反,您需要传入条目和文本小部件,然后在函数内调用.get()方法以获取数据:

e1 = Entry(top)
e2 = Entry(top)
text1=tk.Text(top, height=10,width=50)
...
bmitbtn = Button(..., command=lambda:db(e1, e2, text1))

然后,定义db以在使用数据之前获取数据:

def db(name_entry,email_entry,problem_text):
    name = name_entry.get()
    email = email_entry.get()
    problem = problem_text.get("1.0", "end-1c")
    ...

相关问题 更多 >