我想知道是否可以通过用户的select进行查询,并提供表的字段和所需的值。例如:
field=input("Field: ")
value=input("Value: ")
cursorobject.execute('SELECT id FROM users WHERE {}=\'{}\'')
result=cursorobject.fetchall()
for x in result:
print(x)
如果不可能的话,有什么办法吗?
PS:这不起作用
答案 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()