SQL查询返回“None”

2024-03-28 23:52:52 发布

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

我正在进行一个简单的登录,并且有一个名为Users的表。我正在尝试使用POST body登录表单,并在整个数据库中进行验证。在

表单中的值:

user = request.form['username']
password = request.form['password']

SQL语句:

^{pr2}$

用户表:

enter image description here

因此,对于来自我的表单的POST请求,打印内容如下:

Print(user, password) =  ph104694 Password123
Print(row)  = None

因此,当数据绝对存在时,可以看到该行被返回为None。如果我把user改成我知道不正确的东西,我会得到同样的结果,但是如果我把表从Users改成类似{}的东西,我会遇到no table exists错误,这很好。因此,尽管匹配数据存在,但我的语句中的某些内容不允许它生成该行。有什么想法吗?在


Tags: 数据formnone数据库表单内容requestbody
2条回答

查询字符串的计算结果为"SELECT * FROM Users WHERE Username LIKE '(ph104694)'"。在

注意括号中没有实际用户名。在

另外,您几乎肯定不想使用LIKE。在

你想要的是"SELECT * FROM Users WHERE Username = 'ph104694'"

它将使用"SELECT * FROM Users WHERE Username = '{user}'".format(user=user)创建

另外,您可以(也应该)将其参数化为

cur.execute("SELECT * FROM Users WHERE Username = :user", {user: user})
  1. 您的搜索表达式的求值结果是(ph104694),显然在您显示的数据中,并不存在于

  2. 这里没有理由使用LIKE运算符,它可能与您想要的操作背道而驰(匹配与输入的用户ID完全匹配的单个记录)。

  3. 这是遭受SQL注入攻击的典型代码示例。你不应该,永远,永远不要使用字符串插值来构建这样的SQL字符串。相反,请使用参数替换。

总而言之,你想要这样的东西:

 cur.execute("SELECT * FROM Users WHERE Username = ?", [user])

相关问题 更多 >