2012-08-22 19 views
8

aquí estoy tratando de eliminar los usuarios, que containt a "en su correo electrónico/nombre de usuario.pitón MySQL instrucción de eliminación no funciona

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) 

La salida de esta muestra como si la acción se ha completado con éxito, pero los restos de registro . en la base de datos de salida también muestra una sentencia MySQL correcta:

DELETE FROM `maillist_subscription` WHERE id = '8288754' 

Gracias por toda su ayuda

Respuesta

15

Es necesario confirmar el cambio, mediante la t el método commit() en el objeto de conexión. La mayoría de las interfaces DBAPI usan transacciones implícitas.

¡Además, no utilice el formato de cadena para la generación de consultas SQL! Le abrirá hasta inyecciones de SQL:

¡¡¡INSEGURO !!

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

SEGURO!

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

Si alguien trata de inyectar una consulta, no el cliente fallar si la ejecución no se llama 'con múltiples = TRUE en el enfoque inseguro? – user666412

+0

@ user666412 Siempre hágalo de la manera correcta y no permitirá que nadie juegue con su lógica de consulta. Considere el método inseguro anterior, donde el ID es '123 'O VERDADERO -' –

+0

correcto ... gracias. – user666412

Cuestiones relacionadas