2013-09-27 52 views
2

我試圖在我的web應用程序上安裝搜索功能有問題。問題出在下面的代碼。我試過下面的兩個查詢,但蟒蛇給我一個錯誤,我將在下面列出:Python字符格式與mySQL原始數據庫查詢給我的問題

def searchBox(user_id, searchparams): 

try: 
    cursor = connection.cursor() 

    if cursor: 
     sql = "SELECT * FROM db_email WHERE user_id = %d AND deleted = 0 AND subject LIKE '%%%s%%';" 
     cursor.execute(sql % (user_id, searchparams) 

我也試過:

try: 
    cursor = connection.cursor() 

    if cursor: 
     sql = "SELECT * FROM db_email WHERE user_id = %d AND deleted = 0 AND subject LIKE " + "'%" + searchparams + "%';" 
     cursor.execute(sql % (user_id)) 

兩個返回此錯誤對我來說:

TypeError: not enough arguments for format string 

這是我遇到過的唯一的原始查詢,它與我需要調用LIKE的方式有關。我可以編寫一個存儲過程來繞過python,但我覺得我在做一些愚蠢的事情,忽略了一個問題。任何幫助,將不勝感激


謝謝。我認爲問題的一部分是我的LIKE查詢我需要我的searchparams與百分號包圍及以下的答案不工作,像這樣 - 它上面好像出來的代碼

subject LIKE '%somestringimlookingfor%' 

'測試'%''。有任何想法嗎?

回答

3

不要對SQL查詢使用字符串插值,它是完全不安全的。

相反,使用查詢參數:

sql = """SELECT 
      * 
     FROM 
      db_email 
     WHERE 
      user_id = %s AND 
      deleted = 0 AND 
      subject LIKE '%%%s%%'""" 
cursor.execute(sql, (user_id, searchparams)) 

百分號應與%逃脫。

UPD:

稍有不同的選項:

sql = """SELECT 
      * 
     FROM 
      db_email 
     WHERE 
      user_id = %s AND 
      deleted = 0 AND 
      subject LIKE %s""" 
cursor.execute(sql, (user_id, "%" + searchparams + "%")) 

參見:

+0

謝謝。 我認爲問題的一部分是我的LIKE查詢我需要我的searchparams與百分號像這樣被封閉 - 主題LIKE「%somestringimlookingfor%」 與上面的代碼,它似乎就跳出來「測試'%」。有任何想法嗎? – Dalbrecht

+0

@Dalbrecht請參閱答案中的UPD部分。請讓我知道這對你有沒有用。 – alecxe

+0

工作,謝謝你會檢查答案! – Dalbrecht