我有一些sql查询通过python mysqldb工作到我的mysql数据库,但是我想让它们少一些sql注入漏洞,所以小的bobby表不会尝试添加数据。 。在python中传递元组到MySQLdb的问题
例如:
ORIGINAL:
(这工作,所以ListID等肯定是有效的)
sql="SELECT NAME FROM ListsTable WHERE ID=%s"%(ListID)
c.execute(sql)
sql="SELECT NAME FROM ListsTable WHERE ID=%s"
c.execute(sql,(ListID,))
WORKS:10元组试图
sql="SELECT NAME FROM ListsTable WHERE ID=%s"
c.execute(sql, ListID)
我不知道为什么第2次尝试不作为一个元组工作,但接受它作为一个参数,但无论哪种另一个说法的方式,我需要传递多个参数,所以这不会为工作:
ORIGINAL:
sql="SELECT * FROM ListsTable ORDER BY ID DESC LIMIT %s,%s"%(Page, (Page*20)+20)
c.execute(sql)
它的工作原理,但随后如果我尝试发送参数作为一个元组这不,又说:
sql="SELECT * FROM ListsTable ORDER BY ID DESC LIMIT %s,%s"
var1=Page
var2=(Page*20)+20
params=(var1,var2)
c.execute(sql,params)
甚至只是
我最近得到这个错误在我的网络服务器日志上,但请注意,这可能是一个重新尝试,因为我一直在尝试的许多不同的东西,因为它以前没有错误:(错误指的是传递“params”变量的上述尝试)
File "process.py", line 98, in main
c.execute(sql,params)
File "/var/www/cgi-bin/MySQLdb/cursors.py", line 159, in execute
query = query % db.literal(args)
TypeError: not enough arguments for format string
编辑:万一它有帮助,我使用mysqldb版本1.2.3,万一它不接受在该版本的元组,但不要让我开始如何垃圾mysqldb文档是..
如果您在前几种情况下提供了比“不起作用”更多的信息,并且显示了您在执行记录的错误时正在执行的操作,将会有很大的帮助。请注意,您可以也应该在Python交互式提示符('>>>')和/或可以在shell命令行运行的非常简单的脚本中尝试解决您的问题 - 避免像web服务器那样的不相关的问题调试简单问题更困难。显示您的数据'print repr(ListID)'。 – 2011-04-27 01:50:21
这一切都在上面的代码正常工作,我不明白为什么这是一个问题,将它从字符串替换到元组参数化,当文档说它只接受元组。我会认为这是一个容易发生的错误,以便发现任何不是我的人。它是读取JSON结构并将其返回给Android手机的CGI脚本的一部分,因此安装本地Apache Web服务器并调整输入以调试可能非常明显的事情可能会适得其反,特别是在实际脚本完成后。此外,当第一批不起作用时,不会出现错误。 – alsandair 2011-04-27 01:55:23
正如我所说,所有的CGI/JSON/Android/apache的东西都与你指称的MySQLdb问题毫无关系。我当然不是在煽动你安装本地apache web服务器,而是像@jsw所做的那样做一些与你的问题有关的实验。 “”“第一批不工作时,没有错误”“”那么“不工作”是什么意思?如果你不能以类似于@jsw的方式重现你的问题,你需要记录(1)你的sql语句(2)参数元组(3)fetchall()结果(在每种情况下使用' repr()'以避免含糊不清)并向我们展示结果。 – 2011-04-27 02:26:49