SQL查询返回“无”而不是行

时间:2018-11-26 00:22:34

标签: python sql python-3.x sqlite

我正在尝试轻松登录,并且有一个标题为“用户”的表格。我正在尝试从POST正文中获取登录信息,并在整个数据库中对其进行验证。

来自表单的值:

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

SQL语句:

conn = sqlite3.connect(db)
cur = conn.cursor()
cur.execute("SELECT * FROM Users WHERE Username LIKE '(%s)'" % user)
row = cur.fetchone()

用户表:

enter image description here

因此,根据我的表单中的POST请求,打印内容如下:

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

因此,您可以看到当数据绝对存在时,该行将作为None返回。如果将user更改为我知道不正确的内容,则会得到相同的结果,但是如果我将表从Users更改为类似Users2的内容,则会遇到{ {1}}错误,可以。因此,尽管匹配了数据,但有关我的语句的某些内容却不允许它产生该行。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您的查询字符串的值为"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 :(得分:3)

  1. 您正在搜索的表达式的计算结果为(ph104694),而您显示的数据中显然没有

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

  3. 这是遭受SQL注入攻击的经典代码示例。您永远都不要使用字符串插值来构建这样的SQL字符串。而是使用参数替换。

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

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