Уведомления

Группа в Telegram: @pythonsu

#1 Март 24, 2020 06:29:59

tmpnikl
Зарегистрирован: 2020-03-24
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Экранирование символов

Здравствуйте
Python 3.8.2, windows 10
Как можно обновить бд MySQL, если в переменной спецсимволы, т.е.
с такой переменной обновляется
data1=“11111”
cursor.execute(f“UPDATE `s` SET `p`={data1} WHERE `id`=6”)
а вот с такой переменной выходит ошибка
data1='<span style=“font-size: 16px;”><strong><b> и т.д.'
PS: в PHP есть функция mysql_real_escape_string(), но в python(е), не могу найти подобную

Офлайн

#2 Март 24, 2020 06:49:26

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

Экранирование символов

 data1='<span style=“font-size: 16px;”><strong><b> и т.д.'
cursor.execute("UPDATE `s` SET `p`=%s WHERE `id`=6", (data1,))

В документации к модулю pcycopg2 (библиотека доступа к БД Postgresql) есть такое место:

Warning
Never, never, NEVER use Python string concatenation (+) or string parameters interpolation (%) to pass variables to a SQL query string. Not even at gunpoint.
Гугл переводит это так:
Предупреждение
Никогда, никогда, НИКОГДА не используйте конкатенацию строк Python (+) или интерполяцию строковых параметров (%) для передачи переменных в строку запроса SQL. Даже под дулом пистолета.

Это писали ещё до появления f-строк в Питоне, но к ним это тоже относится.



Отредактировано Striver (Март 24, 2020 06:52:41)

Офлайн

#3 Март 24, 2020 07:28:37

tmpnikl
Зарегистрирован: 2020-03-24
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Экранирование символов

Спасибо за ответ, правда непонятно, где у меня конкатенация строки(+нигде нет), подставил вместо {} знак %, но это не решило проблему, наверное я не всё указал, у меня библиотека import pymysql.cursors

Офлайн

#4 Март 24, 2020 10:33:20

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

Экранирование символов

но это не решило проблему, наверное я не всё указал, у меня библиотека import pymysql.cursors
Неважно, какая у тебя библиотека, все библиотеки доступа к СУБД в Питоне действуют максимально похожим образом. Ты просто вообще не понял, что я тебе написал. Нельзя подставлять данные из переменных в SQL-строку. Их нужно отдельно применять внутри команды cursor.execute вторым параметром в виде кортежа из переменных.

Вот пример из документации к твоей библиотеке pymysql.cursors:
 with connection.cursor() as cursor:
        # Create a new record
        sql = "INSERT INTO `users` (`email`, `password`) VALUES (%s, %s)"
        cursor.execute(sql, ('webmaster@python.org', 'very-secret'))

Здесь значения ‘webmaster@python.org’ и ‘very-secret’ в SQL не вставляют, их отдельно добавляют при вызове cursor.execute.



Отредактировано Striver (Март 24, 2020 10:33:53)

Офлайн

#5 Март 24, 2020 11:40:23

tmpnikl
Зарегистрирован: 2020-03-24
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Экранирование символов

Большое спасибо за помощь, Вы мне очень помогли, правда остался маленький вопросик, почему две переменные начинаются на букву s((%s, %s))?

Офлайн

#6 Март 24, 2020 12:32:35

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

Экранирование символов

почему две переменные начинаются на букву s((%s, %s))?
Как я понимаю, это про строковый тип.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version