2011-11-09 53 views
0

我得到了地址簿和人名。 我用下面的代碼來執行名稱列搜索:在SQLite數據庫中進行高級搜索

register = [] 
text = "{0}%" .format(self.lineEdit_6.text()) 
c.execute("select id, name from contacts where nome like '{0}'" .format(text)) 
for row in c: 
    register.append(row) 
    self.listWidget_4.addItem(str(row[1])) 
    self.listWidget_6.addItem(str(row[0])) 
if register == []: 
    self.listWidget_4.addItem("No result") 

名稱字段的名字和姓氏(如,約翰·史密斯) 的代碼時,我不記得上面的正常工作完整的名字,但只是起始字母。 但我希望結果顯示所有的匹配,不僅在名稱的開頭。因此,如果我有三個名字(Simonne Welsh,Adam Loyd,John Smith)和一個字母S,它必須給出名稱Simone Welsh和John Smith的結果。 我該怎麼做?

回答

1

這樣做:

text = "%{0}%" .format(self.lineEdit_6.text()) 
    c.execute("select id, name from contacts where nome like '{0}'" .format(text)) 

(包括通配符之前匹配字符串以及之後)。

另外,請考慮使用(注:糾正了這個語法):

c.execute("select id, name from contacts where nome like ?", [text]) 

c.execute("select id, name from contacts where nome like ?", (text,)) 

將:

  1. 使您的代碼從SQL安全注射攻擊。

  2. 正確處理text包含特殊字符的情況,如單引號(例如,名稱爲O'Reilly)。

+0

令人難以置信!我感到很蠢,以前我沒有看到它。 –

+0

當我使用你提出的代碼時,會引發:sqlite3.ProgrammingError:提供的綁定數量不正確。當前語句使用1,並提供3個。 –

+0

嘗試打印「文本」,看看你得到什麼。這個錯誤告訴你,你的SQL只包含一個參數('?'字符),但是'(test)'被解釋爲具有三個單獨值的東西。此外,嘗試沒有parens或在方括號(作爲列表),而不是作爲元組的文本。作爲元組,它可能會解析字符。 –