我想知道是否可以用select进行查询,让用户给出表的字段和所需的值。例如:
field=input("Field: ") value=input("Value: ") cursorobject.execute('SELECT id FROM users WHERE {}=\'{}\'') result=cursorobject.fetchall() for x in result: print(x)
如果不可能,有什么办法吗?ps:这个不行
nkoocmlb1#
当然,您可以根据需要使用变量构造查询的文本。例如
query = 'SELECT id FROM users WHERE {}=\'{}\'' print(query.format(field,value))
但是,请记住,在执行查询之前,应该很好地验证变量的内容,以避免sql注入。例如,变量的内容不应包含引号。e、 g.以下代码以及变量的特定值将返回完整的用户列表:
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'
编辑后,应将第3行替换为:
cursorobject.execute('SELECT id FROM users WHERE {}=\'{}\''.format(field,value))
为了尽可能避免sql注入,您应该使用框架的内置查询参数化功能—pymysql:
cursorobject.execute('SELECT id FROM users WHERE {}=%s'.format(field),(value))
gorkyyrv2#
只需格式化字段的查询,并将值作为的第二个参数传递 cursor.execute 必须接收iterable(即tuple/list):
cursor.execute
# PREPARED STATEMENT sql = 'SELECT id FROM users WHERE {} = %s' # EXECUTE QUERY cursorobject.execute(sql.format(field), (value,)) result = cursorobject.fetchall()
2条答案
按热度按时间nkoocmlb1#
当然,您可以根据需要使用变量构造查询的文本。例如
但是,请记住,在执行查询之前,应该很好地验证变量的内容,以避免sql注入。例如,变量的内容不应包含引号。
e、 g.以下代码以及变量的特定值将返回完整的用户列表:
生成的查询将是:
编辑后,应将第3行替换为:
为了尽可能避免sql注入,您应该使用框架的内置查询参数化功能—pymysql:
gorkyyrv2#
只需格式化字段的查询,并将值作为的第二个参数传递
cursor.execute
必须接收iterable(即tuple/list):