MySQL 数据库查询返回整数而不是行数据
MySQL database query is returning an integer instead of row data
我正在尝试测试以表格形式提交的信息(电子邮件地址和密码)是否已存在于数据库中。如果邮件存在,我想检查数据库中对应的散列密码是否与提交密码的散列版本匹配。
这是我的登录路径的完整摘录:
# Login route
@app.route("/login", methods=["GET", "POST"])
def login():
"""Log user in"""
# Forget any user_id
session.clear()
# User reached route via POST (as by submitting a form via POST)
if request.method == "POST":
# Create a cursor
cur = mysql.connection.cursor()
# Ensure email was submitted
if not request.form.get("email"):
return apology("must provide email", 403)
# Ensure password was submitted
elif not request.form.get("password"):
return apology("must provide password", 403)
# Store email in a variable
email = request.form.get("email")
# Query if email is within database
query = cur.execute("SELECT * FROM users WHERE email = %s", (email,))
# Ensure email exists and that the password is correct
if len(query) != 1 or not check_password_hash(query[0]["hashedpassword"], request.form.get("password")):
return apology("invalid email and/or password", 403)
# Remember which user has logged in
session["user_id"] = query[0]["id"]
# Redirect user to the homepage
return redirect("/")
# User reached route via GET (as by clicking a link or via redirect)
else:
return render_template("login.html")
我遇到困难的部分是:
# Ensure email exists and that the password is correct
if len(query) != 1 or not check_password_hash(query[0]["hashedpassword"], request.form.get("password")):
return apology("invalid email and/or password", 403)
在这里,我试图从我的数据库中提取指定电子邮件地址的单行信息。我试图使用 len 查看是否存在单行(不能存在两行,因为我已确保电子邮件地址列在数据库中是唯一的),因此应该有单行或 none.
问题是我之前的数据库查询返回一个整数值 (query = 1),如以下错误所示:
[2020-10-05 11:34:27,857] ERROR in app: Exception on /login [POST]
Traceback (most recent call last):
File "c:\users\tjmce\appdata\local\programs\python\python38-32\lib\site-packages\flask\app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "c:\users\tjmce\appdata\local\programs\python\python38-32\lib\site-packages\flask\app.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
File "c:\users\tjmce\appdata\local\programs\python\python38-32\lib\site-packages\flask\app.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "c:\users\tjmce\appdata\local\programs\python\python38-32\lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "c:\users\tjmce\appdata\local\programs\python\python38-32\lib\site-packages\flask\app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "c:\users\tjmce\appdata\local\programs\python\python38-32\lib\site-packages\flask\app.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:\Users\tjmce\Desktop\Final Project\app.py", line 81, in login
if len(query) != 1 or not check_password_hash(query[0]["hashedpassword"], request.form.get("password")):
TypeError: object of type 'int' has no len()
有人能帮我理解为什么查询的值为 1 而不是行数据吗?
谢谢!
您缺少的部分是
rows = cursor.fetchall()
它将 return 数据提供给您,您将能够在 rows
上实现您的逻辑
我正在尝试测试以表格形式提交的信息(电子邮件地址和密码)是否已存在于数据库中。如果邮件存在,我想检查数据库中对应的散列密码是否与提交密码的散列版本匹配。
这是我的登录路径的完整摘录:
# Login route
@app.route("/login", methods=["GET", "POST"])
def login():
"""Log user in"""
# Forget any user_id
session.clear()
# User reached route via POST (as by submitting a form via POST)
if request.method == "POST":
# Create a cursor
cur = mysql.connection.cursor()
# Ensure email was submitted
if not request.form.get("email"):
return apology("must provide email", 403)
# Ensure password was submitted
elif not request.form.get("password"):
return apology("must provide password", 403)
# Store email in a variable
email = request.form.get("email")
# Query if email is within database
query = cur.execute("SELECT * FROM users WHERE email = %s", (email,))
# Ensure email exists and that the password is correct
if len(query) != 1 or not check_password_hash(query[0]["hashedpassword"], request.form.get("password")):
return apology("invalid email and/or password", 403)
# Remember which user has logged in
session["user_id"] = query[0]["id"]
# Redirect user to the homepage
return redirect("/")
# User reached route via GET (as by clicking a link or via redirect)
else:
return render_template("login.html")
我遇到困难的部分是:
# Ensure email exists and that the password is correct
if len(query) != 1 or not check_password_hash(query[0]["hashedpassword"], request.form.get("password")):
return apology("invalid email and/or password", 403)
在这里,我试图从我的数据库中提取指定电子邮件地址的单行信息。我试图使用 len 查看是否存在单行(不能存在两行,因为我已确保电子邮件地址列在数据库中是唯一的),因此应该有单行或 none.
问题是我之前的数据库查询返回一个整数值 (query = 1),如以下错误所示:
[2020-10-05 11:34:27,857] ERROR in app: Exception on /login [POST]
Traceback (most recent call last):
File "c:\users\tjmce\appdata\local\programs\python\python38-32\lib\site-packages\flask\app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "c:\users\tjmce\appdata\local\programs\python\python38-32\lib\site-packages\flask\app.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
File "c:\users\tjmce\appdata\local\programs\python\python38-32\lib\site-packages\flask\app.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "c:\users\tjmce\appdata\local\programs\python\python38-32\lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "c:\users\tjmce\appdata\local\programs\python\python38-32\lib\site-packages\flask\app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "c:\users\tjmce\appdata\local\programs\python\python38-32\lib\site-packages\flask\app.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:\Users\tjmce\Desktop\Final Project\app.py", line 81, in login
if len(query) != 1 or not check_password_hash(query[0]["hashedpassword"], request.form.get("password")):
TypeError: object of type 'int' has no len()
有人能帮我理解为什么查询的值为 1 而不是行数据吗?
谢谢!
您缺少的部分是
rows = cursor.fetchall()
它将 return 数据提供给您,您将能够在 rows