2017-04-25 52 views
0

我是Python和MySQL的新手,所以我正在使用只读帐户进行练习。我正在尝试创建一个可执行脚本,该脚本基本上要求提供名字,姓氏,然后将其插入查询并返回结果。下面是我和错误,我得到:pymysql - pymysql.err.InternalError:1054,用作列名称的用户输入字符串

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'")

我觉得这是一个“或”缺失的地方,但我想不出我的语法错误

回答

0

中的字符串文字。 SQL必须由'"包围你的where子句中提供的名字,所以那些应该由speechmarks之一封闭。

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

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

+0

谢谢你,我确实想念那个',并没有附上他们。我试图把字符串括起来,但仍然有错误,这可能是尾随的。我也没有印刷品,并假定胎盘会印刷。 – eknack87

0

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

如果您将这些参数传递给execute方法,它会更安全(并且还修复了引用问题)。

I.e.取而代之的是这样的:

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库安全地引用您认为合适的输入。

+1

非常感谢。经过测试,这也起作用:) – eknack87