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