2017-09-07 9 views
4

フラスコとパッケージフラスコ-mysqlでウェブサイトを作成するときに奇妙なバグがあります。私はこのページに4つの変数を投稿するFlask-Mysql型のエラーでデータを更新するとき

@app.route('/calendar/editeventtitle',methods=['POST']) 
def editeventtitle(): 
    if not session.get('logged_in'): 
     abort(401) 

    try: 
     id = request.form.get('id',type=int) 
     title = request.form['title'] 
     color = request.form['color'] 
     delete = request.form.get('delete') 
    except: 
     pass 

    conn = mysql.connect() 
    cursor = conn.cursor() 
    print(id,type(id)) 
    # try: 
    # print(delete,type(delete)) 
    # except: 
    # pass 

    if id and delete: 
     cursor.execute('delete from events where id = %d',id) 
     conn.commit() 
     flash('Event canceled!') 
     return redirect(url_for('calendar')) 
    elif id and title and color: 
     cursor.execute('update events set title = %s, color = %s where id = %d',(title,color,id)) 
     conn.commit() 
     flash('Event updated!') 
     return redirect(url_for('calendar')) 

:ここ

はバグ関数のコードです。私はうまくそれらを得る。

6 <class 'int'> 

我々はそれが本当に整数だ参照が、コードを更新したり、DBからデータを削除するために開始したときに、ここではエラーメッセージです::そしてprint(id,type(id))の結果は次のようである

TypeError: %d format: a number is required, not str

本当にドン理由を知っていない= - =誰も私を助けることができますか?ありがとうございました。

PS:Python3.6.1、フラスコ0.12.2は、フラスコ-MySQLは1.4.0

答えて

3

あなたはこのように実行するSQLクエリ内のすべてのパラメータの%sを使用する必要があります。理由はflask-mysql(またはそれが依存するMySQL Pythonライブラリであれば)文字列補間を行う前に文字列に渡すパラメータtitle, color, idを変換するからです。

これは、クエリで使用したパラメータが、整数、SQL識別子などの予想される型の実際に合理的なパラメータであり、クエリを壊す可能性のあるSQLコードではないこともチェックするためです。 (これは、データベースへの不正アクセスを取得するために使用され、SQLインジェクションと呼ばれます)。それぞれの値に対して型を検査し、型をSQL表現に変換する方法を決定します。

これは、パラメータtitlecolorを一重引用符で囲む必要がないためです。 SQLライブラリーはパラメーターを文字列として識別し、引用符を追加した後、それらの文字列に含まれる単一引用符もエスケープします。また、ここにdatetimeのようなPythonオブジェクトを渡すこともできます。オブジェクトは、対応するSQL型のリテラル表現に正しく変換されます。

関連する問題