首页 > 解决方案 > 注册-登录系统

问题描述

我正在尝试在 Python 3 中创建一个注册登录系统,但是当我检查电子邮件地址是否已经存在时,它总是说它不存在。我在“用户”表中插入了一个电子邮件和一个密码,当被问到我在这个脚本中使用了相同的电子邮件地址时,它仍然说它不存在。我在 MySQL 方面几乎没有经验,并认为这可能是一个不错的项目。谢谢你。

import cymysql
from getpass import getpass


def get_user_info():
    while True:
        email = input("Input your Email address (max. 64 chars.): ")
        password = getpass("Input a password (max. 64 chars.): ")
        if len(email) < 64 and len(password) < 64: 
            return email, password


def check_account(cur, email, password):
    if(cur.execute(f"SELECT * FROM `users` WHERE `Email`='{email}' LIMIT 1")):
        print("exist")
    else:
        print("no exist")


def main():
    conn = cymysql.connect(
        host='192.168.0.109',
        user='root',
        passwd='',
        db='database'
    )
    cur = conn.cursor()
    email = ''
    password = ''
    email, password = get_user_info()
    check_account(cur, email, password)

    cur.close()
    conn.close()


if __name__ == '__main__':
    main()

标签: pythonmysqlsqlpython-3.x

解决方案


免责声明:我还没有使用过cymysql——下面附加的任何代码都未经测试。

首先,请注意 CyMySQL 是 PyMySQL [1]的一个分支项目,因此我将参考 PyMySQL 的文档。

pymysql.cursors.Cursor.execute文档

execute(query, args=None)
    Execute a query
    Parameters: 
        query (str) – Query to execute.
        args (tuple, list or dict) – parameters used with query. (optional)
    Returns:        Number of affected rows
    Return type:    int

要考虑的重要一点是execute函数返回:受影响的行数SELECT查询不会影响任何行,因此该函数将返回 0 并且您的函数将合理no exist打印。

用于fetchone检查是否至少返回了一行。

def check_account(cur, email, password):
    cur.execute(f"SELECT * FROM `users` WHERE `email`=%s LIMIT 1", (email,))
    row = cur.fetchone()
    if row:
        print("exist")
    else:
        print("no exist")

cur.execute(考虑到我之前的评论,我重写了你的电话。)


推荐阅读