2016-03-21 12 views
1

Bir tam sayı var, tuple içinde bulunan sütun değeri olan tüm satırları sorgulamak istiyorum. Sorguyu oluşturmak çok kolaydır, ancak sql enjeksiyon kanıtı olmasını istiyorum. Normalde hazırlanan ifadeyi kullanırım, ancak her iki ihtiyaçla nasıl başa çıkacağımı anlamıyorum.MySQL ve PYTHON. Bir WHERE 'sütun' tuple nasıl sorgulanır?

Benim sorgu inşaat benziyor:

filterList = (1, 2, 4) #Taken as input. Should be integers 

sqlRequest = 'SELECT * FROM table' 
    if filterList != None and len(filterList) > 0: 
     sqlRequest += ' WHERE column IN (' 
     addComa = False 
     for filter in filterList: 
      if addComa: 
       sqlRequest += ',' 
      else: 
       addComa = True 
      sqlRequest += '%s'%(int(filter)) #casted to int to avoid SQL injection. Still not as good as I would like 
     sqlRequest += ')' 

    #At this point sqlRequest == 'SELECT * FROM table WHERE column IN (1,2,4)' 
    sqlResult = cursor.execute(sqlRequest) 

ben bir sorgu gibi daha çok isteriz:

sqlRequest = 'SELECT * FROM table WHERE column IN (%s, %s, %s)' 

Ve hazırlanmış deyimi ile çalıştırmak için:

sqlResult = cursor.execute(sqlRequest, filterList[0], filterList[1], filterList[2]) 

Ama değişken uzunluk olarak filterList. Bir şey yapmanın bir yolu var mı?

sqlResult = cursor.execute(sqlRequest, filterList) #where filterList is the whole tuple 
+0

Aynı şekilde diğer veritabanları olduğu gibi, (https://stackoverflow.com/q/14245396) ve [Veritabanı API [Bir WHERE \ _ \ _ \ _ İÇİNDE \ _ \ _ \ _ deyimi kullanma] bakınız : Python'da durumun nasıl olduğu ile nasıl başa çıkılır] (https://stackoverflow.com/q/19043987) Örnekler. –

+0

Üzgünüm, önerilen düzenlemenizi nix yapmak istemediniz, sadece yer tutucu çoğaltma düzeltmesine göz gezdirin. –

+0

Sorun değil. Düzenlemenin yapılması için en az 6 değişiklik (bazı faydasızlar dahil) yapmam gerekiyordu. –

cevap

2

Sen tutucuları oluşturmak için biçimlendirme dizesi kullanabilirsiniz:

statement = "SELECT * FROM table" 
if filterList: 
    statement += " WHERE column IN ({0})".format(
     ', '.join(['%s'] * len(filterList))) 
cursor.execute(statement, filterList) 
: Hala filterList boş olmadığını test etmek ve bu durumda tamamen WHERE maddesini ihmal isteyebilirsiniz

statement = "SELECT * FROM table WHERE column IN ({0})".format(
    ', '.join(['%s'] * len(filterList))) 
cursor.execute(statement, filterList) 

-1

Tam bir karakter dizisi olarak ekleme gibi bir mysql içine ekleyebilmeniz gerekir.

inList = "','".join(str(i) for i in filterList) 
inList = r"'%s'" % inList 
sqlRequest = 'SELECT * FROM table WHERE column IN (%s)' 
sqlResult = cursor.execute(sqlRequest, inList) 
+0

Hayır, çünkü bu * SQL, virgülle ayrılmış dizeyi belirtir. Eğer 'filterList', '[' foo ',' bar ',' baz '] 'ise, artık satırlarınızı' dize' 'foo, bar, baz' değeriyle bir dizgeye eşit olanlarla sınırlandırırsınız. –

+0

Benim hatam, düzenledim, işte bu yüzden işlenmemiş bir dize. –

+0

Hayır, bir ham dizenin ne yaptığını yanlış anlıyorsunuz. Ve * veritabanı bağdaştırıcısı * sql enjeksiyon saldırıları önlemek için 'inList' içinde dize değeri alıntılamak için'% s' yer tutucusunu kullanır ve sqlRequest sorgu planından bağımsız olarak önbelleğe alınabilir. parametre değerleri). Şimdi ikinci bir hatayı farkettim, ikinci argümanı execute() 'bir dizi olmalı; bir dizgiye geçtiniz yani * her bir karakter * artık bir parametre değeri. –