From 3ed51f1c3194d7a4a1e992fe845e023a488563f3 Mon Sep 17 00:00:00 2001
From: wangky <m1561510467@163.com>
Date: 星期四, 07 十一月 2024 17:34:51 +0800
Subject: [PATCH] 最新

---
 Server/王琨元/code/MysqlConn.cpp |  210 ++++++++++++++++++++++++++++++++++------------------
 1 files changed, 137 insertions(+), 73 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 cf3a431..00003aa 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,115 +1,179 @@
+#include "stdafx.h"
 #include "MysqlConn.h"
-#include <regex>
+
+
+
+// 初始化连接
 // 初始化连接
 MysqlConn::MysqlConn() {
-	mysql_ = mysql_init( mysql_ );
-	// 设置字符集
-	if( mysql_ )   mysql_set_character_set(mysql_ , "gbk");
+    m_mysql = mysql_init(nullptr);
+    if (!m_mysql) {
+        cout << "Failed to initialize MySQL." << endl;
+        return;
+    }
+    // 使用写死的参数连接数据库
+    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_
+    if (m_mysql) mysql_set_character_set(m_mysql, "gbk");
+    m_row = nullptr;
+    m_res = nullptr;
 }
-
-// 连接数据库
-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;
-	}
-	return true;
+bool MysqlConn::isConnected() {
+    return m_mysql != nullptr;
 }
 
 // 释放资源
 MysqlConn::~MysqlConn() {
-	if (mysql_) {
-		mysql_close(mysql_);
-		mysql_ = nullptr;
-	}
-	freeRes();
+    if (m_mysql) {
+        mysql_close(m_mysql);
+        m_mysql = nullptr;
+    }
+    freeRes();
 }
+
 // 更新数据
-bool MysqlConn::update( std::string sql ) {
-	if (!isSqlSafe(sql))
-	{
-		return false;
-	}
-	int ret = mysql_query( mysql_ , sql.c_str());
-	if( ret != 0 ){
-		return false;
-	}
-	return true;
+bool MysqlConn::update(string sql) {
+    // 参数化查询优化后的安全检查
+    MYSQL_STMT* stmt = mysql_stmt_init(m_mysql);
+    if (!stmt) {
+        return false;
+    }
+    if (mysql_stmt_prepare(stmt, sql.c_str(), sql.length())) {
+        mysql_stmt_close(stmt);
+        return false;
+    }
+    int paramCount = mysql_stmt_param_count(stmt);
+    if (paramCount > 0) {
+        mysql_stmt_close(stmt);
+        return false;
+    }
+    if (mysql_stmt_execute(stmt)) {
+        mysql_stmt_close(stmt);
+        return false;
+    }
+    mysql_stmt_close(stmt);
+    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;
+    MYSQL_ROW m_row;
+    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) {
-	freeRes( );
-	if (!isSqlSafe(sql))
-	{
-		return false;
-	}
-	int ret = mysql_query(mysql_, sql.c_str());
-	if (ret != 0)   return false;
-	
-	// 获取查询结果
-	res_ = mysql_store_result(mysql_);
-	if (!res_)   return false;
-	return true;
+bool MysqlConn::query(string sql) {
+    freeRes();
+     //参数化查询优化后的安全检查
+    MYSQL_STMT* stmt = mysql_stmt_init(m_mysql);
+    if (!stmt) {
+        return false;
+    }
+    if (mysql_stmt_prepare(stmt, sql.c_str(), sql.length())) {
+        mysql_stmt_close(stmt);
+        return false;
+    }
+    int paramCount = mysql_stmt_param_count(stmt);
+    if (paramCount > 0) {
+        // 如果有参数,需要进行参数绑定等操作,这里暂不实现
+        mysql_stmt_close(stmt);
+        return false;
+    }
+    if (mysql_stmt_execute(stmt)) {
+        mysql_stmt_close(stmt);
+        return false;
+    }
+    m_res = mysql_stmt_result_metadata(stmt);
+    if (!m_row) {
+        mysql_stmt_close(stmt);
+        return false;
+    }
+    mysql_stmt_close(stmt);
+    return true;
 }
 
 // 得到结果集
 bool MysqlConn::getResult() {
-	if (res_) {
-		row_ = mysql_fetch_row(res_);
-		if(row_)  return true;
-	}
-	return false;
+    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("");
-	
-	char* value = row_[index];
-	unsigned long  len = mysql_fetch_lengths(res_)[index];
-	return  std::string(value, len);
+string MysqlConn::getField(int index) {
+    int cols = mysql_num_fields(m_res);
+    if (!m_res || index >= cols || index < 0) return string("");
+
+    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();
+void MysqlConn::refreshActiveTime() {
+    m_activeTime = chrono::steady_clock::now();
 }
 
-long long MysqlConn::getActiveTime()
-{
-	 // 纳米
-	 std::chrono::nanoseconds  nased =  std::chrono::steady_clock::now() - activeTime_;
-	 // 转换成毫米
-	 std::chrono::microseconds millsed = std::chrono::duration_cast<std::chrono::microseconds>( nased );
-	 return millsed.count( );   // 多少毫秒
+long long MysqlConn::getActiveTime() {
+    // 纳米
+    chrono::nanoseconds nased = chrono::steady_clock::now() - m_activeTime;
+    // 转换成毫米
+    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