2017-01-03 57 views
0

我想創建一個API,允許用戶在用戶輸入的MySQL表中搜索。Python燒瓶:搜索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

您在邏輯中發生錯誤,因爲這兩個語句會產生不同的查詢。

對於第一個版本:

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注入攻擊 。有關更多信息,請參閱 使用帶有Flask的SQLite 3。

+0

@我只使用GET,是否安全? – vindex

+0

沒有。仍然必須逃避'sg'。否則有人可以輸入''; drop table klse; - ''讓它放下你的桌子。 – 2ps

+0

'curs.execute(「select * from klse where stock like'%s'%''%sg)''當我cahnge到'curs.execute(」select * from klse where stock like'%s %%'', sg)',它不起作用。任何想法? – vindex