2016-10-27 16 views
0
cur=connection.cursor() 

def fillDoctors(key_bodyloc,proportion): 
    bodyloc_specialty_query="select distinct Speciality from body_speciality where body_location in (%s) " 
    #cur.execute(bodyloc_specialty_query) 
    data1=([key_bodyloc]) 
    #print(bodyloc_specialty_query,data) 
    cur.execute(bodyloc_specialty_query,data1) 
    results=cur.fetchall() 
    specialities=[x[0] for x in results] 
    condition="" 
    for speciality in specialities: 
     print(str(speciality)) 
     condition=condition+"'%"+speciality+"%'"+" or Speciality like " 
    #print(speciality) 
    #print(condition) 
    specialty_doctors_query="select DoctorName,Speciality,ClinicName from Doctors where Speciality like %s limit %s" 
    data2=([condition,proportion]) 
    print(specialty_doctors_query,data2) 
    cur.execute(specialty_doctors_query,data2) 

    final=cur.fetchall() 
    print(final) 

各反復における空のタプルを返すfinal=cur.fetchall()ラインを通過しています。私は、テーブルの医師が空ではないことを確認し、コードは '条件'がハードコードされているときに正常に動作します。コードは各専門分野の医師の詳細を印刷することになっています。誰がなぜこれが起こっているのか教えてもらえますか?ジャンゴMySQLのクエリ出力誤差パラメータ

答えて

0

cur.execute(bodyloc_specialty_query,data1)を呼び出すときにdata1bodyloc_specialty_queryに正しく渡していないと思われ、問題の原因となります。

Pythonで文字列注射の構文は以下の通りです:

str1 = "some string %s" % "other string" 

代わりの文字列に文字列を追加するこの方法で、ニシキヘビformat組み込み関数を使用します。

str1 = "some string {str2}".format(str2="other_string"). 

しかし、確認してくださいstr2は文字列か文字列に変換可能です。

data1listで、strではありません。最初にstrに変換する必要があります。がんばろう。

+0

は文字通り '%'と 'format'、それを間に違いはありませんSQLインジェクションからのセキュリティになります。 –

+0

編集されました。私はそれを研究する必要があると思うと思う。 –

+0

line results = cur.fetchall()はうまく動作し、期待される結果を返します。問題は 'specialty_doctors_query'が私の知っていることですが、私は何を理解することができません。 –

0

executeメソッドのパラメータを渡す全体のポイントは、エスケープされるということです。したがって、条件はSQLによって結合された一連のパラメータではなく、単一の文字列として扱われます。また、LIMIT値にはパラメータを使用できません。

補間によっていくつかのSQLとプレースホルダを構築し、値を渡すだけです。専門分野での専門のため

like = "speciality LIKE %%%s%%" 
condition = like + (" OR {}".format(like)) * len(specialities) 
query = "select DoctorName,Speciality,ClinicName from Doctors where {} LIMIT {}".format(condition, proportion) 
cursor.execute(query, specialities) 

: " "+ "または専門のような" +専門+% '' %"" 条件=条件+は