2012-08-22 15 views
8

tutaj staram się usunąć użytkowników, które containt A "w ich e-mail/login.python mysql DELETE nie działa

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) 

Wyjście to pokazuje, jak gdyby akcja zakończyła się pomyślnie, ale pozostaje rekord . w bazie Wyjście pokazuje również prawidłowe oświadczenie mysql!

DELETE FROM `maillist_subscription` WHERE id = '8288754' 

Dzięki za pomoc

Odpowiedz

15

Musisz popełnić zmianę, używając t on metodę commit() na obiekcie połączenia. Większość interfejsów DBAPI korzysta z transakcji niejawnych.

Nie należy również używać formatowania ciągów do generowania zapytań SQL! To otworzy cię do zastrzyków SQL:

NIEBEZPIECZNE !!

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

bezpieczny!

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

Jeśli ktoś próbuje wprowadzić zapytanie, nie powiedzie się, jeśli klient nie wykona nazywa się 'wielofunkcyjnego = TRUE w niebezpiecznej podejście? – user666412

+0

@ user666412 Zawsze robisz to we właściwy sposób i nie pozwalasz nikomu grać z logiką zapytania. Rozważ powyższą niebezpieczną metodę, w której id ma wartość "123" LUB PRAWDA - " –

+0

prawo ... dziękuję. – user666412