Python Flask:搜索MySQL以字母开头

时间:2017-01-03 14:38:18

标签: python mysql

我正在尝试创建一个API,允许用户使用用户输入在MySQL表中搜索。

例如,用户输入是' PA',它将在表格中搜索以' PA'开头的股票。

在此之前,我已经测试了以' P'开头的搜索,并且它可以正常工作。但是,如果我更改sg='P'并且curs.execute("SELECT * FROM KLSE WHERE Stock LIKE '%s'"%sg+'%')无法以P和return 'Error: unable to fetch items'

开始获取Stock
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'是相同的,但为什么前者能够从数据库查询但后者不能查询?

1 个答案:

答案 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结合使用。