2017-04-25 1 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

감사합니다. 나는 그것을 놓쳤으며, 동봉하지 않았습니다. 나는 문자열을 감싸려고했지만 여전히 오류가 발생했다. 나는 또한 인쇄물을 가지고 있지 않으며 fetchall이 인쇄 할 것이라고 가정했다. – eknack87

0

문자열 삽입 (즉 % 연산자)을 사용하여 이러한 값을 쿼리에 넣는 것은 좋지 않습니다. 데이터 삽입 위치에 따라 SQL 삽입 공격이 발생할 수 있습니다.

execute 메소드에 인수를 전달하는 것이 더 안전합니다 (또한 인용 문제가 해결됩니다).

e.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

관련 문제