2016-10-27 67 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()在每次迭代中返回一个空元组。我已经验证了表Doctors不是空的,并且当'条件'是硬编码时,代码工作正常。该代码应该打印每个专业的医生详细信息。谁能告诉我为什么会发生这种情况?Django传递参数时MySQL查询输出错误

回答

0

对我来说,你打电话给cur.execute(bodyloc_specialty_query,data1)时,并没有正确地将你的data1转换成bodyloc_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) 

在专业特长: 条件=条件+ “ '% ”+特长+“ %'” + “或专业像”