数据库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>
相关推荐
数据库小组40 分钟前
2026 年,MySQL 到 SelectDB 同步为何更关注实时、可观测与可校验?
数据库·mysql·数据库管理工具·数据同步·ninedata·selectdb·迁移工具
华科易迅42 分钟前
MybatisPlus增删改查操作
android·java·数据库
Kethy__1 小时前
计算机中级-数据库系统工程师-计算机体系结构与存储系统
大数据·数据库·数据库系统工程师·计算机中级
SHoM SSER1 小时前
MySQL 数据库连接池爆满问题排查与解决
android·数据库·mysql
熬夜的咕噜猫2 小时前
MySQL备份与恢复
数据库·oracle
jnrjian2 小时前
recover database using backup controlfile until cancel 假recover,真一致
数据库·oracle
lifewange2 小时前
java连接Mysql数据库
java·数据库·mysql
大妮哟3 小时前
postgresql数据库日志量异常原因排查
数据库·postgresql·oracle
还是做不到嘛\.3 小时前
Dvwa靶场-SQL Injection (Blind)-基于sqlmap
数据库·sql·web安全
不写八个4 小时前
PHP教程004:php链接mysql数据库
数据库·mysql·php