smart-green-house-server-an.../cgi-bin/sqlite_cgi_base.c

144 lines
4.5 KiB
C

#include <cjson/cJSON.h>
#include <stdio.h>
#include "includes/sqlite3.h" // sqlite3 的头文件
#include <stdlib.h>
// cJSON *result_json; // 用于存储查询结果
char login_user_name[32] = "";
int sql_search_callback_result_number = 0; // 用于存储查询结果的条数(默认为0)
// sqlite3的回调函数
// sqlite 每查到一条记录,就调用一次这个回调
int sql_search_callback(void *NotUsed, int argc, char **argv, char **azColName);
int main(int argc, char const *argv[])
{
// result_json = cJSON_CreateObject(); // 创建 JSON 对象
// 连接到 SQLite 数据库
sqlite3 *db; // 声明 sqlite3 类型变量,即声明一个数据库对象
char *zErrMsg = 0; // 用于存储错误信息
int rc; // 用于存储函数返回值
rc = sqlite3_open(
"../sql_base/green_house.db",
&db); // 打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
if (rc)
{
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
fprintf(stderr, "ok Opened database successfully\n");
// 获取前端传递的 JSON 数据
char request_data[128] = "";
fgets(request_data, 128, stdin); // 从标准输入中读取一行数据
// 解析 JSON 数据
cJSON *json_buf = cJSON_Parse(request_data); // 解析 JSON 数据
if (json_buf == NULL)
{
fprintf(stderr, "Error parsing JSON data\n");
sqlite3_close(db);
return 1;
}
// 获取用户名和密码
cJSON *user = cJSON_GetObjectItemCaseSensitive(json_buf, "name");
cJSON *password = cJSON_GetObjectItemCaseSensitive(json_buf, "password");
if (user == NULL || password == NULL || !cJSON_IsString(user) ||
!cJSON_IsString(password))
{ // 是否是非法输入
fprintf(stderr,
"Error getting username and/or password from JSON data\n");
cJSON_Delete(json_buf);
sqlite3_close(db);
return 1;
}
// 拿到用户名和密码
char *username_from_frontend = user->valuestring;
char *password_from_frontend = password->valuestring;
sprintf(login_user_name, "%s", username_from_frontend);
printf("username is %s, pwd is %s\n", username_from_frontend,
password_from_frontend);
// 构建查询语句
char query_sql[128] = "";
sprintf(query_sql,
"select * from login_users where username='%s' and password='%s';",
username_from_frontend, password_from_frontend); // 构建查询语句
printf("query_sql is %s\n", query_sql);
// 执行查询语句
// rc = sqlite3_exec(db, query_sql, 0, 0, &zErrMsg); // 执行查询语句
rc = sqlite3_exec(db, query_sql, sql_search_callback, 0, &zErrMsg); // 执行查询语句
if (rc != SQLITE_OK)
{
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
cJSON_Delete(json_buf);
sqlite3_close(db);
return 1;
}
// 检查查询结果是否为0
if (sql_search_callback_result_number == 0)
{
cJSON *result_json = cJSON_CreateObject();
cJSON_AddNumberToObject(result_json, "code", 1);
cJSON_AddStringToObject(result_json, "msg", "用户名或密码错误");
char *result_json_string = cJSON_Print(result_json);
// 输出 JSON 结果
printf("content-type: application/json;charset=utf-8\r\n");
printf("\r\n");
printf("%s\n", result_json_string);
free(result_json_string);
cJSON_Delete(json_buf);
sqlite3_close(db);
return 1;
}
sql_search_callback_result_number = 0; // 重置为0
// 释放资源
cJSON_Delete(json_buf);
sqlite3_close(db);
return 0;
}
int sql_search_callback(void *NotUsed,
int argc,
char **argv,
char **azColName)
{
// int i;
// for (i = 0; i < argc; i++)
// {
// printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
// }
cJSON *result_json = cJSON_CreateObject();
sql_search_callback_result_number++;
cJSON_AddNumberToObject(result_json, "code", 0);
cJSON_AddStringToObject(result_json, "login_user_name", login_user_name);
char *result_json_string = cJSON_Print(result_json);
// 输出 JSON 结果
printf("content-type: application/json;charset=utf-8\r\n");
printf("\r\n");
printf("%s\n", result_json_string);
free(result_json_string);
return SQLITE_OK;
}