2012-06-05 31 views
5

Niedawno rozpoczął naukę Python i MySQL dla celów internetowych i ja uruchomić w następujący problem:Python MySQLdb GDZIE SQL LIKE

Chcę wyciągnąć z bazy mysql jeden rekord, który zawiera tekst, który ja wpisać w sekcji param, howerver używam w następujący problem podczas dokonywania zapytania:

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 

Oto mój kod:

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() 

góry dzięki.

Odpowiedz

25

Bezpośrednio wstawiania danych do SQL ciąg nie jest najlepszym sposobem, aby to zrobić, ponieważ jest podatna na SQL injection. należy zmienić go na to:

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

+0

Ups, jesteś całkowicie poprawny @univerio. Usunąłem odpowiedź, twoja jest lepsza. –

+0

dziękuję, twoje rozwiązanie było najlepsze, podoba mi się ta sekcja "("% "+ param +"% ",)" –

0

Nie używasz poprawnego parametru. Python oczekuje innego kwalifikatora w tym obszarze ('%s%___') w celu zamiany ciągu znaków. Jest to również podatny na atak kod. Właściwym sposobem na to będzie wyglądać bardziej jak:

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

+0

Nie sądzę, spowoduje to tego samego zapytania. Ostateczny łańcuch będzie mieć klauzulę LIKE% param%, a nie param%, jak zamierza to zamierzać @univerio. –

+0

masz rację - jasne przeoczenie – swasheck