[英]How do I make a login using SQLITE3 in Python?
是的,这是我的第一篇文章,不要欺负我......所以我试着在 python(模块)中使用 SQLITE3 进行登录,我是垃圾(如果有更好的数据库模块,那么你能告诉我我可以使用 MySQL 但我不需要存储 103213021032103123123 数据所以我不知道在这里做什么代码:
conn = sqlite3.connect("pooptest123.db")
c = conn.cursor()
def create_table():
c.execute("CREATE TABLE login(Username VARCHAR, Passwords VARCHAR)")
conn.commit
def enter():
Username = input("Create username: ")
Password = input("Create password: ")
c.execute(
"INSERT INTO login (Username, Passwords) VALUES (?, ?)", (Username, Password,)
)
conn.commit()
create_table()
enter()
def read():
sql = 'SELECT * FROM login WHERE "Username" == Username'
sql2 = "SELECT * FROM login WHERE 'Passwords' == Password"
c.execute(sql, sql2)
conn.commit
read()
def loginlol():
sure = input("Login?(Y OR N: ")
if sure == "y" or sure == "Y":
b = input("Username: ")
ca = input("Password: ")
if b == sql:
print("Username correct!")
if c == sql2:
print("Password correct!")
print("Logging in...")
loginlol()
conn.close()
它说:
File "C:\Users\dontlookhere\AppData\Local\Programs\Python\Python38-32\login.py", line 20, in <module>
read()
File "C:\Users\dontlookhere\AppData\Local\Programs\Python\Python38-32\login.py", line 18, in read
c.execute(sql, sql2)
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 0, and there are 49 supplied.
对不起,我很笨,所以用 oop 和 idk 搞砸了,反正我在做什么 thx
你的第一个(但不是最后一个)错误是
c.execute(sql, sql2)
execute()
不能运行两个查询。 它运行sql
作为查询,但sql2
中的文本用作 sql 的sql
列表。
查看您的其他execute
:
c.execute(
"INSERT INTO login (Username, Passwords) VALUES (?, ?)", (Username, Password,)
)
您只有一个查询INSERT
和 arguments 列表(Username, Password,)
另一个错误是您希望SELECT
将结果分配给变量sql
和sql2
但它不能以这种方式工作。 execute
使用查询sql
但之后您必须使用c.fetchall()
或c.fetchone()
从数据库中获取结果。
只需在 Python 中获得一些数据库教程,然后从头开始学习。
编辑:
另一个大错误是你使用了两个 SELECT
'SELECT * FROM login WHERE "Username" == Username'
"SELECT * FROM login WHERE 'Passwords' == Password"
但是这样你检查没有password
的username
或没有username
的password
,但你不检查password
和username
成对。
有人可能会使用your useraname
和my password
,它会给出True
但它应该给出True
仅用于配对your username
和your password
或配对my username
和my password
。 您应该在一个查询中使用
WHERE Username == "?" AND Passwords == "?"
喜欢
c.execute('SELECT * FROM login WHERE Username == "?" AND Passwords == "?"', (username, password)`
但是还有其他问题 - 您不应该将密码保存为纯文本,但应该对其进行加密。 但这是不同问题的问题。
或多或少:
def read(username, password):
sql = 'SELECT * FROM login WHERE Username == "?" AND Passwords == "?"'
c.execute(sql, (userame, password)
result = c.fetchone()
return result
编辑:
我看到另一个问题-在您的数据库中,您可能多次使用相同的username
-您应该将其UNIQUE
编辑:
示例代码。
对于开始测试,它会删除表并创建新表,但通常您应该只创建一次表。
我添加了UNIQUE
,因此当您尝试创建具有相同名称的第二个用户时会引发错误。
它仍然需要加密password
如果username
和password
正确,则check()
返回包含用户数据的单行。 如果username
或password
错误,则返回None
。
最终在check()
中,您可以创建仅使用Username =?
的查询获取用户数据,稍后它会检查此数据中的password
,而无需使用第二个sql
。 这样,即使他输入了错误的password
,您也可以获得用户数据。
import sqlite3
def create_table():
query = "DROP TABLE IF EXISTS login"
cursor.execute(query)
conn.commit()
query = "CREATE TABLE login(Username VARCHAR UNIQUE, Password VARCHAR)"
cursor.execute(query)
conn.commit()
def enter(username, password):
query = "INSERT INTO login (Username, Password) VALUES (?, ?)"
cursor.execute(query, (username, password))
conn.commit()
def check(username, password):
query = 'SELECT * FROM login WHERE Username = ? AND Password = ?'
cursor.execute(query, (username, password))
result = cursor.fetchone()
conn.commit()
print('[DEBUG][check] result:', result)
return result
def loginlol():
answer = input("Login (Y/N): ")
if answer.lower() == "y":
username = input("Username: ")
password = input("Password: ")
if check(username, password):
print("Username correct!")
print("Password correct!")
print("Logging in...")
else:
print("Something wrong")
# --- main ---
conn = sqlite3.connect("pooptest123.db")
cursor = conn.cursor()
create_table()
Username = input("Create username: ")
Password = input("Create password: ")
enter(Username, Password)
#check(Username, Password)
loginlol()
cursor.close()
conn.close()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.