好的,我正在創建與遊戲服務器一起使用的函數。該服務器使用插件。我有這些函數,使用sqlite數據庫,以及apsw檢索另一個函數存儲的項目。我有3個問題。3涉及python和sqlite的問題
問題一:我總是收到錯誤「SQLError:near」?「:語法錯誤」由於我的語句具有多重?,因此證明嚴重錯誤,所以錯在哪裏?
問題二:我知道SQL注入,但是這些函數只從腳本的運行者那裏獲得輸入,而他會破壞的唯一東西是他自己的。即便如此,有沒有一種簡單的方法來做這個SQL注入證明?
問題三:有什麼辦法可以讓這個功能更高效嗎?
下面是函數: 編輯:繼承人是什麼樣子現在:
def readdb(self,entry,column,returncolumn = "id,matbefore,matafter,name,date"):
self.memwrite
if isinstance(entry, int) or isinstance(entry, str):
statement = 'SELECT {0} FROM main WHERE {1} IN {2}'.format(returncolumn,column,entry)
self.memcursor.execute(statement)
blockinfo = self.memcursor.fetchall()
return(blockinfo)
if isinstance(entry, tuple) or isinstance(entry, list):
statement = '''SELECT {0} FROM main WHERE {1} IN (%s)'''.format(returncolumn,column)
self.memcursor.execute(statement % ("?," * len(entry))[:-1], entry)
blockinfo = self.memcursor.fetchall()
return(blockinfo
一些更正您對您的代碼:使用'如果isinstance(入門,INT)或isinstance(入境,STR)'。或者至少'如果vartype在[int,str]'中。 '如果vartype == int或str'不會達到你所期望的。還要記住當你不想傳遞任何參數時用'()'調用函數,例如。 'return self.memcursor.fetchall())'。否則,您將返回對該函數的引用,而不是調用它。 – 2010-11-06 19:49:05
另外在Python 2中,最好使用basestring而不是str,因爲basestring是str和unicode的父類。同樣,你可能會傳遞一個long或int,所以尋找兩者。 – 2010-11-20 04:53:46