Python pymysql-pymysql.err.InternalError:1054,用户输入字符串用作列名
我不熟悉Python和MySQL,所以我正在使用一个只读帐户进行练习。我试图创建一个可执行脚本,基本上要求输入名字和姓氏,然后将它们插入查询并返回结果。以下是我所得到的信息和错误: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
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会打印。