2012-05-15 2 views
2
c.execute("UPDATE Players SET %s = %d WHERE nick=%s", 
      (parts[1], int(parts[2]), parts[0])) 

дает мне ошибкуПроблемы с выполняют параметры типа в MySQLdb

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

Я знаю execute должен принимать только %s, но parts[2] должен быть приведен к типу INT, becacuse это будет Int (вводится в качестве строка).

Так что, если я ставлю только %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 Поскольку целое. Каково решение этой проблемы?

ответ

10

Я вижу пару проблем.
Может быть и больше.

  1. Вы не можете параметризовать таблицу или имена столбцов. Вы можете, однако, выполнить замену строки, а затем позвонить .execute().
    Если ваша программа вводит пользовательский ввод, вам нужно опасаться возможности атаки SQL-injection.

  2. Всегда используйте %s независимо от типа параметра.
    MySQLdb обрабатывает любые цитаты, которые необходимо выполнить.

Пример:

sql_stmt = "UPDATE Players SET {} = %s WHERE nick=%s;".format(parts[1]) 
c.execute(sql_stmt, (int(parts[2]), parts[0])) 
+0

Благодаря Bernie, подставляя строки, а затем с помощью выполнения сделал трюк. Я знаю, что SQL-инъекция, использование этой части мягкого зарезервировано для админов! – nitrnitr

+0

Приветствия, помощник. Счастливое кодирование. – bernie

 Смежные вопросы

  • Нет связанных вопросов^_^