【问题标题】:sqlite: near syntax error "%" [duplicate]sqlite:语法错误“%”附近[重复]
【发布时间】:2016-01-14 22:32:58
【问题描述】:

我不断收到语法错误:

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

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

【问题讨论】:

  • 不使用字符串格式正在创建 Sql 查询!它对 Sql Injection 开放。

标签: python sqlite


【解决方案1】:

你没有给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.......)

【讨论】:

  • 欢呼解决了这个问题,但现在出现了一个新问题
  • cur.execute('SELECT * from {0} WHERE Name = {1} ;'.format(table, name)) sqlite3.OperationalError: no such column: Bob
  • Bob 是 name 的值
  • 不要使用字符串格式来创建 Sql 查询!它对 Sql Injection 开放。
  • 1.该代码甚至不在您的问题中。 2. 你没有给表一个主键
猜你喜欢
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多