From 96e93f6a525896ece8dc35ff4a3c3f02fffd577a Mon Sep 17 00:00:00 2001 From: Administrator <3174665893@qq.com> Date: 星期四, 07 十一月 2024 15:05:06 +0800 Subject: [PATCH] Merge branch 'master' of ssh://115.28.86.8:29418/~admin/昆仑_1025 --- Server/王琨元/code/MysqlConn.cpp | 133 ++++++++++++++++++++++++++++++-------------- 1 files changed, 91 insertions(+), 42 deletions(-) diff --git "a/Server/\347\216\213\347\220\250\345\205\203/code/MysqlConn.cpp" "b/Server/\347\216\213\347\220\250\345\205\203/code/MysqlConn.cpp" index 5725af8..071cf5f 100644 --- "a/Server/\347\216\213\347\220\250\345\205\203/code/MysqlConn.cpp" +++ "b/Server/\347\216\213\347\220\250\345\205\203/code/MysqlConn.cpp" @@ -1,37 +1,60 @@ #include "stdafx.h" #include "MysqlConn.h" -#include <regex> + // 初始化连接 +// 初始化连接 MysqlConn::MysqlConn() { - mysql_ = mysql_init(mysql_); - // 设置字符集 - if (mysql_) mysql_set_character_set(mysql_, "gbk"); -} - -// 连接数据库 -bool MysqlConn::connect(std::string ip, std::string userName, std::string passwd, std::string db, int port) { - mysql_ = mysql_real_connect(mysql_, ip.c_str(), userName.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0); - if (!mysql_) { - return false; + m_mysql = mysql_init(nullptr); + if (!m_mysql) { + cout << "Failed to initialize MySQL." << endl; + return; } - return true; + // 设置字符集 + if (m_mysql) mysql_set_character_set(m_mysql, "gbk"); + // 使用写死的参数连接数据库 + m_mysql = mysql_real_connect(m_mysql, "127.0.0.1", "root", "123456", "mayi_kunlun", 3306, nullptr, 0); + if (!m_mysql) { + cout << "MysqlConn connect to mysql is failed!" << endl; + // 确保在连接失败时正确清理资源 + mysql_close(m_mysql); + m_mysql = nullptr; + } + // 初始化 row_ 和 res_ + m_row = nullptr; + m_res = nullptr; } +bool MysqlConn::isConnected() { + return m_mysql != nullptr; +} +// 连接数据库 +//bool MysqlConn::connect() { +// string ip = "127.0.0.1"; +// string userName = "root"; +// string passwd = "123456"; +// string db = "mayi_kunlun"; +// int port = 3306; +// m_mysql = mysql_real_connect(mysql_, ip.c_str(), userName.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0); +// if (!m_mysql) { +// return false; +// } +// return true; +//} // 释放资源 MysqlConn::~MysqlConn() { - if (mysql_) { - mysql_close(mysql_); - mysql_ = nullptr; + if (m_mysql) { + mysql_close(m_mysql); + m_mysql = nullptr; } freeRes(); } // 更新数据 -bool MysqlConn::update(std::string sql) { +bool MysqlConn::update(string sql) { // 参数化查询优化后的安全检查 - MYSQL_STMT* stmt = mysql_stmt_init(mysql_); + MYSQL_STMT* stmt = mysql_stmt_init(m_mysql); if (!stmt) { return false; } @@ -53,11 +76,36 @@ return true; } +bool MysqlConn::query(string sql, vector<vector<string>>& result) +{ + freeRes(); + int ret = mysql_query(m_mysql, sql.c_str()); + if (ret != 0) { + fprintf(stderr, "Query failed: %s\n", mysql_error(m_mysql)); + return false; + } + // 获取查询结果 + m_res = mysql_store_result(m_mysql); + if (!m_res) return false; + //将结果集转到二维数组result里面 + //int col_cnt = m_mysql->field_count; + int col_cnt = mysql_field_count(m_mysql); + cout << col_cnt << endl; + while (m_row = mysql_fetch_row(m_res)) { + vector<string> tmp; + for (int i = 0; i < col_cnt; i++) { + tmp.push_back(m_row[i]); + } + result.push_back(tmp); + } + return true; +} + // 查询数据库 -bool MysqlConn::query(std::string sql) { +bool MysqlConn::query(string sql) { freeRes(); // 参数化查询优化后的安全检查 - MYSQL_STMT* stmt = mysql_stmt_init(mysql_); + MYSQL_STMT* stmt = mysql_stmt_init(m_mysql); if (!stmt) { return false; } @@ -75,8 +123,8 @@ mysql_stmt_close(stmt); return false; } - res_ = mysql_stmt_result_metadata(stmt); - if (!res_) { + m_res = mysql_stmt_result_metadata(stmt); + if (!m_row) { mysql_stmt_close(stmt); return false; } @@ -86,59 +134,60 @@ // 得到结果集 bool MysqlConn::getResult() { - if (res_) { - row_ = mysql_fetch_row(res_); - if (row_) return true; + if (m_row) { + m_row = mysql_fetch_row(m_res); + if (m_row) return true; } return false; } // 获取结果集的字段 -std::string MysqlConn::getField(int index) { - int cols = mysql_num_fields(res_); - if (index >= cols || index < 0) return std::string(""); +string MysqlConn::getField(int index) { + int cols = mysql_num_fields(m_res); + if (!m_res || index >= cols || index < 0) return string(""); - char* value = row_[index]; - unsigned long len = mysql_fetch_lengths(res_)[index]; - return std::string(value, len); + char* value = m_row[index]; + // 使用显式类型转换 + unsigned long len = static_cast<unsigned long>(mysql_fetch_lengths(m_res)[index]); + return string(value, len); } // 事务操作 bool MysqlConn::transaction() { - return mysql_autocommit(mysql_, false); + return mysql_autocommit(m_mysql, false); } // 提交事务 bool MysqlConn::commit() { - return mysql_commit(mysql_); + return mysql_commit(m_mysql); } // 事务回滚 bool MysqlConn::rollback() { - return mysql_rollback(mysql_); + return mysql_rollback(m_mysql); } void MysqlConn::refreshActiveTime() { - activeTime_ = std::chrono::steady_clock::now(); + m_activeTime = chrono::steady_clock::now(); } long long MysqlConn::getActiveTime() { // 纳米 - std::chrono::nanoseconds nased = std::chrono::steady_clock::now() - activeTime_; + chrono::nanoseconds nased = chrono::steady_clock::now() - m_activeTime; // 转换成毫米 - std::chrono::microseconds millsed = std::chrono::duration_cast<std::chrono::microseconds>(nased); + chrono::microseconds millsed = chrono::duration_cast<chrono::microseconds>(nased); return millsed.count(); // 多少毫秒 } // 安全校验实现,这里简单使用正则表达式判断是否包含危险字符 -bool MysqlConn::isSqlSafe(const std::string& sql) { - std::regex dangerousPattern(".*(['\";\\-+=]).*"); - return!std::regex_search(sql, dangerousPattern); +bool MysqlConn::isSqlSafe(const string& sql) { + regex dangerousPattern(".*(['\";\\-+=]).*"); + return!regex_search(sql, dangerousPattern); } void MysqlConn::freeRes() { - if (res_) { - mysql_free_result(res_); - res_ = nullptr; + if (m_res) { + mysql_free_result(m_res); + m_res = nullptr; } } \ No newline at end of file -- Gitblit v1.8.0