2012-06-05 30 views
5

Recientemente he comenzado a aprender Python y MySQL para propósitos web y se han topado con un problema siguiente:MySQLdb Python DONDE SQL LIKE

quiero sacar de un un registro de base de datos MySQL que contiene el texto que me entro en la sección parámetro, howerver estoy corriendo en siguiente problema al hacer una consulta:

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 

Aquí está mi código:

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

Gracias de antemano.

Respuesta

25

insertar directamente los datos en la cadena SQL no es la mejor manera de hacer esto, ya que es propenso a SQL injection. Se debe cambiar a esto:

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

+0

Vaya, estás en lo cierto @univerio. Eliminado mi respuesta, la tuya es mejor. –

+0

gracias, su solución fue la mejor, me gusta esta sección "("% "+ param +"% ",)" –

0

No está utilizando un parámetro adecuado. Python espera otro calificador en esta área ('%s%___') para realizar una sustitución de cadena. Este es también un código vulnerable. La forma correcta de hacer esto se vería más como:

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

+0

no creo que esto se traducirá en la misma consulta. La cadena final tendrá una cláusula LIKE de% param%, en vez de param%, como se propone @univerio. –

+0

tienes razón - claro descuido – swasheck