2012-04-06 18 views
0

Ich begann Skripting in Python und ich lief ein in seltsames Problem.Python CGI-Skript fügt nur ganze Zahlen in MySQL-Datenbank

Ich versuche, einige Werte in Mysql-Datenbank einzufügen. Datenbankfelder sind varchar, utf-8 Unicode

Verwendung von Python 3.2 und wamp Server 2.2 (Apache 2.2.21, MySQL 5.5.20)

Wenn ich versuche, Druck (ime), Print (prezime) usw. es druckt Werte eines Formulars von einer anderen Seite, also bekomme ich korrekte Werte.

wenn ich schreibe SQL-Anweisung wie:

"INSERT INTO Clanovi(CL_Ime,CL_Prezime, CL_Email, CL_Tel) VALUES ("aa","aa","aa","aa")" 

es, diese Werte in die Datenbank einfügt

wenn ich schreibe:

sql = "INSERT INTO Clanovi(CL_Ime,CL_Prezime, CL_Email, CL_Tel) VALUES (%s,%s,%s,%s)",(ime,prezime,email,tel) 

es

nicht funktioniert finaly wenn ich setzen

sql = "INSERT INTO Clanovi (CL_Ime, CL_Prezime, CL_Email, CL_Tel) VALUES (% s,% s,% s,% s)" % (ime, prezime, E-Mail, Telefon)

wenn ich nur setzen Zahlen in Formularfelder wird es zur Datenbank verpflichten (neue Daten hinzufügen) ime = 21 prezime = 232 email = 123 tel = 123 Wenn ich etwas anderes wie Buchstaben lege, fügt es keine neue Zeile in die Datenbank ein ime = etw prezime = blabla email = aa tel = dada

(ich weiß, dass diese Methode Sicherheitsrisiko hat)

hier ist ganz Code (I geputtet print (sQL) nur um zu sehen, was meine Frage, wie am Ende aussieht)

#!c:\python32\python.exe 
import MySQLdb 
import cgi 
print ("Content-type: text/html\n\n") 

form = cgi.FieldStorage() 
ime =form["ime"].value 
prezime = form["prezime"].value 
email= form["email"].value 
tel = form["tel"].value 
print(ime)  
db = MySQLdb.connect("localhost","root","","biblioteka") 

cursor = db.cursor() 

sql = "INSERT INTO Clanovi(CL_Ime,CL_Prezime, CL_Email, CL_Tel) VALUES (%s,%s,%s,%s)"%(ime,prezime,email,tel) 
print(sql) 
try: 
    cursor.execute(sql) 
    db.commit() 
except: 
    db.rollback() 
db.close() 

Vielen Dank für Ihre Zeit und Hilfe.

+1

http://en.wikipedia.org/wiki/SQL_injection und auch das Argument der Parameter 'von cursor.execute() – SingleNegationElimination

Antwort

0

Sie sollten Ihre Abfrage nicht mit den String-Operationen von Python zusammenstellen, da dies nicht sicher ist; Es macht Ihr Programm anfällig für einen SQL-Injection-Angriff. Verwenden Sie stattdessen die Parameterersetzung der DB-API. Setzen Sie ? als Platzhalter, wo immer Sie einen Wert verwenden möchten, und dann ein Tupel von Werten als zweites Argument liefern, um die execute() Methode des Cursors:

sql = "INSERT INTO Clanovi(CL_Ime,CL_Prezime, CL_Email, CL_Tel) VALUES (?,?,?,?)" 
print(sql) 
try: 
    cursor.execute(sql, (ime, prezime, email, tel)) 
    db.commit() 
except: 
    db.rollback() 
db.close() 

aktualisieren: Luke ist richtig (siehe Kommentare): MySQL verwendet '% s' anstelle von '?

aktualisiert SQL-Anweisung: sql = "INSERT INTO Clanovi(CL_Ime,CL_Prezime, CL_Email, CL_Tel) VALUES (?,?,?,?)"

+1

MySQLdb verwendet '% s' als Platzhalter nicht "?". Ihr Code oben wird einen "nicht alle Argumente, die während der Formatierung der Zeichenfolge konvertiert werden" geben. –