【发布时间】:2011-04-27 00:42:16
【问题描述】:
我有一些 sql 查询可以通过 python mysqldb 工作到我的 mysql 数据库,但我想让它们少一点 sql-injection 漏洞,所以小 bobby 表不会尝试添加数据。..
例如:
原文:
(这行得通,所以 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,))
作品:
sql="SELECT NAME FROM ListsTable WHERE ID=%s"
c.execute(sql, ListID)
我不知道为什么第二次尝试不能作为元组工作,而是将其作为单个参数接受,但是对于另一个语句,我需要传递多个参数,所以这不起作用:
原文:
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)
甚至只是
sql="SELECT * FROM ListsTable ORDER BY ID DESC LIMIT %s,%s"
c.execute(sql,(Page,(Page*20)+20))
我最近在我的网络服务器日志上遇到了这个错误,但请注意,由于我一直在尝试许多不同的事情,因为它以前没有出错:(该错误是指上述尝试传递“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). -
在上面的代码中一切正常,当文档说它只接受元组时,我不明白为什么将它从字符串替换移动到元组参数化是一个问题。我会认为对于不是我的任何人来说,这都是一个容易发现的错误。它是读取 JSON 结构并将其返回到 Android 手机的 CGI 脚本的一部分,因此安装本地 apache 网络服务器并调整输入只是为了调试可能非常明显的内容可能会适得其反,尤其是作为实际脚本但为此完成。此外,当第一批不工作时,没有错误。
-
正如我所说,所有这些 CGI/JSON/Android/apache 内容都与您所谓的 MySQLdb 问题无关。我当然不是鼓励您安装本地 apache 网络服务器,而是像 @jsw 所做的那样做一些与您的问题相关的实验。 """当第一批不工作时,没有错误""" 那么“不工作”到底是什么意思?如果您无法以类似于@jsw 的方式重现您的问题,您需要记录 (1) 您的 sql 语句 (2) 参数元组 (3) fetchall() 结果(在每种情况下使用 @ 987654330@ 以避免歧义)并向我们展示结果。
-
嗨,是的,我明白你的意思(对不起,我没有粗鲁,我很感谢你的时间!),我只是想我必须安装一个本地 MySQL 服务器或其他东西正确测试它?我绝对可以这样做,我只是做了一个(也许是错误的)假设,即问题是我所做的简单的事情,不需要大量调查。参数、数据库、sql 查询等都可以正常工作,唯一不同的是作为元组的参数(即使作为单个参数也可以,但不能作为单元素元组)
标签: python tuples mysql-python