即使行在数据库中,Python mySQL.connector 也返回 None

时间:2021-07-07 23:13:15

标签: python mysql

我正在制作一个服务器应用程序,当客户端连接时,它会确定它是可以发送数据还是只侦听传入的数据。它通过以下代码确定它是否是“发送”客户端:

try:
    conn = mysql.connector.connect(host=config['databaseHost'], user=config['databaseUser'], password=config['databasePassword'], port=config['databasePort'])

except mysql.connector.Error as err:
    print(err)

cur = conn.cursor()
cur.execute("USE tcpPractice")
cur.execute("SELECT ip_address FROM client_list")
res = cur.fetchall()

for item in res:
    if item[0] not in senders:
        senders.append(item[0])

上面代码中,如果客户端的地址不在res生成的列表中,则继续执行第二部分代码,即判断是否为监听客户端。在这里,可以侦听的客户端通过用户名和密码进行身份验证。在这里,我查询给定用户名的数据库并获取与之关联的密码。但是,当我运行以下代码时:

socket.send("Enter your username: ".encode())
username = socket.recv(SIZE).decode()
socket.send("Enter your password: ".encode())
password = socket.recv(SIZE).decode()


statement = "SELECT passwd FROM users_table WHERE username = %s"

try:
    cur.execute(statement, (username, ))
except mysql.connector.Error as err:
    print(err)

hashed = cur.fetchone()

hashed 总是返回 None,即使我使用我知道在数据库中的用户名和密码进行测试。我尝试关闭连接和游标并重新创建它们无济于事,我确保语法正确,我确保我使用的是正确的数据库,我确保我正在查询正确的表并寻找正确的列,我尝试在每个 execute 语句之后提交,但到目前为止没有任何效果。

作为测试,我在 Python shell 中尝试了上述操作(减去与套接字相关的行),并且在那里按预期工作。我尝试搜索此问题,但我查看的所有解决方案均无效。任何想法可能是什么问题?

编辑:忘记提及我使用 netcat 连接到服务器应用程序,我没有使用任何自定义客户端程序。

EDIT2:我刚刚发现像这样对用户名进行硬编码:

statement = "SELECT passwd FROM users_table WHERE username = 'testUser'"
cur.execute(statement)

按预期工作并且散列不再返回 None,所以我很确定问题在于我尝试使用的准备好的语句或我如何从客户端接收用户名。

EDIT3:我弄清楚问题是什么,我发布了解决方案。

2 个答案:

答案 0 :(得分:0)

我发现了问题所在。事实证明,来自 netcat 的所有输入的末尾都有一个 \n,这导致查询失败。所以,这样做:

socket.send("Enter your username: ".encode())
username = socket.recv(SIZE).decode().strip()
socket.send("Enter your password: ".encode())
password = socket.recv(SIZE).decode().strip()

修复了问题,服务器现在按预期工作。

答案 1 :(得分:-2)

将语句改为 语句 = "SELECT passwd FROM users_table WHERE username = '%s'"

是否缺少引号?