2012-06-05 8 views
5

Gần đây tôi đã bắt đầu học Python và MySQL cho mục đích web và tôi đã gặp phải một vấn đề sau:Python MySQLdb WHERE SQL LIKE

Tôi muốn rút ra khỏi cơ sở dữ liệu mysql. nhập trong phần param, howerver tôi chạy vào vấn đề sau đây khi thực hiện một truy vấn:

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 

đây là mã của tôi:

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

Cảm ơn trước.

Trả lời

25

trực tiếp chèn dữ liệu vào chuỗi SQL không phải là cách tốt nhất để làm điều này, vì nó là dễ bị SQL injection. Bạn nên thay đổi điều này thành:

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

+0

Rất tiếc, bạn hoàn toàn chính xác @univerio. Đã xóa câu trả lời của tôi, câu trả lời của bạn tốt hơn. –

+0

cảm ơn, giải pháp của bạn là tốt nhất, tôi thích phần này "("% "+ param +"% ",)" –

0

Bạn không sử dụng thông số thích hợp. Python đang mong đợi một vòng loại khác trong khu vực này ('%s%___') để thực hiện thay thế chuỗi. Đây cũng là mã dễ bị tổn thương. Cách thích hợp để làm điều này sẽ như thế nào nữa:

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

+0

Tôi không nghĩ điều này sẽ dẫn đến cùng một truy vấn. Chuỗi cuối cùng sẽ là mệnh đề LIKE của% param%, thay vì tham số%, như @univerio dự định. –

+0

bạn đúng - giám sát rõ ràng – swasheck