def dispcar ( self, reg ):
print ("The car information for '%s' is: "), (reg)
numrows = int(self.dbc.rowcount) #get the count of total rows
self.dbc.execute("select * from car where reg='%s'") %(reg)
for x in range(0, numrows):
car_info = self.dbc.fetchone()
print row[0], "-->", row[1]
上面的代码给出了这个错误:
self.dbc.execute("select * from car where reg='%s' " %(reg)
TypeError: unsupported operand type(s) for %: 'long' and 'str'
任何人都可以帮助我理解为什么我会收到此错误?
FYI:reg是函数getitem中来自用户的raw_input var i输入,并将reg var作为参数传递给此函数。
答案 0 :(得分:3)
我认为这条线只是在错误的地方:
self.dbc.execute("select * from car where reg='%s'") %(reg)
您对execute()和reg。
的结果使用%将其更改为:
self.dbc.execute("select * from car where reg='%s'" % reg)
或
self.dbc.execute("select * from car where reg='%s'", reg)
取决于它是否会为您进行param替换。
答案 1 :(得分:3)
这使得与MySQLDB一起工作的每个人都感到困惑。您正在将参数传递给execute函数,而不是执行python字符串替换。查询字符串中的%s更像是预处理语句而不是python字符串替换。这也可以防止SQL注入,因为MySQLDB将为您进行转义。如前所述(使用%和字符串替换),您很容易注入。
使用a而不是%。同样,您将一个元组作为参数传递给execute函数。
self.dbc.execute(“select * from car where reg =%s”,(reg,))
答案 2 :(得分:2)
你的括号错了:
self.dbc.execute("select * from car where reg=%s" , (reg,))
使用fetchone进行循环的任何特殊原因(在这个丑陋的循环中,基于行数的范围在执行查询之前可能为零)?
只做
for car_info in self.dbc.fetchall():
....