pymysql - pymysql.err.InternalError: 1054, user input string used as column name

pymysql - pymysql.err.InternalError: 1054, user input string used as column name

我是 Python 和 MySQL 的新手,所以我正在使用只读帐户练习。我正在尝试创建一个可执行脚本,基本上要求输入名字、姓氏,然后将它们插入查询和 returns 结果中。以下是我所拥有的和我得到的错误:

cur = conn.cursor()

user_input_fname = raw_input("Enter Trainer First Name: ")
user_input_lname = raw_input("Enter Trainer Last Name: ")

cur.execute(" SELECT concat(u.firstname, ' ', u.lastname) AS clientName, us.sessionid AS sessionID, convert_tz(s.starttime, '+00:00', '+04:00') AS sessionTimeEST, concat(t.firstname, ' ', t.lastname) AS trainerName FROM usersessions us LEFT JOIN users u ON us.userid = u.id INNER JOIN sessions s ON us.sessionid = s.id INNER JOIN trainers t ON s.trainerid = t.id WHERE u.firstname = %s AND u.lastname =%s  ORDER BY s.starttime;' " %(user_input_fname, user_input_lname))

data = cur.fetchall()

cur.close()
conn.close()

ERROR: pymysql.err.InternalError: (1054, u"Unknown column 'ethan' in 'where clause'")

我觉得某处少了一个 ' 或 ",但我无法找出我的语法错误。

sql 中的字符串文字必须用 '" 括起来。您在 where 子句中提供名称,因此这些名称应包含在以下语音标记之一中:

...WHERE u.firstname = '%s' AND u.lastname ='%s'...

在 sql 语句结束之前还有一个尾随单引号。如果那确实在您的代码中,则必须将其删除。

不建议使用字符串插值(即 % 运算符)将这些值放入查询中,因为它可能导致 SQL 注入攻击(取决于您的数据来自何处) .

如果将这些参数传递给 execute 方法,它会更安全(并且还可以解决您的引用问题)。

即而是调用类似的东西:

cur.execute("""
SELECT concat(u.firstname, ' ', u.lastname) AS clientName, us.sessionid AS sessionID, convert_tz(s.starttime, '+00:00', '+04:00') AS sessionTimeEST, concat(t.firstname, ' ', t.lastname) AS trainerName
FROM usersessions us LEFT JOIN users u ON us.userid = u.id
INNER JOIN sessions s ON us.sessionid = s.id
INNER JOIN trainers t ON s.trainerid = t.id
WHERE u.firstname = %s AND u.lastname =%s
ORDER BY s.starttime;
""", (user_input_fname, user_input_lname))

这样 MySQL 库就可以安全地引用您认为合适的输入。