【发布时间】:2016-01-14 22:32:58
【问题描述】:
我不断收到语法错误:
cur.execute('SELECT * FROM ' + table + ' WHERE Name = "%s";' %(name))
sqlite3.OperationalError: near "%": 语法错误
【问题讨论】:
-
不使用字符串格式正在创建 Sql 查询!它对 Sql Injection 开放。
我不断收到语法错误:
cur.execute('SELECT * FROM ' + table + ' WHERE Name = "%s";' %(name))
sqlite3.OperationalError: near "%": 语法错误
【问题讨论】:
你没有给table一个名字
使用:
table = "class%s" %(class_name)
代替:
table = "class%s"
更新表时不要指定result,因为那是一个字符串,而是使用score。
我想重申其中一个 cmets 中关于字符串格式的说法,请使用 ?相反,您已经部分地这样做了。
编辑您关于不了解字符串格式的评论。
这是字符串格式:
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.......)
【讨论】: