pymysql SELECT查询,其中包含用户提供的表字段

时间:2018-07-18 12:37:29

标签: python mysql database python-3.x pymysql

我想知道是否可以通过用户的select进行查询,并提供表的字段和所需的值。例如:

field=input("Field: ")
value=input("Value: ")
cursorobject.execute('SELECT id FROM users WHERE {}=\'{}\'')
result=cursorobject.fetchall()
for x in result:
     print(x)

如果不可能的话,有什么办法吗?

PS:这不起作用

2 个答案:

答案 0 :(得分:1)

当然,您可以根据需要使用变量来构造查询的文本。例如

query = 'SELECT id FROM users WHERE {}=\'{}\''
print(query.format(field,value))

但是,请记住,在执行查询之前,您应该很好地验证变量的内容,以避免SQL injections。例如,变量的内容不应包含引号。

例如以下代码(包含变量的具体值)将返回完整的用户列表:

field='name'
value='name\' or \'1\'=\'1'
query = 'SELECT id FROM users WHERE {}=\'{}\''
print(query.format(field,value))

产生的查询为:

SELECT id FROM users WHERE name='name' or '1'='1'

编辑后,应将第三行替换为:

cursorobject.execute('SELECT id FROM users WHERE {}=\'{}\''.format(field,value))

为了最大程度地避免sql注入,您应该使用框架的内置查询参数化功能-pymysql:

cursorobject.execute('SELECT id FROM users WHERE {}=%s'.format(field),(value))

答案 1 :(得分:1)

简单格式化 field 的查询,并将 value 作为参数传递给cursor.execute的第二个参数,该参数必须接收可迭代的(即元组/列表) :

# PREPARED STATEMENT
sql = 'SELECT id FROM users WHERE {} = %s'

# EXECUTE QUERY
cursorobject.execute(sql.format(field), (value,))

result = cursorobject.fetchall()