void do_check_history(user_t user, char name_copy[32], sqlite3* sqlite_p, int event_fd) { char content[128] = { 0 }; char* errmsg = NULL; // 接收错误信息指针 char** result = NULL; // 结果集指针 int row = 0; // 数据表行 int column = 0; // 数据表列 printf("开始查询[%s]的历史记录\n", name_copy); // 查找历史记录,获取结果集 char sql[1024] = { 0 }; sprintf(sql, "select * from %s ", name_copy); int ret = sqlite3_get_table(sqlite_p, sql, &result, &row, &column, &errmsg); if (ret != SQLITE_OK) { printf("历史记录数据表提取信息失败\n"); } printf("历史记录数据表提取信息成功\n"); // 向客户端回显历史记录 int index = column; // 数组下标走到第一行第一个内容 for (int i = 0; i < row; i++) { sprintf(content, "时间[%s] 单词[%s]", result[index], result[index + 1]); if ((send(event_fd, content, sizeof(content), 0)) == -1) printf("send error"); // 发送查询后的结果 // memset(content, 0, sizeof(content)); index += column; } strcpy(content, "OVER"); send(event_fd, content, sizeof(content), 0); // 释放错误指针空间 sqlite3_free(errmsg); // 释放结果集 sqlite3_free_table(result); }代码修正
时间: 2024-02-26 18:57:33 浏览: 47
SQLite3_CCPP.rar_sqlite3_sqlite3 c++_sqlite3使用
修正后的代码如下:
```
void do_check_history(user_t user, char name_copy[32], sqlite3* sqlite_p, int event_fd) {
char content[128] = { 0 };
char* errmsg = NULL; // 接收错误信息指针
char** result = NULL; // 结果集指针
int row = 0; // 数据表行
int column = 0; // 数据表列
// 输入参数有效性校验
if (name_copy == NULL || sqlite_p == NULL) {
printf("输入参数无效\n");
return;
}
printf("开始查询[%s]的历史记录\n", name_copy);
// 查找历史记录,获取结果集
char sql[1024] = { 0 };
snprintf(sql, sizeof(sql), "SELECT * FROM %s ", name_copy);
int ret = sqlite3_get_table(sqlite_p, sql, &result, &row, &column, &errmsg);
if (ret != SQLITE_OK) {
printf("历史记录数据表提取信息失败\n");
sqlite3_free(errmsg);
return;
}
printf("历史记录数据表提取信息成功\n");
// 向客户端回显历史记录
int index = column; // 数组下标走到第一行第一个内容
for (int i = 0; i < row; i++) {
snprintf(content, sizeof(content), "时间[%s] 单词[%s]", result[index], result[index + 1]);
if ((send(event_fd, content, strlen(content), 0)) == -1) {
printf("send error\n");
break;
}
index += column;
}
// 发送查询结束标志
strcpy(content, "OVER");
send(event_fd, content, strlen(content), 0);
// 释放错误指针空间
sqlite3_free(errmsg);
// 释放结果集
sqlite3_free_table(result);
}
```
修正后的代码增加了输入参数有效性校验,使用了更安全的函数snprintf,增加了数据库操作的错误处理和发送操作的错误处理,以及格式化输出。
阅读全文