Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';这是“什么?”;“最佳”;“创建动态sql的方法”;“在列表中”;Python中字符串数组(或元组)中的子句?_Python_Mysql_Arrays_List - Fatal编程技术网

什么';这是“什么?”;“最佳”;“创建动态sql的方法”;“在列表中”;Python中字符串数组(或元组)中的子句?

什么';这是“什么?”;“最佳”;“创建动态sql的方法”;“在列表中”;Python中字符串数组(或元组)中的子句?,python,mysql,arrays,list,Python,Mysql,Arrays,List,我正在从Python(使用MySQLDb)运行一个动态MySQL查询,其中包括一个包含字符串值的“in list”子句。执行此操作的函数将获取一个值数组。如果有帮助的话,我可以将该数组制作成元组或任何其他类型的集合 插入此列表的“最佳”方式是什么?请记住,需要单引号和逗号等。以下是一种丑陋但安全的手动方法: inList = "" for stringValue in someArray: if inList != "" : inList += "," inList += "'%

我正在从Python(使用MySQLDb)运行一个动态MySQL查询,其中包括一个包含字符串值的“in list”子句。执行此操作的函数将获取一个值数组。如果有帮助的话,我可以将该数组制作成元组或任何其他类型的集合

插入此列表的“最佳”方式是什么?请记住,需要单引号和逗号等。以下是一种丑陋但安全的手动方法:

inList = ""
for stringValue in someArray:
    if inList != "" : inList += ","
    inList += "'%s'" % stringValue
querystr = "SELECT * FROM some_tbl WHERE some_column IN( %s );" % (inList) 
或者,这里有另一个选择。它较短,但依赖于数组到字符串的表示形式在将来保持完全相同:

inList = str(someArray).replace("[", "").replace("]", "")   
querystr = "SELECT * FROM some_tbl WHERE some_column IN( %s );" % (inList) 
编辑


我认为我写这篇文章时,Python术语是错误的。我应该说“列表”而不是“数组”

要使这种动态查询安全,确实没有什么好方法。您应该切换到参数化查询,在这种情况下,解决方案是:

placeholder = '%s'
param_subs = ','.join((placeholder,) * len(param_list))
sql = 'SELECT col1, col2, . . . FROM Table WHERE Column IN ( %s );' % param_subs
cursor.execute(sql, param_list)

(这假设您使用的是MySQL Connector,不幸的是,它使用了
%s
作为占位符。其他Python库倾向于使用
作为占位符。)

这到底是如何安全的?这是一个完全开放的sql注入漏洞。请解释。这难道不意味着有人可以随心所欲地定义数组吗?人们通常如何构建动态SQL语句?这不是构建动态SQL的问题,而是用一种不安全的方式来构建它。“安全”的意思是“可靠的功能”,BTW。嗯,考虑做一个名字列表:<代码> MaleO'BRIN < /Cord>,然后变成<代码>(MaleO'BiRein)< /Cord>中的名称。哎呀。语法错误,查询失败,“完全可靠,老兄”。这看起来是个不错的方法。需要明确的是,“安全”指的是防止坏字符,还是sql注入(正如Mark B所指出的),还是其他什么?我很遗憾在我的问题中使用了“安全”这一术语……我指的是两者,因为两者都来自同一个问题——在编写代码时,我们无法知道未来将作为参数提供的可能的值范围。另外,
itertools.repeat
可以用来代替
(占位符,)*len(…)