2012-06-05 5 views
5

ich vor kurzem begonnen haben, Python und MySQL für Web-Zwecke zu lernen, und ich habe in ein folgendes Problem führen:Python MySQLdb WHERE SQL LIKE

ich aus einer MySQL-Datenbank einen Datensatz herausziehen möchten, dass enthält jeden Text, den ich howerver ich in folgendem Problem leite in param Abschnitt eingeben, wenn eine Abfrage machen:

traceback (most recent call last): 
    File "/Users/Strielok/Desktop/test.py", line 13, in <module> 
    c.execute("SELECT * FROM data WHERE params LIKE ('%s%') LIMIT 1" % (param)) 
TypeError: not enough arguments for format string 

Hier ist mein Code:

import MySQLdb 



db = MySQLdb.connect (host = "localhost", 
          user = "root", 
          passwd = "root", 
          db = "test") 
param = "Test" 

par = param 

c = db.cursor() 

c.execute("SELECT * FROM data WHERE params LIKE ('%s%') LIMIT 1" % (param)) 


data = c.fetchall() 
print data 

c.close() 

Vielen Dank im Voraus.

Antwort

25

die Daten direkt in das SQL-Zeichenfolge Einfügen ist nicht der beste Weg, dies zu tun, da sie anfällig für SQL injection sind. Sie sollten sie dies ändern:

c.execute("SELECT * FROM data WHERE params LIKE %s LIMIT 1", ("%" + param + "%",))

+0

Hoppla, Sie sind völlig richtig @univerio. Löschte meine Antwort, deine ist besser. –

+0

danke, deine Lösung war die beste, ich mag diesen Abschnitt "("% "+ param +"% ",)" –

0

Sie verwenden keinen geeigneten Parameter. Python erwartet einen weiteren Qualifier in diesem Bereich ('%s%___'), um eine String-Substitution durchzuführen. Dies ist auch anfälliger Code. Der richtige Weg, dies zu tun, würde aussehen wie:

c.execute("SELECT * FROM data WHERE params LIKE '%%s%' LIMIT 1",(param,))

+0

Ich glaube nicht, das in der gleichen Abfrage führen. Der letzte String wird eine LIKE-Klausel von% param% anstelle von param%, wie @univerio beabsichtigt. –

+0

Sie haben Recht - klare Aufsicht – swasheck