From 39a14bc7e206fbfa93bde1677b9fc26487bd8c3b Mon Sep 17 00:00:00 2001
From: congmu <congmu2024@163.com>
Date: 星期四, 07 十一月 2024 15:03:59 +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