【问题标题】:Python MySQL module: cursor not workingPython MySQL模块:光标不起作用
【发布时间】:2015-01-29 14:30:40
【问题描述】:

我正在构建一个使用 Python MySQL 模块连接到数据库的教科书拍卖应用程序。登录代码不起作用。出现提示时,我输入我知道在数据库中的用户名/密码,但它一直说用户名/密码无效。我是否错误地使用了光标对象?

#import the datetime package to use dates
import datetime
#import the mysql connector to access the database
import mysql.connector
#establish a connection to the database
cnx = mysql.connector.connect(user='uXXXXXX', password='pXXXXXX',
host='COMPDBSXXX', database='schemaXXXXXX')
#retrieve a cursor to execute queries
cursor = cnx.cursor()

logged_in = False

########----USER INTERFACE STARTS HERE----###################
print("Welcome to eGCC! Please select an action.")
print("\r")
print("1. LOGIN")

###---LOGIN----#################
while logged_in == False:
    print("Enter eGCC username: ")
    username = input()
    print("Enter eGCC password: ")
    password = input()
    query = ("SELECT Username from egccuser")
    cursor.execute(query)
    for ID in cursor:
        if ID == str(username):
            userID = username
            query = ("SELECT password from egccuser where Username = %s")
            qdata = str(userID)
            cursor.execute(query,qdata) 
            if cursor == password:
                logged_in = True               
    if logged_in == False:
            print("Error: Invalid Username/Password")

#close cursor
cursor.close()
#close the connection to the DBMS
cnx.close()

【问题讨论】:

  • cursor.execute(query, (qdata, ))
  • 你的意思是我应该把它放在 for 循环中的 cursor.execute 的位置吗?如果是这样,那并没有改变任何东西。我是否正确循环光标?
  • qdata 应该是元组或字典,而不是字符串。 dev.mysql.com/doc/connector-python/en/…

标签: python mysql


【解决方案1】:

专业提示:不要在线发布凭据

Iterating over a cursor will return a row (Which is a tuple) and not the ID.来自BaseCursor下的来源

 def __iter__(self):
    return iter(self.fetchone, None) 

 def fetchone(self):
    """Fetches a single row from the cursor. None indicates that
    no more rows are available."""
    self._check_executed()
    if self.rownumber >= len(self._rows): return None
    result = self._rows[self.rownumber]
    self.rownumber = self.rownumber+1
    return result 

因此,if ID == str(username): 永远不会是真的。

我也有一种感觉,if cursor == password: 也永远不会是真的。由于 cursor 不是字符串。

尚未对此进行测试(预计下午),但我的建议是设置一些调试点并查看您是否曾经输入过其中一个块。

旁注。当您可以简单地运行 ("SELECT Username from egccuser where Username = %s and password = %s") 时,为什么要进行迭代。

旁注:为了您的安全以及以纯文本形式存储密码从来都不是一个好习惯。加盐的哈希可以被破坏,但总比没有好。 Read more here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多