Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.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/5/sql/82.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
Python SQL代码执行不正确_Python_Sql_Sqlite_Cursor - Fatal编程技术网

Python SQL代码执行不正确

Python SQL代码执行不正确,python,sql,sqlite,cursor,Python,Sql,Sqlite,Cursor,我有一段代码: sql1 = "SELECT * FROM CustomerTable WHERE " + variable.get() + " = " + Queryby.get() print(sql1) 当我运行此代码时,打印输出: SELECT * FROM CustomerTable WHERE Title = Mr 这表明代码在执行时应该工作。但是,当我将print(sql1)更改为cursor.execute(sql1)时,它会输出以下错误消息: sqlite3.Operati

我有一段代码:

sql1 = "SELECT * FROM CustomerTable WHERE " + variable.get() + " = " + Queryby.get()
print(sql1)
当我运行此代码时,
打印
输出:

SELECT * FROM CustomerTable WHERE Title = Mr
这表明代码在执行时应该工作。但是,当我将
print(sql1)
更改为
cursor.execute(sql1)
时,它会输出以下错误消息:

sqlite3.OperationalError: no such column: Mr

这对我来说真的很困惑,因为
Mr
的位置表明它是正在搜索的内容,而不是列的名称。有什么建议吗?

您需要将
Mr
用一个单引号括起来,如so
'Mr'
。这样,SQL将其识别为字符串而不是列

基本上,您的产品线应该是:

sql1 = "SELECT * FROM CustomerTable WHERE " + variable.get() + " = '" + Queryby.get() + "'"
如果您希望避免所有加号,也可以采用不同的格式,如:

sql1 = "SELECT * FROM CustomerTable WHERE {} = '{}'".format(variable.get(), Queryby.get())

请记住,如果输入是从外部提供的,那么自己格式化字符串可能会导致SQL注入攻击。请参阅有关使用

格式的说明。您需要使用一个单撇号将
Mr
包装起来,如so
'Mr'
。这样,SQL将其识别为字符串而不是列

基本上,您的产品线应该是:

sql1 = "SELECT * FROM CustomerTable WHERE " + variable.get() + " = '" + Queryby.get() + "'"
如果您希望避免所有加号,也可以采用不同的格式,如:

sql1 = "SELECT * FROM CustomerTable WHERE {} = '{}'".format(variable.get(), Queryby.get())
请记住,如果输入是从外部提供的,那么自己格式化字符串可能会导致SQL注入攻击。请参阅有关格式的说明,其中包含

在“Mr”周围添加引号。比如:

在“先生”周围加上引号。比如:


像这样动态地构造查询会在最终执行时使您面临注入攻击。相反,请使用参数化查询:

# This is a little extreme...
sql1 = "SELECT * FROM CustomerTable WHERE ? = ?"
cursor.execute(sql1, (variable.get(), Queryby.get()))

这将免除您确保正确引用动态元素的工作。

这样动态构造查询,在最终执行时会导致注入攻击。相反,请使用参数化查询:

# This is a little extreme...
sql1 = "SELECT * FROM CustomerTable WHERE ? = ?"
cursor.execute(sql1, (variable.get(), Queryby.get()))

这将免除您确保正确引用动态元素的工作。

可能是因为您提倡的代码容易受到SQL注入攻击。我对原始代码进行了尽可能小的更改以使其正常工作。我真的不会称之为“倡导”。。。另外,如果投票人对我鼓吹不安全的编码做法如此关注,那么他/她可能会费心评论这一点,让其他人知道(也可能让我修改甚至删除我的答案)…可能是因为您提倡的代码容易受到SQL注入攻击。我对原始代码进行了尽可能小的更改以使其正常工作。我真的不会称之为“倡导”。。。另外,如果投票人对我鼓吹不安全的编码做法如此关注,那么他/她可能会费心评论这一点,让其他人知道(也可能让我修改甚至删除我的答案)。。。