Как правильно сравнить идентификатор пользователя из базы данных с переменной?

Здравствуйте! У меня возникла проблема с кодом для проверки ID пользователя. У меня есть переменная, содержащая ID пользователя, и я пытаюсь выполнить проверку с помощью оператора if. Однако, когда я обращаюсь к базе данных, возникает ошибка, которую я не могу понять. Я прикреплю код и скриншот базы данных ниже. 

Я хочу, чтобы если ID пользователя не совпадает с ID из базы данных, программа не завершалась с ошибкой, а просто выводила "Error" в консоли. Прошу вашей помощи! 

Код: 
<pre><code class="python">import sqlite3

admiss = 4545454446

def check_adm():
    databaseFile = ("data.db")
    db = sqlite3.connect(databaseFile, check_same_thread=False)
    cursor = db.cursor()
    print(f"d{admiss}")
    cursor.execute(f'''SELECT * FROM admin WHERE auser_id={admiss}''')
    if cursor.fetchone() is None:
        return False
    else:
        return True

def main():
    print("Выполняется проверка системы...")
    if check_adm != admiss:
        print(F"{check_adm}")
        print(f"{admiss}")
        print("Error")
        quit()

if __name__ == '__main__':
    main()</code></pre> 
Скрин кода: 
  • 5 ноября 2024 г. 17:22
Ответы на вопрос 2
В вашем коде есть несколько ошибок и недочетов, которые нужно исправить, чтобы обеспечить корректную работу проверки идентификатора пользователя. Вот основные задачи, которые нужно выполнить:

1. **Вызывать функцию `check_adm` правильно**. В вашем коде вы сравниваете `check_adm` как функцию с переменной `admiss`, что неправильно. Вам следует вызывать функцию и сохранять результат.

2. **Использовать параметризованные запросы для предотвращения SQL-инъекций**. Вместо того чтобы форматировать строку запроса непосредственно, лучше использовать параметры, чтобы избежать уязвимостей.

3. **Исправить условие в `main()`**. Убедитесь, что вы проверяете возвращаемое значение функции `check_adm`.

Вот исправленный код:

```python
import sqlite3

admiss = 4545454446

def check_adm():
    databaseFile = "data.db"
    db = sqlite3.connect(databaseFile, check_same_thread=False)
    cursor = db.cursor()
    print(f"d {admiss}")

    # Используем параметризованный запрос
    cursor.execute('SELECT * FROM admin WHERE auser_id = ?', (admiss,))
    
    # Проверяем результат
    if cursor.fetchone() is None:
        return False
    else:
        return True

def main():
    print("Выполняется проверка системы...")
    if not check_adm():  # Здесь вызываем функцию и проверяем ее результат
        print("Error")
        quit()
    else:
        print("Проверка прошла успешно.")

if __name__ == '__main__':
    main()
```

### Что изменилось:
1. **Параметризованный запрос**: Теперь запрос к базе данных выглядит так: `cursor.execute('SELECT * FROM admin WHERE auser_id = ?', (admiss,))`. Это предотвратит SQL-инъекции.
2. **Проверка результата**: В `main()` теперь используется `if not check_adm()`, что обеспечит корректное сравнение.
3. **Код стал более читаемым**.

Попробуйте запустить этот исправленный код и проверьте, исчезли ли проблемы.
check_adm vs check_adm(), это не считая что дальше тоже всё плохо 
сначала решаем более простые задачи, только потом пишем ботов
Похожие вопросы