我一直收到语法错误:
cur.execute('SELECT * FROM ' + table + ' WHERE Name = "%s";' %(name))
sqlite3.OperationalError:near"%":语法错误
答案 0 :(得分: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.......)