2012-08-22 33 views
8
यहाँ

मैं किसी भी उन जो एक "अपने ईमेल में/उपयोगकर्ता नाम मौजूद है दूर करने के लिए कोशिश कर रहा हूँ बयान।अजगर mysql हटाने से काम नहीं कर

def removeQuote(self, tbl,record): 
      """ Updates the record """ 
      statmt="select id from %s WHERE `email` LIKE '%%\"%%'" % (tbl) 
      self.cursor.execute(statmt) 
      rows=list(self.cursor.fetchall()) 
      for idx, val in enumerate(rows): 
        id= val[0] 
        delstatmt = "DELETE FROM `maillist_subscription` WHERE id = '%s'" % id 
        print delstatmt 
        self.cursor.execute(delstatmt) 

के रूप में अगर यह कार्य सफलतापूर्वक संपन्न इस के उत्पादन में दिखाता है, लेकिन रिकॉर्ड अवशेष । डेटाबेस में आउटपुट भी एक सही mysql बयान से पता चलता:

DELETE FROM `maillist_subscription` WHERE id = '8288754' 

अपने सभी मदद के लिए धन्यवाद

उत्तर

15

आप टी का उपयोग कर, परिवर्तन के लिए प्रतिबद्ध करने की जरूरत है वह कनेक्शन ऑब्जेक्ट पर() विधि प्रतिबद्ध करता है। अधिकांश डीबीएपीआई इंटरफेस अंतर्निहित लेनदेन का उपयोग करते हैं।

इसके अलावा, SQL क्वेरी पीढ़ी के लिए स्ट्रिंग स्वरूपण का उपयोग न करें! यह आपको SQL इंजेक्शन तक खुल जाएगा:

UNSAFE !!

# What happens if id = "1'; DROP DATABASE somedb" ? 
delstatmt = "DELETE FROM `maillist_subscription` WHERE id = '%s'" % (id,) 
cursor.execute(delstatmt) 
conn.commit() 

सुरक्षित!

delstatmt = "DELETE FROM `maillist_subscription` WHERE id = ?" 
cursor.execute(delstatmt, (id,)) 
conn.commit() 
+0

किसी एक प्रश्न इंजेक्षन करने की कोशिश करता है, तो ग्राहक अगर अमल असफल नहीं हो असुरक्षित दृष्टिकोण में 'बहु = TRUE' साथ नहीं बुलाया जाता है? – user666412

+0

@ user666412 हमेशा इसे सही तरीके से करें और आप किसी को भी अपने क्वेरी तर्क के साथ खेलने की अनुमति नहीं देंगे। उपरोक्त असुरक्षित विधि पर विचार करें, जहां आईडी '123 'या TRUE -' –

+0

सही है ... धन्यवाद। – user666412