数据库02 网页html01 day44

数据库

一:基础概念

复制代码
	sun
	solaris  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命令

C 复制代码
//系统维护命令
.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(列出当期数据库中的所有表)
c 复制代码
//标准SQL语句		//所有的sql语句都以';'结尾
创建一个表:ddl		create 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;
c 复制代码
//插入时间列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 

三:sqlC语言

c 复制代码
https://sqlite.org
https://sqlite.org/c3ref/intro.html
c 复制代码
#include <sqlite3.h>
#include <stdio.h>

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导入字典

c 复制代码
#include <sqlite3.h>
#include <stdio.h>
#include <string.h>

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没有调用

c 复制代码
对于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.)
	 
	 
c 复制代码
#include <sqlite3.h>
#include <stdio.h>
//函数原型:
//查询操作: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;
}
c 复制代码
id      name    age     dt
2       张三    23      2025-07-29 11:41:46
id      name    age     dt
1       niko    25      2025-07-29 11:50:00
id      name    age     dt
3       k3yoo   24      2025-07-29 11:50:16
//不加标志位的话,标题会多次打印,也说明了show会多次调用

3.3字典查找

c 复制代码
#include <sqlite3.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>

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;
}

四:网页设计

一:基础概念

html 复制代码
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,center
2) 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>
	<!-- 表单中重要的字元素 input button -->
<!-- 属性 action,指定表单发送的地址 -->
<!-- 属性 method 发送的方式 get,post -->
<!--get方法 数据会附加到url的后面传递给服务器 默认-->
<!--post,将数据包大包发给服务器,等候服务器来读取 -->
13,input元素,(输入框)他是表单的一个字属性
	指定表单中的内容项,比如输入内容的文本框
	可以指定表单属性,也可以放在表单的外面。
	input元素的属性:
		type,指定输入框的类型,text单行文本,password密码,submit提交按钮,
		reset,重置按键,button按键,普通的按键需要和特定的时间关联。
		image:图片式按键
		hidden:隐藏字段,该内容不显示在页面上,提交其他的一些变量。
		email: 是一个邮箱类型,新特性,可能支持有差异
		required:表示内容必须填写,不然不能提交。
	name:名称,输入内容识别名称,传递参数时候的参数名称
	value: 默认值,输入框默认填入的内容,
	maxlength,指定最大长度
	placeholder,设置提示信息的
HTML 复制代码
eg:
<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8"> <!--   设置字符集 -->
	<title>中文测试。。。。</title>
	<style>
		body {
			background-color: pink;
		}
	</style>
</head>

<body>
	这里是测试body测试内容。。。
	<h1>h1字体</h1>
	<h3 style="text-align:center">h3字体</h3>
	<h6 align='right'>h6字体</h6>


	<h1>
		<p>此前,村民守着世界遗产,哈尼梯田却<br><br><br>
			生活贫困。2018年,随着"阿者科计划"实施,阿者科村依托特有的资源,村集体旅游公司成立,村民生活改善。
		</p>
		<hr>
		<p>为丰富游客体验,村里推出"自然野趣""哈尼文化"等主题项目,实行菜单式管理。项目带动了本地就业,促使部分外出村民返乡</p>
	</h1>

	<b>加粗内容</b> <i>字体倾斜</i> <del>删除文字</del> <small>超小字体</small>
	h<sub>2</sub>0 100m<sup>2</sup> <ruby>二姐 <rt>(er) (jie)
		<rt>
	</ruby>
	<mark>加黄色背景 </mark>
</body>

</html>
1.1:用html网页访问,通过数据库判断
c 复制代码
//ser
#include <fcntl.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h> /* See NOTES */
#include <time.h>
#include <unistd.h>
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;
}
html 复制代码
<!DOCTYPE html>

<html>
<head>

	<meta charset="utf-8">

		<!--中文标识 -->

	<title>登录</title>

</head>
<body>

	<form action='login'> <!-- 属性 action,指定表单发送的地址 -->

		用户名: <input type='text' name='username' required='required' placeholder='请输入qq账号'>

		<!--type,指定输入框的类型,text单行文本,password密码,submit提交按钮,-->

		<!--name:名称,输入内容识别名称,传递参数时候的参数名称-->

		<!--required:表示内容必须填写,不然不能提交。 -->

		<!--placeholder,设置提示信息的。 -->

		密码: <input type='password' name='userpw' required='required' placeholder='请输入qq的密码'>

		<!-- password密码-->

		<input type='submit'>

		<!--submit提交按钮 -->

	</form>

	<!-- http://127.0.0.1/login?username=niko&userpw=25-->

</body>
</html>
html 复制代码
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>密码错误</title>
</head>
<body>
    <h1 align="center"><mark>密码错误</mark></h1>
</body>
</html>
相关推荐
bing_15834 分钟前
在多租户或多服务共享 Redis 时,如何做逻辑隔离或权限控制?
数据库·redis·缓存
ChaITSimpleLove1 小时前
PostgreSQL 中删除指定数据库下的所有表结构
数据库·postgresql·bash·sql 脚本·.net npgsql
孫治AllenSun2 小时前
【Mysql】字段隐式转换对where条件和join关联条件的影响
数据库·mysql·oracle
2301_793086874 小时前
Mysql group by
数据库·mysql
jllllyuz4 小时前
Spring中的事务是如何实现的
数据库·sql·spring
wangmengxxw4 小时前
Spring-常用注解
java·数据库·spring·注解
m0_747266095 小时前
contentprovider实验+SQLite数据库的实现
数据库·sqlite
TDengine (老段)5 小时前
TDengine 中 TDgp 中添加机器学习模型
大数据·数据库·算法·机器学习·数据分析·时序数据库·tdengine
网安Ruler5 小时前
Web开发-PHP应用&Cookie脆弱&Session固定&Token唯一&身份验证&数据库通讯
前端·数据库·网络安全·php·渗透·红队