我正在尝试创建一个程序,用户可以在其中输入运算符,即<>或=,然后输入pymysql中的数据库编号。我尝试了多种不同的方法来完成此操作,但不幸的是未成功。我有两个显示为一个的文档,并将显示导入到另一个文档中。
文档1
def get_pop(op, pop):
if (not conn):
connect();
query = "SELECT * FROM city WHERE Population %s %s"
with conn:
cursor = conn.cursor()
cursor.execute(query, (op, pop))
x = cursor.fetchall()
return x
文档二
def city():
op = input("Enter < > or =: ")
population = input("Enter population: ")
pop = display.get_pop(op, population)
for p in pop:
print(pop)
我遇到以下错误。
pymysql.err.ProgrammingError:(1064,......
请帮助谢谢
答案 0 :(得分:1)
在检查op
确实包含“ <>”或“ =”并且pop
确实包含数字之后,您可以尝试以下方法:
query = "SELECT * FROM city WHERE Population " + op + " %s";
提防SQL注入。
然后
cursor.execute(query, (pop))
答案 1 :(得分:1)
您不能这样做。参数化仅适用于值,不适用于运算符或表名或列名。您需要将运算符格式化为字符串。不要将%s
占位符与Python字符串格式混淆; MySQL很尴尬,因为它使用%s来绑定参数,这与常规的Python字符串格式冲突。
查询字符串中的MySQL %s
会转义用户输入,以防止SQL注入。在这种情况下,我设置了一个基本测试,以查看用户提交的操作部分是否在可接受的操作列表中。
def get_pop(op, pop):
query = "SELECT * FROM city WHERE Population {} %s" # Add a placeholder for format
with conn: # Where does this come from?
cursor = conn.cursor()
if op in ['=', '!=']:
cursor.execute(query.format(op), (pop,))
x = cursor.fetchall()
return x
在return
不是if op in ['=', '!=']
的情况下,您将想出一些合理的True
值,但这完全取决于您希望它如何表现。