我正在尝试创建一个API,允许用户使用用户输入在MySQL表中搜索。
例如,用户输入是' PA',它将在表格中搜索以' PA'开头的股票。
在此之前,我已经测试了以' P'开头的搜索,并且它可以正常工作。但是,如果我更改sg='P'
并且curs.execute("SELECT * FROM KLSE WHERE Stock LIKE '%s'"%sg+'%')
无法以P和return 'Error: unable to fetch items'
from flask import Flask,jsonify,abort,make_response,request,render_template
import MySQLdb
import MySQLdb.cursors
def KLSEstock(Stock):
db = MySQLdb.connect(host='xxx.mysql.pythonanywhere-services.com',user='vin',passwd='xxx',db='vinudb$default',cursorclass=MySQLdb.cursors.DictCursor)
curs = db.cursor()
sg ='P%'
try:
curs.execute("SELECT * FROM KLSE WHERE Stock LIKE '%s'"%sg)
c = curs.fetchall()
except Exception:
return 'Error: unable to fetch items'
#return "hihi"
return jsonify({'Stock': c})
问题是curs.execute("SELECT * FROM KLSE WHERE Stock LIKE '%s'"%sg)
,sg ='P%'
与curs.execute("SELECT * FROM KLSE WHERE Stock LIKE '%s'"%sg+'%')
进行比较,而sg ='P'
是相同的,但为什么前者能够从数据库查询但后者不能查询?
答案 0 :(得分:0)
您在逻辑中出错,因为这两个语句会产生不同的查询。
对于第一个版本:
sg = 'PA%'
curs.execute("SELECT * FROM KLSE WHERE Stock LIKE '%s'" % sg)
# -- will execute
# SELECT * FROM KLSE WHERE Stock LIKE 'PA%'
对于第二个版本
sg = 'PA'
curs.execute("SELECT * FROM KLSE WHERE Stock LIKE '%s'"%sg+'%')
# -- will execute --
# SELECT * FROM KLSE WHERE Stock LIKE 'PA'%
# note that the % is outside of the quotes!
您可以通过检查字符串来观察此行为:
sg = 'PA'
st = "SELECT * FROM KLSE WHERE Stock LIKE '%s'"%sg+'%'
print st
因为%
的优先级高于+
。为了获得您想要的行为,您可以在使用execute之前更改格式字符串或附加%
。其中任何一个都可行:
sg = 'PA'
# use %% to insert a % into the format string
curs.execute("select * from klse where stock like '%s%%'" % sg)
# force precedence of `+` over `%` using parentheses
curs.execute("select * from klse where stock like '%s'" % (sg + '%',))
# append the `%` before you call `execute`
sg += '%'
curs.execute("select * from klse where stock like '%s'" % sg)
在任何情况下,如果sg来自用户输入,请100%确定它是否已被转义,否则您将自行处理SQL注入攻击。有很多好的库(包括Flask!)help you out with this。
确保在构建SQL语句时使用问号,如中所述 上面的例子。否则,您的应用将容易受到SQL攻击 使用字符串格式化来构建SQL语句时注入。看到 将SQLite 3与Flask结合使用。