2012-06-05 19 views
5

मैं हाल ही में वेब प्रयोजनों के लिए अजगर और MySQL जानने के लिए शुरू कर दिया है और मैं एक निम्न समस्या में पड़ गए हैं:अजगर MySQLdb कहां एसक्यूएल तरह

मैं एक mysql डेटाबेस एक रिकॉर्ड से बाहर निकलने के लिए चाहते हैं किसी भी पाठ होता है कि कि मैं परम खंड में प्रवेश करते हैं, howerver मैं जब एक प्रश्न बना निम्न समस्या में चल रहा हूँ:

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

अग्रिम धन्यवाद:

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 

यहाँ मेरी कोड है।

उत्तर

25

सीधे एसक्यूएल स्ट्रिंग में डेटा डालने के रूप में यह SQL injection की संभावना है, यह करने के लिए सबसे अच्छा तरीका नहीं है। आप इस के लिए इसे बदल देना चाहिए:

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

+0

ओह, आप पूरी तरह से सही @univerio हैं। मेरा जवाब हटा दिया, तुम्हारा बेहतर है। –

+0

धन्यवाद, आपका समाधान सबसे अच्छा था, मुझे यह खंड पसंद है "("% "+ param +"% ",)" –

0

आप उचित पैरामीटर का उपयोग नहीं कर रहे हैं। एक स्ट्रिंग प्रतिस्थापन करने के लिए पाइथन इस क्षेत्र ('%s%___') में एक और क्वालीफायर की उम्मीद कर रहा है। यह भी कमजोर कोड है। यह करने के लिए उचित तरीके से अधिक दिखाई देगा:

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

+0

मुझे नहीं लगता कि यह एक ही क्वेरी में परिणाम होगा है। अंतिम स्ट्रिंग परम% की बजाय% param% की एक समान धारा होगी, क्योंकि @univerio का इरादा है। –

+0

आप सही हैं - स्पष्ट निरीक्षण – swasheck

संबंधित मुद्दे