【问题标题】:SQL Query returning "None" instead of rowSQL 查询返回“无”而不是行
【发布时间】:2018-11-26 00:22:33
【问题描述】:

我正在做一个简单的登录,并有一个标题为“用户”的表格。我正在尝试使用我的登录表单 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()

用户表:

所以在我的表单中的POST 请求中,打印的内容如下:

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

因此,当数据绝对存在时,您可以看到该行被返回为None。如果我将user 更改为我知道不正确的内容,我会得到相同的结果,但如果我将表格从Users 更改为Users2 之类的内容,我会遇到no table exists 错误,这很好.因此,尽管存在与我的语句匹配的数据,但它不允许它生成该行。有什么想法吗?

【问题讨论】:

    标签: python sql python-3.x sqlite


    【解决方案1】:
    1. 您的搜索表达式正在评估为(ph104694),这显然存在于您显示的数据中。

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

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

    综合起来,你想要这样的东西:

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

    【讨论】:

    • 感谢您的提示,所以我发现了。无论哪种方式,我的 SQL 都不会被使用,所以只需要克服困难。 ;) 如果帮助我解决以下问题的绅士没有更新他们的答案以反映问题/解决方案,我会接受这个答案。
    【解决方案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})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-22
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-31
      相关资源
      最近更新 更多