import mysql.connector
config = {
'user': 'root',
'password': '*******',
'host': '127.0.0.1',
'database': 'mydb',
'raise_on_warnings': True
}
cnx = mysql.connector.connect(**config)
cursor = cnx.cursor()
find_user = ("SELECT * FROM HM_Login WHERE Username = '%s' ")
data_Pupil = {
'Username': "GJM"
}
cursor.execute(find_user, data_Pupil)
lit = cursor.fetchall()
print(lit)
cursor.close()
cnx.close()
我有一个正常工作的数据库,当我将%S插入数据库时,尝试搜索数据库并拉出一列的一行时遇到了问题,但现在只有在我有值的情况下它才能工作在查询中。这是将mysql连接器用于python。
mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
我收到了这个错误,它非常有见地,如果您有什么办法可以帮助解决,那将毫无用处。
答案 0 :(得分:0)
您的占位符语法用于位置参数,但是您使用了字典。将其替换为元组:
find_user = ("SELECT * FROM HM_Login WHERE Username = %s")
data_pupil = ('GJM',)
cursor.execute(find_user, data_Pupil)
答案 1 :(得分:0)
如错误说明所述。您有一个SQL错误。您正在尝试输入变量作为位置参数,但已在变量“位置”上使用了字典。
相反,您应该对变量和带有变量的元组使用%s,然后执行以下操作:
find_user = "SELECT * FROM HM_Login WHERE Username = %s"
data_Pupil = ('GJM',)
cursor.execute(find_user, data_Pupil)
也可以使用字典-但您不可以。尽管如此,我还是要在这里展示它,因为我必须深入解释以了解原因。
find_user = "SELECT * FROM HM_Login WHERE Username = '{Username}'".format(**data_Pupil)
data_Pupil = {
'Username': "GJM"
}
正如我在评论中告诉我的那样,以上内容适用于sql注入-这就是为什么;假设我们的用户名与以下内容相同:
username = "'MR SQL Injection');DROP TABLE HM_Login;"
这将导致删除表的SQL查询。
SELECT * FROM HM_Login WHERE Username = 'MR SQL Injection');DROP TABLE HM_Login;
为避免上述sql注入。使用第一个解决方案