2015-10-16 68 views

回答

3

你不給table名稱
用途:

table = "class%s" %(class_name) 

,而不是:

table = "class%s" 

,並且在更新表時不指定result,因爲它是字符串,請改用score
我想重申一次有關字符串格式的評論中所說的內容,請使用?格式,而你已經部分做到了。

編輯有關您不瞭解字符串格式的註釋。
這是字符串格式化:

cur.execute('UPDATE ' + table + ' WHERE Surname = "%s", WHERE Name = "%s", SET Score = "%s";'% (last_name, name, score)) 

並且這是優選的方法,你都已經部分使用:

cur.execute('INSERT INTO ' + table + ' (Surname, Name, Score) VALUES (?, ?, ?)', (last_name, name, score)) 

作爲此Fallenangel指出使用字符串格式化是開放的SQL注入和是因此它皺起了眉頭,因爲它是一個安全漏洞。這種情況下的問題是表不能成爲參數替換的目標,所以你有兩難的困境。您可以使用硬編碼的表名編寫代碼,或者如果這不是您需要至少測試有效表名稱的選項
如果您發現自己有此問題,可以使用sqlite3測試有效的table問題。

table = "sometable" 
mycursor.execute('SELECT name FROM sqlite_master where (name = ?)', [table]) 
row = mycursor.fetchall() 
valid_table = False 
if row: 
    valid_table = True 
if valid_table: 
    (perform your sql statements here.......) 
+0

解決了這個問題,但現在新的問題的歡呼 –

+0

cur.execute('SELECT * from {0} WHERE Name = {1};'.format(table,name)) sqlite3.OperationalError:no such column: Bob –

+0

Bob是名稱的值 –