Brug ikke "strenginjektion" i din SQL undtagen i tilfælde, hvor det virkelig er uundværligt, såsom str(DEPT)
her for at vælge hvilket bord du vælger fra. For hvert andet tilfælde skal du bruge parameteroverførselsfunktionen i Python DB API i stedet -- den vil citere tingene korrekt for dig og automatisk forsvare dig mod "SQL-injektion"-angreb, blandt andet. (Det kan også være hurtigere nogle gange).
Da MySQLdb bruger den uheldige notation %s
for parametre, her er, hvad du skal gøre (også fikse stilen til at være PEP8-kompatibel, ikke påkrævet, men kan ikke skade;-):
conn = MySQLdb.connect(host="localhost", user="user", passwd="pass", db="dbase")
cursor = conn.cursor()
q = 'SELECT * FROM %s WHERE course=%%s AND sec = %%s""" % (DEPT,)
cursor.execute(q, (CLASS, SEC))
%%
s i strengformateringen, som producerer q
blive en enkelt %
hver ved formatering, så q
er tilbage med to forekomster af %s
-- som execute
udfyldes pænt med korrekt formaterede versioner af CLASS
og SEC
. Alle str
opkald er overflødige osv.
Som en sidebemærkning, hvis du er på Python 2.6 eller nyere, til strengformatering bør du bruge det nye format
metode i stedet for den gamle %
operatør -- der sparer dig for behovet for disse "fordoblede %-tegn", blandt andre fordele. Jeg har ikke anvendt den ændring i ovenstående uddrag, bare hvis du sidder fast med 2.5 eller tidligere (så koden ovenfor fungerer i enhver version af Python, i stedet for kun i rimeligt nyere).