2009-09-11 9 views
2
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] 

le code ci-dessus donne cette erreur:python mysql requête chercher

self.dbc.execute("select * from car where reg='%s' " %(reg) 
TypeError: unsupported operand type(s) for %: 'long' and 'str' 

quelqu'un peut-il s'il vous plaît me aider à comprendre pourquoi je reçois cette erreur?

FYI: reg est une entrée raw_input var i entrée par l'utilisateur dans la fonction getitem et passe la reg var en argument à cette fonction.

Répondre

3

Je pense que cette ligne a tout simplement les parens au mauvais endroit:

self.dbc.execute("select * from car where reg='%s'") %(reg) 

Vous utilisez% sur le résultat de l'exécution(), et reg.

Modifier à:

self.dbc.execute("select * from car where reg='%s'" % reg) 

ou

self.dbc.execute("select * from car where reg='%s'", reg) 

selon que l'on fera la substitution PARAM pour vous.

+0

cela ne suffit un peu. mais il ne récupère pas les données de la base de données? est-ce que quelque chose d'autre est faux aussi? – amit

+3

probablement lié à l'obtention du rowcount avant l'exécution de la requête? – ChristopheD

2

Vous avez obtenu les supports mal:

self.dbc.execute("select * from car where reg=%s" , (reg,)) 

Une raison particulière que vous Looping en utilisant fetchOne (dans cette boucle laide avec une gamme basée sur un nombre de lignes qui sera probablement zéro que vous l'obtenez avant d'exécuter la question)?

Il suffit de faire

for car_info in self.dbc.fetchall(): 
    .... 
3

Cela confond à peu près tout le monde qui travaille avec mysqldb. Vous passez des arguments à la fonction d'exécution, sans effectuer de substitution de chaîne python. Le% s de la chaîne de requête est plus utilisé comme une instruction préparée qu'une substitution de chaîne python. Cela empêche également l'injection SQL car MySQLDB fera l'échappement pour vous. Comme vous l'avez déjà fait (en utilisant% et la substitution de chaînes), vous êtes vulnérable à l'injection.

  1. N'utilisez pas de guillemets. MySQLDB les mettra là (si nécessaire).
  2. Utilisez un, au lieu de%. Encore une fois, vous passez un tuple en tant qu'argument à la fonction d'exécution.

    self.dbc.execute ("select * from voiture où reg =% s", (reg,))