Python pymysql-pymysql.err.InternalError:1054,用户输入字符串用作列名

Python pymysql-pymysql.err.InternalError:1054,用户输入字符串用作列名,python,mysql,pymysql,Python,Mysql,Pymysql,我不熟悉Python和MySQL,所以我正在使用一个只读帐户进行练习。我试图创建一个可执行脚本,基本上要求输入名字和姓氏,然后将它们插入查询并返回结果。以下是我所得到的信息和错误: cur = conn.cursor() user_input_fname = raw_input("Enter Trainer First Name: ") user_input_lname = raw_input("Enter Trainer Last Name: ") cur.execute(" SELECT

我不熟悉Python和MySQL,所以我正在使用一个只读帐户进行练习。我试图创建一个可执行脚本,基本上要求输入名字和姓氏,然后将它们插入查询并返回结果。以下是我所得到的信息和错误:

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()
错误:pymysql.err.InternalError:(1054,u)中的未知列“ethan” “where子句”(where子句)


我觉得在某个地方缺少了一个“或”,但我无法找出我的语法错误。

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库就可以根据需要安全地引用您的输入。

谢谢,我确实错过了这一点,并且没有附上它们。我试图将字符串括起来,但仍然得到错误,可能是尾随的'。我也没有打印,并且假设fetchall会打印。