【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;
}

浙公网安备 33010602011771号