我有一张名为鞋子的表格names
和prices
。
此代码可以工作并查询两行:
c.execute("SELECT * FROM shoes WHERE name LIKE '%nike tiempo%' AND sizes LIKE '%11.5%' ORDER BY price")
c.fetchall()
[('http://www.final-score.com/product/model:252604/sku:19215108/nike-tiempo-genio-ii-leather-ic-mens/white/orange/', "Nike Tiempo Genio II Leather IC - Men's", 31.99, '06.0, 11.5, 12.0', ''), ('http://store.nike.com/us/en_us/pd/tiempo-legend-vi-mens-firm-ground-soccer-cleat/pid-11155502/pgid-11917874', 'Nike Tiempo Legend VI FG', 169.97, 'M 6 / W 7.5, M 6.5 / W 8, M 7 / W 8.5, M 7.5 / W 9, M 8 / W 9.5, M 8.5 / W 10, M 9 / W 10.5, M 9.5 / W 11, M 10 / W 11.5, M 10.5 / W 12, M 11 / W 12.5, M 11.5 / W 13, M 12 / W 13.5, M 12.5 / W 14, M 13 / W 14.5, M 14 / W 15.5', "Men's Firm-Ground Soccer Cleat")]
但是当我做同样的事情但是使用'?'占位符:
>>> c.execute("SELECT * FROM shoes WHERE name LIKE '%?%' AND sizes LIKE '%?%' ORDER BY price", ('nike tiempo','11.5'))
我收到了这个错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 0, and there are 2 supplied.
任何人都知道我在这里缺少什么?提前谢谢。
答案 0 :(得分:1)
不是100%肯定SQLite,但通常是那些&#34;占位符&#34;被称为参数,你想以不同的方式使用它们:
c.execute("SELECT * FROM shoes WHERE name LIKE ? AND sizes LIKE ? ORDER BY price", ('%nike tiempo%','%11.5%'))
参数中提供的值不会使用replace方法注入到sql字符串中 - 否则你可以使用... string replace。关键是根据目标数据类型对值进行格式化和相应准备。
这种方法最重要的是值也被适当地转义。这是什么意思?这意味着没有人会通过注入转义字符并运行自己的sql语句来破坏你的SQL字符串 - 因此得名:SQL Injection