【cpp】使用 sqlite3 实现注册、登录

【cpp】使用 sqlite3 实现注册、登录

sqlite

主页:
https://www.sqlite.org/index.html

下载页:
https://www.sqlite.org/download.html

sqlite-amalgamation-xxx 是单文件版本,所有代码集成到一个文件,方便使用

#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <sqlite3.h>
#include <string>

// 数据库文件名
const char* DATABASE_NAME = "login.db";

// 初始化数据库,创建用户表
int initialize_database()
{
    sqlite3* db;
    int rc = sqlite3_open(DATABASE_NAME, &db); // 打开或创建数据库
    if (rc) {
        std::cerr << "Can't open database: " << sqlite3_errmsg(db) << std::endl;
        return rc;
    }

    const char* create_table_sql = "CREATE TABLE IF NOT EXISTS users ("
                                   "username TEXT PRIMARY KEY NOT NULL, "
                                   "password TEXT NOT NULL);";
    char* err_msg = nullptr;

    rc = sqlite3_exec(db, create_table_sql, nullptr, nullptr, &err_msg);
    if (rc != SQLITE_OK) {
        std::cerr << "SQL error: " << err_msg << std::endl;
        sqlite3_free(err_msg);
        sqlite3_close(db);
        return rc;
    }

    std::cout << "Database initialized successfully." << std::endl;
    sqlite3_close(db);
    return 0;
}

// 注册新用户
int register_user(const std::string& username, const std::string& password)
{
    sqlite3* db;
    int rc = sqlite3_open(DATABASE_NAME, &db);
    if (rc) {
        std::cerr << "Can't open database: " << sqlite3_errmsg(db) << std::endl;
        return rc;
    }

    std::string sql = "INSERT INTO users (username, password) VALUES ('" + username + "', '" + password + "');";
    char* err_msg = nullptr;

    rc = sqlite3_exec(db, sql.c_str(), nullptr, nullptr, &err_msg);
    if (rc != SQLITE_OK) {
        std::cerr << "SQL error: " << err_msg << std::endl;
        sqlite3_free(err_msg);
        sqlite3_close(db);
        return rc;
    }

    std::cout << "User registered successfully." << std::endl;
    sqlite3_close(db);
    return 0;
}

// 登录验证
int login(const std::string& username, const std::string& password)
{
    sqlite3* db;
    int rc = sqlite3_open(DATABASE_NAME, &db);
    if (rc) {
        std::cerr << "Can't open database: " << sqlite3_errmsg(db) << std::endl;
        return rc;
    }

    std::string sql = "SELECT password FROM users WHERE username='" + username + "';";
    sqlite3_stmt* stmt;
    rc = sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, nullptr);
    if (rc != SQLITE_OK) {
        std::cerr << "Failed to prepare SQL statement: " << sqlite3_errmsg(db) << std::endl;
        sqlite3_close(db);
        return rc;
    }

    if (sqlite3_step(stmt) == SQLITE_ROW) {
        const char* stored_password = reinterpret_cast<const char*>(sqlite3_column_text(stmt, 0));
        if (stored_password && stored_password == password) {
            std::cout << "Login successful." << std::endl;
        } else {
            std::cout << "Invalid password." << std::endl;
        }
    } else {
        std::cout << "User not found." << std::endl;
    }

    sqlite3_finalize(stmt);
    sqlite3_close(db);
    return 0;
}

int main()
{
    // 初始化数据库
    if (initialize_database() != 0) {
        std::cerr << "Failed to initialize database." << std::endl;
        return 1;
    }

    int choice;
    std::string username, password;

    while (true) {
        std::cout << "1. Register\n2. Login\n3. Exit\nEnter your choice: ";
        std::cin >> choice;

        if (choice == 1) { // 注册
            std::cout << "Enter username: ";
            std::cin >> username;
            std::cout << "Enter password: ";
            std::cin >> password;

            if (register_user(username, password) == 0) {
                std::cout << "Registration successful.\n";
            } else {
                std::cout << "Registration failed.\n";
            }
        } else if (choice == 2) { // 登录
            std::cout << "Enter username: ";
            std::cin >> username;
            std::cout << "Enter password: ";
            std::cin >> password;

            login(username, password);
        } else if (choice == 3) { // 退出
            break;
        } else {
            std::cout << "Invalid choice.\n";
        }
    }

    return 0;
}
posted @ 2025-03-11 13:51  ReRound  阅读(50)  评论(0)    收藏  举报