Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.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/1/visual-studio-2012/2.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
Python3 Sqlite3-如何正确转义executescript?_Python_Python 3.x_Sqlite - Fatal编程技术网

Python3 Sqlite3-如何正确转义executescript?

Python3 Sqlite3-如何正确转义executescript?,python,python-3.x,sqlite,Python,Python 3.x,Sqlite,我有这样一个问题: PRAGMA encoding="UTF-8"; INSERT OR IGNORE INTO {0} ({1}) VALUES ({2}); UPDATE {0} SET {1} = "{2}" WHERE {1} = "{3}"; 我使用此查询来插入和更新。但是,正如您所看到的,这是一个多行查询,因此我必须使用executescript函数,这导致我无法使用这样的占位符来避免注入: PRAGMA encoding="UTF-8"; INSERT OR IGNORE INT

我有这样一个问题:

PRAGMA encoding="UTF-8";
INSERT OR IGNORE INTO {0} ({1}) VALUES ({2});
UPDATE {0} SET {1} = "{2}" WHERE {1} = "{3}";
我使用此查询来插入和更新。但是,正如您所看到的,这是一个多行查询,因此我必须使用executescript函数,这导致我无法使用这样的占位符来避免注入:

PRAGMA encoding="UTF-8";
INSERT OR IGNORE INTO {0} ({1}) VALUES (?);
UPDATE {0} SET {1} = "?" WHERE {1} = "?";

那么,有解决办法吗?我是否必须改变我的方法或在不使用占位符的情况下转义它?如果是这样的话,我怎样才能避免注射呢?谢谢。

您可以使用字符串格式

command = """
PRAGMA encoding="UTF-8";
INSERT OR IGNORE INTO {0} ({1}) VALUES (?);
UPDATE {0} SET {1} = {} WHERE {1} = {};
""".format(var1, var2)

把那些废话扔掉。它只有在全新数据库中创建任何表之前使用时才有意义


然后在INSERT和UPDATE语句中,像普通语句一样使用占位符。(不幸的是,没有办法使用占位符来表示表或列名,只有值,因此,如果在编写查询时不知道这些值,则必须使用字符串格式化方法。)

如您所见,我已经格式化了它,只是没有将其传递给format函数。真正的问题不是格式化它,而是避免SQL注入。如果我只是格式化它,用户可能会使用“在他的数据中,这将给出一个错误,并使SQL注入成为可能。几个月前,我试图解决一个关于UTF字符的问题,所以这是一个货物崇拜。感谢您指出,我将从不必要的查询中删除它。不过,我还有两行。这意味着我不能在不分隔行的情况下使用execute。@Belial使用两个单独的准备语句。(你也不想在占位符问号周围加引号。这使它们不是占位符)。这意味着我必须改变很多事情。不过,谢谢。我越看那些插入和更新查询,就越感到困惑。您有INSERT或IGNORE,这意味着您尝试插入的值2用于唯一的列1,并且表可能已经有一行具有该值,但在更新中,您尝试将该列1设置为您刚才尝试插入的相同值2(在1的值当前为3的情况下)。它将始终无法更新,因为将违反唯一约束-可能是因为您刚才添加的新行,或者是因为一个预先存在的行…@Shawn First one在没有重复的情况下插入它。如果有,什么也不做。这对我们两人来说都很清楚。但是,我也使用相同的查询来更新值。因此,使用后者是为了更新查询。我使用它,当忽略发生时它不会失败。@Shawn我在不同的情况下检查了它。它按照我的预期工作,不返回任何错误。你能解释一下为什么你认为这是不必要的吗?