数据库02 网页html01 day44
数据库
一:基础概念
sunsolaris gnu
1、分类: 大型 中型 小型ORACLE MYSQL/MSSQL SQLITE DBII powdb
关系型数据库
2、名词:
DB数据库 select update database
DBMS数据库管理系统
MIS 管理信息系统
OA 办公自动化
3、嵌入式数据库:sqlite3 www.sqlite.org www.kernal.org
GNU
特点:
1、开源 C语言开发
2、代码量少 1万行左右,总大小10M以内
3、绿色软件无需安装
4、文件型数据库,可以移动。
5、数据容量最大 2T
SQL struct query language
:关系型数据库 非关系 :芒果db
ddl data defination language
建表dml
新增 修改 删除一行 data modifty
dql
查询 data query language
查询 select
二:sql
命令
//系统维护命令.databases //列出当前库和系统中那个文件在关联.q or .exit // 退出.headers on|off //Turn display of headers on or off 显示头信息的开关.schema ?PATTERN? //列出当前指定的xxx表结构 matching PATTERN // Add --indent for pretty-printing.tables ?TABLE? //List names of tables(列出当期数据库中的所有表)
//标准SQL语句//所有的sql语句都以\';\'结尾创建一个表:ddlcreate table 表名(表字段1,表字段2,...);eg:create table user(id int,name char,age int); 注意:以上表的表字段,支持如下数据类型。int text real(小数) blob(二进制数据)默认是text类型。char----------------------------------------------------------------------删除一个表:drop table 表名;eg:drop table user;----------------------------------------------------------------------向表中增加数据:insert into 表名 (字段名称 ) values (值名称);eg:insert into user (id,age) values (1,10);insert into user values(3,\"wang\",11);insert into user (age) values ( 12);---------------------------------------------------------------------- 查询表中的数据:select 列名 from 表名 条件;eg:select * from user ; 显示表的所有的列 select id from user; 显示id select id,name from user where age <30 ; select id,name from user where name = \'lisi\' ; select id,name from user where id>= 2 and id <=5; //and 和 or 和 not -----对应,用英文,不用符号 && 和 || 和 !where name like \'三一\' % 和 _ (通配符) like + 通配符:模糊查找 %:有任意多的字符(0-任意多),eg:张三,可以 张,可以可以%张 张%----张结尾的,,,张开头的 _:有一个字符,eg:张_只能匹配张三,张__只能匹配张三三 SELECT * FROM aaa WHERE name LIKE \'zhang%\'; asc select *from user where age>20 or age<50 order by age desc limit 2 ;----------------------------------------------------------------------------- 修改表中数据:(不加条件的话,可能导致一列都会变) update 表名 set 表字段 = 值 满足条件: eg: update user set id = 1 where name = \'li\'; update user set id = 1 where name = \"li\" and passwd = \"123\"; update user set id = 2 where name = \"li\" or name = \"zhao\";-------------------------------------------------------------------------- 删除表中数据: delete from 表名 满足条件: eg:delete from user ; ///删除表中所有数据 delete from user where id = 1; ///删除id=1 的数据; delete from user where id =1 and name = \"zhang\"; delete from user where id = 1 or id = 2;
//插入时间列int int;插入时间列 int int;CREATE TABLE user1(id int,name char,age int,dt datetime);\'2022-07-01 19:00:00\'insert into user1 values (2,\'张三\',23,datetime(\'now\',\'+8 hours\'));//该空格,有的地方不要空格-----------------------------------------------------------------------自动增长列sqlite> CREATE TABLE user3(id INTEGER PRIMARY(主键) KEY ASC(升序),name char,age int,dt datetime); sqlite> insert into user3 (NULL,\'李四\',23,datetime(\'now\')); //在上一次的对应位置数值上自动 +1-----------------------------------------------------------------------asc where (group by having) order by [desc] limit;//order 以xx方式,desc 倒序,limit 添加限制条件select * from user where id<10 order by id limit 2;------------------------------------------------------------ 维护命令//在命令行写 1.数据库的导出 sqlite3 xxx.db .dump > xxx.sql//将数据库名称为xxx的数据库整体导出到脚本中。 //可以看里面开头和结尾,也是sql语句,用C语言写,程序运行会快 BEGIN TRANSACTION;COMMIT; 2、数据的导入:sqlite3 xxx.db < xxx.sql 3、可视化工具安装:sudo apt-get install sqlitebrowser
三:sql
C语言
https://sqlite.orghttps://sqlite.org/c3ref/intro.html
#include #include int main(int argc, char** argv){ sqlite3* db = NULL; char* errmsg = NULL; int ret = sqlite3_open(\"./aaa.db\", &db); if (SQLITE_OK != ret) { // 不能perror fprintf(stderr, \"open db error %s\\n\", sqlite3_errstr(ret)); sqlite3_close(db); return 1; } char sql_cmd[512] = \"insert into user3 \" \"values(NULL,\'test\',110,datetime(\'now\'));\"; //因为没有使用回调函数,所以 sql_cmd 只能是除了select 语句之外的其他sql语句 ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg); if (SQLITE_OK != ret) { fprintf(stderr, \"exec sql %s error %s\\n\", sql_cmd, errmsg); sqlite3_free(errmsg); sqlite3_close(db); return 1; } sqlite3_close(db); return 0;}
3.1:用sql
导入字典
#include #include #include int main(int argc, char **argv){ sqlite3 *db = NULL; int ret = sqlite3_open(\"./aaa.db\", &db); if (SQLITE_OK != ret) { fprintf(stderr, \"open db error %s\\n\", sqlite3_errmsg(db)); sqlite3_close(db); return 1; } char *errmsg = NULL; char sql_cmd[1024] = {0}; sprintf(sql_cmd, \"drop table dict;\"); sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg); bzero(sql_cmd, sizeof(sql_cmd)); sprintf(sql_cmd, \"create table dict(id INTEGER PRIMARY KEY ASC,word char,mean text);\"); ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg); if (SQLITE_OK != ret) { fprintf(stderr, \"create table error %s\\n\", sqlite3_errmsg(db)); sqlite3_close(db); return 1; } FILE *fp = fopen(\"/home/linux/dict.txt\", \"r\"); if (NULL == fp) { perror(\"open\"); return 1; } while (1) { char linebuf[1024] = {0}; if(NULL==fgets(linebuf, sizeof(linebuf), fp)) { break; } char *word = strtok(linebuf, \" \"); char *mean = strtok(NULL, \"\\r\"); if (NULL == word || NULL == mean) { continue; } bzero(sql_cmd, sizeof(sql_cmd)); sprintf(sql_cmd, \"insert into dict values(NULL,\\\"%s\\\",\\\"%s\\\");\", word, mean); ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg); if (SQLITE_OK != ret) { fprintf(stderr, \"exec error %s,sql [%s]\\n\", errmsg,sql_cmd); sqlite3_free(errmsg); sqlite3_close(db); return 1; } } sqlite3_close(db); fclose(fp); // system(\"pause\"); return 0;}
3.2:回调函数
回调函数不一定会调:在通过 by
没有显示,就是show
没有调用
对于sqlite3_exec 函数,必须传入,回调函数(因为数据库在返回结果集的,是通过回调函数的result参数反馈出来的)。 如果,结果集有10条记录的话,那么,回调函数会被调用10次。在这个过程中, result 会依次变化,第1条记录,第2条记录,第3条记录, ....第10条记录 。 如果exec 把整个结果集(结果非常多的话),一次性反馈的话。 可能内存不够申请,就会发生异常。 如果没有符合条件的结果集,那么,回调函数不调用。 在回调函数中的返回值,一定要返回0 ; (If an sqlite3_exec() callback returns non-zero, the sqlite3_exec() routine returns SQLITE_ABORT without invoking the callback again and without running any subsequent SQL statements.)
#include #include //函数原型://查询操作:sqlite3_get_table(); ////select //int sqlite3_get_table(sqlite3 *db,char *sql,//char *** rest,int *nrow,int *ncol,//char ** errmsg);//show不止一次调用,调用一次,显示一行,一次二重指针,多次调用是三重指针,原函数是三次指针int show(void*arg,int col,char**result,char** title){ static int flag = 0; if(0 == flag) { flag = 1; for(int i = 0;i<col;i++) { printf(\"%s\\t\",title[i]); } printf(\"\\n\"); } for(int i=0;i<col;i++) { printf(\"%s\\t\",result[i]); } printf(\"\\n\"); return 0;}int main(int argc, char** argv){ sqlite3* db = NULL; char* errmsg = NULL; int ret = sqlite3_open(\"./aaaa.db\", &db); if (SQLITE_OK != ret) { // 不能perror fprintf(stderr, \"open db error %s\\n\", sqlite3_errstr(ret)); sqlite3_close(db); return 1; } char sql_cmd[512] =\"select * from aaaa\"; //因为没有使用回调函数,所以 sql_cmd 只能是除了select 语句之外的其他sql语句 ret = sqlite3_exec(db, sql_cmd, show, NULL, &errmsg); if (SQLITE_OK != ret) { fprintf(stderr, \"exec sql %s error %s\\n\", sql_cmd, errmsg); sqlite3_free(errmsg); sqlite3_close(db); return 1; } sqlite3_close(db); return 0;}
id name age dt2 张三 23 2025-07-29 11:41:46id name age dt1 niko 25 2025-07-29 11:50:00id name age dt3 k3yoo 24 2025-07-29 11:50:16//不加标志位的话,标题会多次打印,也说明了show会多次调用
3.3字典查找
#include #include #include #include int find(void *arg, int col, char **result, char **title) { strcpy((char *)arg, result[2]); return 0;}int main(int argc, char **argv) { sqlite3 *db = NULL; int ret = sqlite3_open(\"./aaaa.db\", &db); if (SQLITE_OK != ret) { fprintf(stderr, \"open db error %s\\n\", sqlite3_errmsg(db)); sqlite3_close(db); return 1; } char *errmsg = NULL; char sql_cmd[1024] = {0}; sprintf(sql_cmd, \"drop table dict;\"); sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg); bzero(sql_cmd, sizeof(sql_cmd)); sprintf(sql_cmd, \"create table dict(id INTEGER PRIMARY KEY ASC,word char,mean text);\"); ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg); if (SQLITE_OK != ret) { fprintf(stderr, \"create table error %s\\n\", sqlite3_errmsg(db)); sqlite3_close(db); return 1; } FILE *fp = fopen(\"/home/linux/dict.txt\", \"r\"); if (NULL == fp) { perror(\"open\"); return 1; } bzero(sql_cmd, sizeof(sql_cmd)); strcpy(sql_cmd, \"BEGIN TRANSACTION;\"); ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg); while (1) { char linebuf[1024] = {0}; if (NULL == fgets(linebuf, sizeof(linebuf), fp)) { break; } char *word = strtok(linebuf, \" \"); char *mean = strtok(NULL, \"\\r\"); if (NULL == word || NULL == mean) { continue; } bzero(sql_cmd, sizeof(sql_cmd)); sprintf(sql_cmd, \"insert into dict values(NULL,\\\"%s\\\",\\\"%s\\\");\", word, mean); ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg); if (SQLITE_OK != ret) { fprintf(stderr, \"exec error %s,sql [%s]\\n\", errmsg, sql_cmd); sqlite3_free(errmsg); sqlite3_close(db); return 1; } } bzero(sql_cmd, sizeof(sql_cmd)); strcpy(sql_cmd, \"COMMIT;\"); ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg); char word[50] = {0}; printf(\"input word:\"); fgets(word, sizeof(word), stdin); word[strlen(word) - 1] = \'\\0\'; int flag = 0; sprintf(sql_cmd, \"select * from dict where word=\'%s\';\", word); char mean[256] = {0}; ret = sqlite3_exec(db, sql_cmd, find, mean, &errmsg); if (SQLITE_OK != ret) { fprintf(stderr, \"exec sql %s error %s\\n\", sql_cmd, errmsg); sqlite3_free(errmsg); sqlite3_close(db); return 1; } if (0 == strlen(mean)) { printf(\"no such word\\n\"); } else { printf(\"have the word mean is:%s\\n\",mean); } sqlite3_close(db); fclose(fp); // system(\"pause\"); return 0;}
四:网页设计
一:基础概念
1.格式 dreamwave<!DOCTYPE html><html ><head><meta charset=\"utf-8\"><title>中文测试。。。。</title></head><body>这里是测试body测试内容。。。<h1>h1字体</h1><h2>h1字体</h>2<h3>h1字体</h3></body> </html>------------------------------------------------------------2.标签 在body内<h1></h1>双标签 标题 ,加粗,换行 1-6 ---》小<p></p> 双标签 段落,有换行功效<hr> 单标签 左到右分割符<br> 切到下一行注释------------------------------------------------------------3,元素的属性给元素提供更多的属性,大部分的元素属性语法:<标签 属性1=参数1 属性2=参数2>1)align left,right,center2) bgcolor ,body的属性设置网页的背景色<body bgcolor=\"0xff1234\" bgcolor=\"0xff1234\">------------------------------------------------------------4,文本元素属性b 元素 <b>内容</b> 加粗br 换行<br> 如果是p标签中间有间隔i元素, 字体倾斜<i></i>del元素 删除文字<del></del>strong 强调一段文字,效果类似 b标签u元素,下划线<u></u>small元素, 超小字体<small></small>sub 下标<sub></sub>sup 上标<sup></sup><br>h<sub>2</sub>0<br>100m<sup>2</sup>ruby,拼音,<ruby>二姐 <rt>(er) (jie)<rt></ruby>,可能部分浏览器不支持。mark 元素 <mark> </mark> 加黄色背景--------------------------------------------------------10,表单传递参数,数据<form></form>13,input元素,(输入框)他是表单的一个字属性指定表单中的内容项,比如输入内容的文本框可以指定表单属性,也可以放在表单的外面。input元素的属性:type,指定输入框的类型,text单行文本,password密码,submit提交按钮,reset,重置按键,button按键,普通的按键需要和特定的时间关联。image:图片式按键hidden:隐藏字段,该内容不显示在页面上,提交其他的一些变量。email: 是一个邮箱类型,新特性,可能支持有差异required:表示内容必须填写,不然不能提交。name:名称,输入内容识别名称,传递参数时候的参数名称value: 默认值,输入框默认填入的内容,maxlength,指定最大长度placeholder,设置提示信息的
eg: 中文测试。。。。 body {background-color: pink;}这里是测试body测试内容。。。h1字体
h3字体
h6字体
此前,村民守着世界遗产,哈尼梯田却
生活贫困。2018年,随着“阿者科计划”实施,阿者科村依托特有的资源,村集体旅游公司成立,村民生活改善。
为丰富游客体验,村里推出“自然野趣”“哈尼文化”等主题项目,实行菜单式管理。项目带动了本地就业,促使部分外出村民返乡
加粗内容 字体倾斜 删除文字 超小字体h20 100m2 二姐 (er) (jie)加黄色背景
1.1:用html
网页访问,通过数据库判断
//ser#include #include #include #include #include #include #include #include /* See NOTES */#include #include typedef struct sockaddr*(SA);int send_file(int conn, char* filename){ int fd = open(filename, O_RDONLY); if (-1 == fd) { perror(\"open\"); return 1; } while (1) { char buf[1024] = {0}; int ret = read(fd, buf, sizeof(buf)); if (ret <= 0) { break; } send(conn, buf, ret, 0); } close(fd); return 0;}int main(int argc, char** argv){ //监听套接字 功能检测是否有客户端 连连接服务器 int listfd = socket(AF_INET, SOCK_STREAM, 0); if (-1 == listfd) { perror(\"socket\"); return 1; } // man 7 ip struct sockaddr_in ser, cli; bzero(&ser, sizeof(ser)); bzero(&cli, sizeof(cli)); ser.sin_family = AF_INET; // sudo ./s ser.sin_port = htons(80);//访问1000以下的端口,是系统端口,需要sudo // 代表本机地址 外部客户端可以连接到服务器 ser.sin_addr.s_addr = INADDR_ANY; int ret = bind(listfd, (SA)&ser, sizeof(ser)); if (-1 == ret) { perror(\"bind\"); return 1; } // 同一时刻可以服务器建立连接的排队数 listen(listfd, 3); socklen_t len = sizeof(cli); while (1) { // 1 建立连接 int conn = accept(listfd, (SA)&cli, &len); if (-1 == conn) { perror(\"accept\"); close(conn); continue; } char buf[1024] = {0}; // 2接收客户端的请求 int rec_ret = recv(conn, buf, sizeof(buf), 0); if (rec_ret <= 0) { close(conn); continue; } printf(\"%s\\n\", buf); // 3 处理请求+回应 //http://127.0.0.1/ 回环,访问自己 // GET / HTTP/1.1\\r\\n char* method = strtok(buf, \" \");// GET //统一资源定为符 char* url = strtok(NULL, \" \");// / char* ver = strtok(NULL, \"\\r\");// HTTP/1.1 if (0 == strcmp(url, \"/\")) { send_file(conn, \"./02.html\"); // login } else if (0 == strcmp(url, \"/favicon.ico\"))//网址图标 { send_file(conn, \"./2.png\"); // login } // /login?username=zhangsan&userpw=123 else if (0 == strncmp(url, \"/login\", strlen(\"/login\"))) { char* name = strchr(url, \'=\'); name += 1; char* end = strchr(name, \'&\'); *end = \'\\0\'; char* pw = strchr(end + 1, \'=\'); pw += 1; if (0 == strcmp(name, \"zhangsan\") && 0 == strcmp(pw, \"123\")) { //账号 ,密码正确 发送功能页面 send_file(conn, \"./01.html\"); } else { //账号密码错误, 发送密码错误页面 send_file(conn, \"./03.html\"); } } // 4 断开连接 close(conn); } close(listfd); // system(\"pause\"); return 0;}
<!DOCTYPE html><html><head><meta charset=\"utf-8\"><title>登录</title></head><body><form action=\'login\'> 用户名: <input type=\'text\' name=\'username\' required=\'required\' placeholder=\'请输入qq账号\'>密码: <input type=\'password\' name=\'userpw\' required=\'required\' placeholder=\'请输入qq的密码\'><input type=\'submit\'></form></body></html>
<!DOCTYPE html><html><head> <meta charset=\"utf-8\"> <title>密码错误</title></head><body> <h1 align=\"center\"><mark>密码错误</mark></h1></body></html>