我正在使用sqlite制作用户名密码程序,我想检查用户名是否在数据库中(香港专业教育学院已经不这样)然后我想找到所述用户名的行ID,这将是用户的用户名已经输入,我知道如何在数据库中找到一个单词的rowid,例如'Word'。我将如何制作是这样我可以用变量替换这个词 这是我的代码:
def sign_in():
usernameask = input("What is your username?")
passwordask = input("What is your password?")
c.execute("SELECT username FROM stuffToPlot")
names = {name[0] for name in c.fetchall()}
if usernameask in names:
print("Yes")
c.execute("SELECT password FROM stuffToPlot")
passs = {name[0] for name in c.fetchall()}
if passwordask in passs:
print("yes,pass")
t = c.execute("SELECT rowid, FROM stuffToPlot WHERE username = 'usernameask' ")
rowid = t.fetchall()
for r in rowid:
print(r)
else:
print("No,pass"
我在看它所说的t = c.execute("SELECT rowid, FROM stuffToPlot WHERE username = 'usernameask' ")
并且想要将当前正在查找它的'usernameask'
替换为变量中的单词。我该怎么办?
没有错误,它只是在数据库中找到“usernameask”这个词的位置。
答案 0 :(得分:1)
您想使用参数化查询。您将占位符放在查询中的数据必须放在哪里,并将其留给数据库驱动程序以将数据和查询放在一起。
参数化查询可以避免常见的安全隐患, SQL注入攻击,攻击者可以通过输入比您原先预期更多的命令来“扩充”数据库查询。查询参数始终确保您的数据仅作为数据处理,而不是作为命令处理。
参数化查询我们通常也更快,因为它允许数据库避免每次多次使用它时解析查询,并且它还可以重用查询计划。
sqlite3
数据库库使用?
作为位置参数;将?
放在需要使用代码中的数据的位置,并将参数值放在第cursor.execute()
的第二个参数中的序列(如元组或列表)中:
t = c.execute("SELECT rowid, FROM stuffToPlot WHERE username = ?", (usernameask,))
请注意(usernameask,)
是一个包含一个元素的元组。您也可以使用[usernameask]
。
这将使用SELECT
过滤器中usernameask
引用的字符串值执行您的WHERE username =
查询。司机负责正确引用您的价值。
您还可以使用命名的参数,这些参数采用:parametername
的形式,(您可以选择自己的名称),然后使用字典作为{的第二个参数{1}},将名称映射到值:
cursor.execute()
此处占位符名为t = c.execute(
"SELECT rowid, FROM stuffToPlot WHERE username = :username",
{'username': usernameask})
,字典将其映射到username
值。