2014-11-12 5 views
0

DB에 삽입을 수행하고 있는데 이메일로 문자열을 삽입하려고합니다. 이 같은데이터베이스에 삽입하는 동안 ValueError가 발생했습니다.

뭔가 :

name = varchar 
email = varchar 
date = date 
age = integer 

: 변수 email'[email protected]' 때 다음

cur.execute("insert into client values(%s,%s,%s,%s)",(name, email, date,int(age))) 

는, 파이썬은 나에게

ValueError: invalid literal for int() with base 10: [email protected] 

내 데이터베이스는 다음과 같은 메타 데이터가이 메시지를 던졌습니다 아무도 무슨 일이 일어나고 있는지 아니?

+0

int % % d % s이 (가) – Hackaholic

+3

int에 대해 % d을 (를) 원한다고 생각합니다. 그러나 오류 메시지는 'age'가 실제로 "[email protected]"임을 나타냅니다. – Madbreaks

+0

나는 그것도 생각했다. 그러나 어째서 지문을 따라 다니고 매 변수마다 문자열을 따라갈 때마다 내 나이 변수가 내 이메일인지 알 수 없다. – AbdulHamid

답변

1

이 오류는 SQL이 아닌 Python에서 발생합니다.

어쨌든 age의 이름은 '[email protected]'과 같습니다. 실수로 이메일 주소로 age를 할당하고 그 문제를 해결 곳

>>> age = '[email protected]' 
>>> int(age) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for int() with base 10: '[email protected]' 
>>> 

당신은 찾을 필요가 : 당신이 int(age)을 할 때, 당신은 ValueError 얻을. 코드가 게시되지 않았기 때문에이 작업을 어떻게 수행했는지 정확히 알 수는 없지만 일반적으로 반복적으로 부정확하게 압축을 풀었 기 때문에 발생합니다. 해야

name, email, date, age = ['Joe', 20, '11/12/2014', '[email protected]'] 

: 같은 뭔가

name, age, date, email = ['Joe', 20, '11/12/2014', '[email protected]'] 

또한 SQL 명령을 구축 할 서식 문자열을 사용해서는 안됩니다. 대신, 터플로 인수를 전달하고 참조 할 ?를 사용

cur.execute("insert into client values(?,?,?,?)", (name, email, date, age)) 

docs에서 :

는 일반적으로 SQL 작업이 파이썬 변수의 값을 사용해야합니다. 이렇게하면 파이썬의 문자열 문자열을 사용하여 쿼리를 조합하면 안됩니다. 프로그램 은 SQL 주입 공격에 취약합니다 ( 에 대한 내용은 http://xkcd.com/327/을 참조하십시오).

+0

감사합니다! 문제는 내 클라이언트 개체에서 나이가 미성년자로 변경된 이메일입니다! 어쨌든 내 SQL 코드를 변경하려고? ? 하지만 postgres 드라이버는 이것으로 작동하지 않습니다! – AbdulHamid

0

대신 첫 번째 버전은 매우 취성

INSERT INTO Client (Name, EmailAddress, StartDate, Age) VALUES (?, ?, ?, ?) 

쓰기

INSERT INTO Client VALUES (?, ?, ?, ?) 

같은 INSERT 문을 작성하지 마십시오. 프로그램을 처음 구현할 때 작동한다고하더라도 테이블 파손을 재구성하면 프로그램이 실패하거나 악화 될 수 있으므로 프로그램이 제대로 작동 할 수는 있지만 잘못된 열에 데이터를 삽입하면 파손될 수 있습니다.

또한이 방식으로 SQL 문을 적용 할 때 명령문에 전달 된 매개 변수에 유형이 지정되지 않은 ? 자리 표시자를 사용합니다.그런 다음이 매개 변수는 이름에서 내부 인용 부호를 이스케이프하는 것에 대해 걱정할 필요없이 유형 인식 형 SQL 주입 안전 방식으로 명령문에 바인딩됩니다 (예 :).

관련 문제