企业网站一般做哪些栏目创意建设机械网站
2026/4/18 13:40:38 网站建设 项目流程
企业网站一般做哪些栏目,创意建设机械网站,网页制作教程的应用领域,网页版微信二维码扫描SQLite3 C 编程学习文件概览本笔记包含四个SQLite3 C语言程序#xff0c;涵盖数据库基本操作、数据导入、查询和参数化查询等核心功能。一、sqli.c - 数据库连接与简单插入完整代码#include sqlite3.h #include stdio.hint main(int argc, char** argv) {sqli…SQLite3 C 编程学习文件概览本笔记包含四个SQLite3 C语言程序涵盖数据库基本操作、数据导入、查询和参数化查询等核心功能。一、sqli.c - 数据库连接与简单插入完整代码#include sqlite3.h #include stdio.h int main(int argc, char** argv) { sqlite3* db NULL; int ret sqlite3_open(123.db, db); if (ret ! SQLITE_OK) { fprintf(stderr, sqlite3_open %s\n, sqlite3_errmsg(db)); sqlite3_close(db); return 1; } char* errmsg NULL; char sql_cmd[512] insert into user values(6,lvbu,31);; ret sqlite3_exec(db, sql_cmd, NULL, NULL, errmsg); if (ret ! SQLITE_OK) { fprintf(stderr, sqlite3_exec %s\n, errmsg); sqlite3_free(errmsg); sqlite3_close(db); return 1; } sqlite3_close(db); return 0; }详细解释头文件包含sqlite3.h: SQLite数据库操作头文件stdio.h: 标准输入输出头文件数据库连接sqlite3* db NULL; // 数据库句柄指针 int ret sqlite3_open(123.db, db); // 打开数据库文件sqlite3_open(): 打开或创建数据库文件返回值SQLITE_OK表示成功其他值为错误代码错误处理使用sqlite3_errmsg()获取错误信息SQL语句执行char sql_cmd[512] insert into user values(6,lvbu,31);; ret sqlite3_exec(db, sql_cmd, NULL, NULL, errmsg);sqlite3_exec(): 执行SQL语句的通用函数参数说明db: 数据库连接sql_cmd: 要执行的SQL语句第3个参数回调函数此处为NULL第4个参数回调函数参数此处为NULLerrmsg: 错误信息指针资源清理sqlite3_free(errmsg): 释放错误信息内存sqlite3_close(db): 关闭数据库连接二、sql_dict.c - 从文件导入数据到数据库完整代码#include sqlite3.h #include stdio.h #include string.h int main(int argc, char** argv) { // drop table // create table // insert sqlite3* db NULL; int ret sqlite3_open(123.db, db); if (ret ! SQLITE_OK) { fprintf(stderr, sqlite3_open %s\n, sqlite3_errmsg(db)); sqlite3_close(db); return 1; } char* errmsg NULL; char sql_cmd[512] {0}; strcpy(sql_cmd, drop table dict;); sqlite3_exec(db, sql_cmd, NULL, NULL, errmsg); bzero(sql_cmd, sizeof(sql_cmd)); strcpy(sql_cmd, create table dict(id int,word char, mean text);); sqlite3_exec(db, sql_cmd, NULL, NULL, errmsg); FILE* fp fopen(/home/linux/dict.txt, r); if (NULL fp) { perror(fopen); return 1; } int i 1; while (1) { char buf[1024]{0}; if(NULL fgets(buf,sizeof(buf),fp)) { break; } char *word strtok(buf, ); char* meanstrtok(NULL,\r); bzero(sql_cmd,sizeof(sql_cmd)); sprintf( sql_cmd,insert into dict values(%d,\%s\,\%s\);,i,word,mean); ret sqlite3_exec(db, sql_cmd, NULL, NULL, errmsg); if (ret ! SQLITE_OK) { fprintf(stderr, sqlite3_exec %s , sql_cmd:%s\n, errmsg,sql_cmd); sqlite3_free(errmsg); sqlite3_close(db); return 1; } } sqlite3_close(db); fclose(fp); return 0; }详细解释表格管理// 删除已存在的表 strcpy(sql_cmd, drop table dict;); sqlite3_exec(db, sql_cmd, NULL, NULL, errmsg); // 创建新表 bzero(sql_cmd, sizeof(sql_cmd)); strcpy(sql_cmd, create table dict(id int,word char, mean text););表结构id(整数)、word(字符)、mean(文本)文件读取与数据解析FILE* fp fopen(/home/linux/dict.txt, r); while (1) { fgets(buf, sizeof(buf), fp); // 逐行读取文件 char *word strtok(buf, ); // 用空格分隔单词和释义 char* mean strtok(NULL, \r); // 用回车符结束 }动态SQL语句构建sprintf(sql_cmd, insert into dict values(%d,\%s\,\%s\);, i, word, mean);注意存在SQL注入风险后续会讨论批量插入循环读取文件内容并逐条插入数据库三、sql_select.c - 数据库查询与结果显示完整代码#include sqlite3.h #include stdio.h // show 函数会调用多次。 次数取决于结果集有几条记录。 //有几条记录show就调用几次。每次result指向不同结果(记录)。 int show(void* arg, int col, char** result, char** title) { static int flag 0; int i 0; if (0 flag) { flag 1; for (i 0; i col; i) { printf(%s\t\t, title[i]); } printf(\n); } for (i 0; i col; i) { printf(%s\t\t, result[i]); } printf(\n); return 0; } int main(int argc, char** argv) { sqlite3* db NULL; int ret sqlite3_open(123.db, db); if (ret ! SQLITE_OK) { fprintf(stderr, sqlite3_open %s\n, sqlite3_errmsg(db)); sqlite3_close(db); return 1; } char* errmsg NULL; char sql_cmd[512] select * from user ;; ret sqlite3_exec(db, sql_cmd, show, NULL, errmsg); if (ret ! SQLITE_OK) { fprintf(stderr, sqlite3_exec %s\n, errmsg); sqlite3_free(errmsg); sqlite3_close(db); return 1; } sqlite3_close(db); return 0; }详细解释回调函数机制int show(void* arg, int col, char** result, char** title)arg: 用户传递的参数此处未使用col: 结果集的列数result: 当前行的数据数组title: 列名数组静态变量使用static int flag 0;静态变量只在第一次调用时初始化为0用于确保列标题只打印一次查询执行ret sqlite3_exec(db, sql_cmd, show, NULL, errmsg);第三个参数show查询结果的回调函数第四个参数NULL传递给回调函数的参数结果显示格式先打印列标题然后逐行打印数据使用制表符对齐四、sql_arg.c - 带参数的数据库查询存在SQL注入漏洞完整代码#include sqlite3.h #include stdio.h #include string.h // show 函数会调用多次。 次数取决于结果集有几条记录。 //有几条记录show就调用几次。每次result指向不同结果(记录)。 int show(void* arg, int col, char** result, char** title) { *(int*)arg 1; return 0; } int main(int argc, char** argv) { char name[50]{0}; char pass[50]{0}; printf(input name:); fgets(name,sizeof(name),stdin); printf(input pass:); fgets(pass,sizeof(pass),stdin); name[strlen(name)-1]\0; pass[strlen(pass)-1]\0; sqlite3* db NULL; int ret sqlite3_open(123.db, db); if (ret ! SQLITE_OK) { fprintf(stderr, sqlite3_open %s\n, sqlite3_errmsg(db)); sqlite3_close(db); return 1; } char* errmsg NULL; int flag 0; char sql_cmd[512] {0}; sprintf( sql_cmd,select * from user where name like %s and age %s;,name,pass); ret sqlite3_exec(db, sql_cmd, show, flag, errmsg); if (ret ! SQLITE_OK) { fprintf(stderr, sqlite3_exec %s\n, errmsg); sqlite3_free(errmsg); sqlite3_close(db); return 1; } if(0 flag) { printf(nott find person %s \n,name); } else { printf(name pass correct \n); } sqlite3_close(db); return 0; }详细解释用户输入处理fgets(name, sizeof(name), stdin); // 安全读取输入 name[strlen(name)-1] \0; // 移除换行符回调函数设计int show(void* arg, int col, char** result, char** title) { *(int*)arg 1; // 通过参数修改标志位 return 0; }当查询到结果时将flag设置为1利用参数指针在回调函数中修改主函数变量SQL注入漏洞sprintf(sql_cmd, select * from user where name like %s and age %s;, name, pass);高危漏洞直接拼接用户输入到SQL语句攻击示例用户名输入admin --密码随意输入生成的SQLselect * from user where name like admin -- and age anything;--在SQL中是注释符会注释掉后面的条件认证逻辑通过flag判断是否找到匹配记录找到则认证成功否则失败安全建议使用参数化查询预编译语句// 推荐使用sqlite3_prepare_v2()和sqlite3_bind_xxx() sqlite3_stmt *stmt; const char *sql SELECT * FROM user WHERE name ? AND age ?; sqlite3_prepare_v2(db, sql, -1, stmt, NULL); sqlite3_bind_text(stmt, 1, name, -1, SQLITE_STATIC); sqlite3_bind_text(stmt, 2, pass, -1, SQLITE_STATIC);输入验证验证用户输入长度和格式过滤特殊字符错误处理改进生产环境中不应将详细错误信息返回给用户使用日志记录错误总结这四个程序展示了SQLite3在C语言中的基本使用基础操作连接、插入、关闭数据导入从文件批量导入数据数据查询使用回调函数处理结果集交互查询处理用户输入存在安全问题注意sql_dict.c和sql_arg.c中的字符串拼接方式存在SQL注入风险在实际开发中应使用参数化查询来避免。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询