3
c.execute("UPDATE Players SET %s = %d WHERE nick=%s",
          (parts[1], int(parts[2]), parts[0]))

私にエラーを与えています

TypeError: %d format: a number is required, not str

のみをexecute取る必要があることはわかっていますが、int(文字列として入力)になるため、intにキャストする必要があります。%sparts[2]

したがって、 のみを入力%sすると、もちろん次のエラーが発生します。

mysql_exceptions.ProgrammingError: (1064,
"You have an error in your SQL syntax; "
"check the manual that corresponds to your MySQL server version "
"for the right syntax to use near "
"''wins' = '450' WHERE nick='xan'' at line 1")

winsは整数だからです。これに対する解決策は何ですか?

4

1 に答える 1

10

いくつかの問題があります。
もっとあるかもしれません。

  1. テーブル名や列名をパラメーター化することはできません。ただし、文字列置換を行ってから を呼び出すことはできます.execute()プログラムがユーザー入力を受け取る場合、 SQL インジェクション攻撃
    の可能性に注意する必要があります。

  2. %sパラメータの型に関係なく常に使用します。
    MySQLdb は、実行する必要があるすべての引用を処理します。

例:

sql_stmt = "UPDATE Players SET {} = %s WHERE nick=%s;".format(parts[1])
c.execute(sql_stmt, (int(parts[2]), parts[0]))
于 2012-05-15T04:25:56.840 に答える