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

时间:2017-04-25 13:37:43

标签: 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 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,你"未知栏' ethan' in   ' where where'")

我觉得这是一个'或"在某个地方失踪,但我无法弄清楚我的语法错误。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

不建议使用字符串插值(即%运算符)将这些值放入查询中,因为它可能导致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库安全地引用您认为合适的输入。

相关问题