@fodiche

Почему присылает профиля всех хотя указанно where user_id?

Проблема заключается в том что user_id это айди пользователя в беседе вк, в коде я написал что выборка идет только по user_id айди ползователя который написал сообщение в беседе и есть в базе данных. но почему то когда кто то пишет профиль бот скидывает профиля всех пользователей в БД. помогите пожалуйста
if msg == "/профиль":  ///msg это метод отпраавки сообщение бота
					db = sqlite3.connect('server3.db')
					db.row_factory = sqlite3.Row
					cursor = db.cursor()
					for result in cursor.execute(f"SELECT money, biz, profitbiz, profitkaz, losemoneykaz, moneykaz FROM users WHERE {user_id}"):
						sender(id, f"Полный профиль @id{user_id}({fullname})\n\nБаланс:{result['money']}\n\nВыигранно в казино:{result['profitkaz']}\nПроигранно в казино:{result['losemoneykaz']}\nВсего потрачено в казино:{result['moneykaz']}\n\nБизнесы:{result['biz']}\nЕжедневный доход с бизнесов:{result['profitbiz']}")
					db.commit()
  • Вопрос задан
  • 83 просмотра
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
1. Потому что условие "WHERE {user_id}" будет истинным для любых ненулевых user_id. Тебе нужно условие WHERE id = {user_id} (предполагая, что колонка с id пользователя называется id).
2. С поправкой на то, что это тебе на самом деле не нужно. НИКОГДА не создавай запросы через подстановку значения в строку, слишком легко ошибиться или поймать sql-инъекцию. Перепиши запрос на использование prepared statements.
cursor.execute("SELECT money, biz, profitbiz, profitkaz, losemoneykaz, moneykaz FROM users WHERE id = ?", (user_id, ))
Вместо каждого ? в запросе будет подставлен элемент из кортежа параметров. При этом движок сам позаботится о правильном экранировании.
3. Переподключаться к БД каждый раз при вызове команды - плохая идея. Создай подключение при запуске бота и используй его. Максимум - создавай новый cursor для вызова команды.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы