sqlite:接近语法错误"%"

时间:2015-10-16 08:37:46

标签: python sqlite

我一直收到语法错误:

cur.execute('SELECT * FROM ' + table + ' WHERE Name = "%s";' %(name))
  

sqlite3.OperationalError:near"%":语法错误

1 个答案:

答案 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.......)