文件操作:目录操作,文件操作
目录操作步骤:
- 准备一个目录(路径)
- 判断一个路径是否是一个目录
- 打开目录opendir,返回一个目录资源,包含当前目录下所有的文件
- 遍历目录资源,循环+readdir,每次获得一个文件名,将资源指针下移一位
- 关闭资源closedir
文件操作步骤:
- 准备一个文件路径
- 判断一个路径是否是一个文件
- 打开文件,获得其中内容
- a) PHP5:file_get_contents,file将文件按照行进行获取返回一个数组
- b) PHP4:打开资源fopen(文件名,Mode),fgetc获取一个字符,fgets获取指定长度或者一行,fread获取指定长度
- 写入内容
- a) PHP5:file_put_contents(文件名,字符串,Mode),Mode:追加,起始位置插入
- b) PHP4:fwrite,fputs,往文件中插入数据(数据插入位置默认由fopen决定)
- c) Fseek:将文件的指针指向指定的位置。
- 关闭文件,fclose
文件操作相关函数
Scandir:获取指定目录下所有的文件,以数组形式返回
如果自定义遍历目录?(笔试的时候经常出现)
- 写一个函数遍历一个文件夹下的所有文件
Function myScandir($dir = “.”){
//定义一个数组,接收遍历的所有结果
$arr = array();
//循环遍历当前文件夹下所有文件
$o = opendir($dir);
While($filename = readdir($o)){
//每次得到一个文件
$arr[] = $filename;
}
//返回
Return $arr;
}
- 如果当前文件夹内,还有子文件夹,需要进入子文件夹再次进行遍历
//可以采用遍历当前文件夹的内容的形式来判断,但是很难做到全部遍历
Foreach($arr as $value){
//拼凑一个路径
$dir .= ‘/’ . $value;
//判断路径
If(is_dir($dir)){
//是一个路径
$subarr = myScandir($dir);
}
}
递归调用函数本身
Function myScandir($dir = “.”){
//定义一个数组,接收遍历的所有结果
Static $arr = array();
//循环遍历当前文件夹下所有文件
$o = opendir($dir);
While($filename = readdir($o)){
//将.和..必须去除
If($filename == ‘.’ || $filename == ‘..’)
{
$arr[] = $filename;
}else{
//每次得到一个文件
$arr[] = $filename;
//也许当前文件是一个文件夹,那么需要更深层次的遍历
If(is_dir($dir . ‘/’ . $filename)){
//子文件夹与当前文件夹有同样的结构,只需要调用当前函数本身即可
myScandir($dir . ‘/’ . $filename);
}
}
}
//返回
Return $arr;
}
递归:函数内部调用自己
递归有两个要素:递归出口,递归点
递归出口:当条件达到指定要求时,函数不在进行递归调用
递归点:子问题与父问题结构一
Mysql基础知识和应用
Mysql课程体系
Mysql基础知识和应用
这部分最重要,主要了解数据的操作和基本原理
大型数据库优化
主要是讲如何提高数据库的效率,索引,分表(垂直分表,水平分表)
数据库部署
如何对大型数据库进行服务器部署,服务器集群,负载均衡
有几个概念需要了解:
数据库:Database存放数据的仓库,高效率存储和处理数据的软件(狭义的理解)
广义的讲,凡是能够存储数据的介质都称之为数据库
数据库管理系统:Database Management System,DBMS,管理数据库的系统
数据库系统:Database System = DBMS + DB
系统管理员:Database Administrator DBA,负责日常数据库的维护(部署)
数据库有两大阵营:关系型数据和非关系型数据库
关系型数据库:建立在关系模型上的数据库
关系模型:通过数据结构,数据关系,数据约束三部分构成
关系模型可以理解为是一张二维表,关系指的是二维表(实体)内部的数据联系,以及(实体)表与表之间的联系
实体:人类世界中,所能看到的各种单位
设计一个教学系统
实体:老师,学生,教室,科目。。。
设计一个学生表
学号 | 姓名 | 性别 | 年龄 | |
PHP1001 | 李商隐 | 男 | 28 | |
PHP1002 | 屈原 | 男 | 34 |
注意:一个实体创建一张数据表保存,数据表保存的都是一个实体的相关属性,与实体无关的不放到一起
设计一个班级表
班级名字 | 教室名字 | 开班时间 | 结束时间 |
PHP1405 | B2302M | 20140510 | 20140925 |
PHP1402 | D306 | 20140320 | 20140805 |
班级表里面维护与班级相关的信息
实体与实体间的联系
如何将学生和班级进行关联?
学号 | 姓名 | 性别 | 年龄 | 班级名字 |
PHP1001 | 李商隐 | 男 | 28 | PHP1405 |
PHP1002 | 屈原 | 男 | 34 | PHP1402 |
PHP1003 | 李清照 | PHP1403 |
实体与实体之间,通过某一个关系进行管理。
对应数据表,如果进行关联呢?怎么表示实体与实体之间是有关系的?
在一个实体中,维护一个信息,该信息指向另外一个实体。
世面上有哪些关系型数据库?
几乎所有看到数据库都是关系型数据,Mysql,Oracle,SQLServer,Access。。。
关系型数据库特点:
- 都是保存在硬盘
- 都是使用二维表保存数据
- 关系型数据库即便表中的某个字段数据不存在,但是数据库也会为该字段保留空间,关系型数据库比较浪费硬盘空间。
非关系型数据库:不是关系型数据库的都叫非关系型数据
NOSQL:NOT ONLY SQL
非关系型数据库中数据的存在形式
- 数据运行在内存中,有一个同步机制,将内存中的内容保存硬盘
- 存在形式:以键值对形式存在,学号=>PHP1001
非关系型数据:memcache,mongodb,redis
关系型与非关系型数据比较:
- 非关系型数据库效率高
- 关系型数据库更安全
关系型数据库的几个典型概念
行(row):指的是数据表中的横向结构,行也称之为记录(record),表示一条数据(代表一个实体信息)
行和记录没有本质区别,行是从结构的角度出发,记录从数据(内容)角度出发
列(col):指的数据表中的纵向结构,列也称之为字段(field),表示一列数据
列和字段也没有本质区别,一个从结构出发,一个从数据出发
SQL:Structured Query language,结构化查询语言。
指的是关系型数据库中对数据库进行管理的语言。SQL虽然是关系型数据库,但是在不同的关系型数据库中有那么一点点微小的区别。
SQL:DDL,DML,DCL
DDL:Data Definition Language,数据定义语言,定义结构,通常指的是结构的操作,如数据库的创建和删除,数据表的创建、删除和修改,create,drop
DML:Data Manipulation Language:数据操作语言,对数据的增删改查,查询是一门专门的语言:DQL,Data query Language,数据查询语言,select,insert,update,delete
DCL:Data Control Language:数据控制语言,主要是实现对系统用户的权限管理,grant,revoke,flush
Mysql
Mysql是一种关系型数据库,是一种管理数据的软件。
软件结构:b/s和c/s
b/s:browser/server,浏览器服务器,指的是只要服务器运行,在客户端(PC)通过浏览器就可以实现访问
c/s:client/server,客户端服务器,如果用户(PC)希望访问服务器,必须要安装对应的客户端,还要保证客户端和服务端同时运行。
飞秋是c/s结构,飞秋已经扁平化了,没有严格的客户端和服务端。
Mysql是一种c/s结构
- 安装必须要有客户端和服务端,mysql.exe是客户端,mysqld.exe是服务端
- 进行通信,必须保证两个端都同时在运行
Mysql是如何实现mysql.exe与mysqld.exe进行通信的呢?
- 连接认证,客户端发送连接请求,同时服务端对客户端进行身份认证
- a) 保证找到对应的服务端:-h host,服务器所在的地址 –hlocalhost,-h192.160.3.1
- b) 指定端口,找到对应的应用软件:-P port,端口 –P3306,3306是数据库的默认端口
- c) 还要提供身份:用户名和密码,-u username,-p password
- d) exe –h192.168.3.1 –P3306 –uroot –proot
登录成功
- 客户端准备和发送SQL语句,发给服务端
- 服务端执行SQL语句,将执行结果返回给客户端
- 客户端要解析结果,并负责显示
以上三个步骤,是没有办法分离显示,因为操作太快
- 退出客户端
- a) Quit
- b) Exit
- c) q
Mysql操作原理
如何维护mysql服务?
- 安装的过程中加入到系统服务,系统在启动的时候自动加载mysql服务,在控制台运行
在windows下,服务的管理,使用命令:net [stop,start,restart] [服务名]
关闭mysql服务:net stop mysql
开启mysql服务:net start mysql
- 进入服务列表进行操作
3.Mysqld.exe的启动
Mysql服务端,用户没有办法直接查看里面到底有哪些东西。
Mysql服务端有四层对象
服务端:最终管理数据,数据最终是落到字段上进行管理
SQL基本操作
基本操作指的是增删改查:C(create新增)R(read/retrieve,查询)U(update修改)D(delete删除)
库操作
创建数据库
语法:create Database 数据库名字 [库选项]
库选项
字符集:charset/character set,指定数据库内容的编码
校对集:collate,指的是数据库数据的比较方式
这条语句执行后,mysql服务端做了哪些工作?
- 在服务器端的数据文件夹内创建一个名为shop的文件夹
如何找到该路径呢?
My.ini文件中的datadir配置项
- 创建一个库选项文件,在对应的数据库文件夹里,有一个db.opt文件,保存数据库的库选项
内容就是保存的库选项
数据库命名规则
1.使用字母,下划线和数字来命名,通常,以字母开头(数据库名字命名并没有非常严格的要求)
2.如果出现关键字或者保留字当做数据库名字,应当使用反引号对库名进行包裹,反引号是esc下面的那个键,在英文输入状态下输出的内容
Syntax错误:语法错误,提示错误的范围
正确使用
- 数据可以使用中文做名字,但是需要使用反引号
但是中文数据库下创建的数据库文件夹名字,会以额外的编码形式存在
规范:
- 通常数据库的命名,要做到见名之意
- 不使用中文
- 通常,数据库会有前缀ecs_
查看数据库
语法1:show databases,显示所有数据库
语法2:show databases like [‘pattern’],模糊查询,指定查询条件
%:通配符,匹配所有字符,所有数量
_:匹配所有字符,一次
Show databases like “my%”; -- 查找以my开头的所有的数据库
Show databases like “my_”; -- 查找以my开头,后面跟一个字符的数据库
原因:下划线匹配一个字符,%匹配所有字符 ==》以information开始的所有数据
如果要得到下划线,必须对下划线进行转义
查看数据库创建语句
语法:show create database 数据库名字
修改数据库
数据库名字不可以修改。
修改的是数据库库选项
语法:alter database 数据库名字 [库选项]
效果
删除数据库
结构的删除都是使用drop关键字,而数据库是一种结构
语法:drop Database 数据库名字
效果
注意:不能轻易的删除任何数据,数据库也不能随意删除,因为数据的删除是不可逆的。如果非要删除数据库,那么请先对数据库进行备份
表操作
对数据库内的数据表进行CRUD操作,该操作仍然是结构上的。
表应该对应结构才能称之为表。
表操作包含自身操作以及字段的操作。表跟字段是密不可分的。
创建表
语法:create table 表名(
--字段列表
字段1 字段类型,
字段2 字段类型,
…
字段N 字段类型
)[表选项];
表选项:字符集和存储引擎
字符集:该表存储数据所采用的字符集
存储引擎:当前表按照上面数据格式来存储数据
字段为什么需要字段类型?
SQL是一门强类型语言,对于数据必需要指定其数据类型,不是同一个数据类型的内容不能存放。
创建数据表
错误:没有选择数据库
原因:数据表是依赖数据库存在的,是数据库的子对象,所以创建的数据表必须指定数据库
- 显示指定数据库,指的是在创建表的时候,明确指定该表应该放到哪个数据库下
语法:数据库.数据表
- 默认使用数据库,前提是当前环境已经进入到某个指定的数据库。
进入数据库语法:use 数据库名字
所有创建语法,都可以先对要创建的对象进行是否存在判断。
如不能创建已经存在的数据库
防止冲突的办法:
If not exists:如果不存在
If exists:如果存在
If not exists使用
If exists使用
数据表的命名规则:跟数据库基本一致
一般数据表的命名采用下划线方式。
R:查询表
- 语法:show tables;查询当前数据库中所有的表
- 语法:show tables like “c%”;模糊查询
- 语法:show create table 数据表名,查看表的创建语句
- 语法:desc 表名;查看表中的字段信息,describe 表名;show columns from 表名
U:更新表结构
语法:alter table 表名 add/modify/change/drop [column] 字段名 [字段类型] [位置]
Add:添加一个字段:add 字段名字 字段类型 [位置]
指定位置
Modify:修改一个字段类型:modify 字段名 字段类型 [位置]
Change:修改一个字段名字:change 旧字段名 新字段名 字段类型 [位置]
Drop:删除一个字段:drop 字段名
位置:有两个选项的
First:表示放到表的第一个位置,语法:first
After:表示放到哪个字段的后面,语法:after 字段名
修改表的名字
语法:rename table 旧表名 to 新表名
D:删除数据表
语法:drop table 表名
注意:删除要慎用,表的删除会将整个表中的数据全部干掉,而这种操作不可逆。
数据操作
对数据表里保存的数据进行增删改查操作
C:新增数据
语句:insert into 表名 [(字段列表)] values (值列表)
如果没有字段列表,值列表的数量必须跟表字段数目完全一致,顺序要完全对应
如果有字段列表,那么字段列表与值列表的字段数据必须完全一致,顺序要完全对应
如果使用字段列表,该字段列表可以不与数据表的字段列表顺序一致
错误1:字段类型与值类型不匹配
错误2:待插入的字段列表与当前插入的值列表的数量不匹配
R:查询数据
语法:select [字段列表] from 表名 [where条件]
查询所有数据
查询指定字段
查询指定条件数据
U:更新数据
语法:update 表名 set 字段 = 值 [where条件]
多字段修改
D:删除数据
语法:delete from 表名 [where条件]
注意:通常update和delete都必须匹配where条件,否则不允许操作,因为更新和删除都是永久性的,不可逆的。
中文数据插入
Windows下,命令行模式里,只识别gbk编码,而且该编码不可以改变
要保证mysql.exe在控制台可以输入中文并且让服务端识别的话,有一个快捷方式
Set names gbk; //告诉服务器,客户端给服务器传递数据是gbk编码的
查看mysql支持的字符集
语法:show character set;
一共支持39种字符集,除了这39种之外,其他的字符集就不能支持。
查看mysql服务器对外设置的默认的字符集
语法:show variables like ‘character_set%’;
保证服务器端能够识别客户端的数据,只需要修改character_set_client = gbk;
Set character_set_client = gbk;
就可以使用gbk编码的数据传输给服务器
修改结果集的字符集
Mysql.exe就可以解析数据
客户端与服务端进行不同字符集编码数据通信的原理
Set names gbk做了什么事情?
数据库数据存储的最终编码?
- DBMS:安装数据库时指定编码
- DB:创建数据库时指定
- Table:创建表时指定
- Field:创建字段的时候指定
最终数据的存储编码,受最近的字符集影响,如果没有强制指定,那么顺序依次是:字段à表à数据库àDBMS
注意:
1 只要用户设定好了,客户端的编码(character_set_client,character_set_results),不管数据库最终存储数据是按照什么字符集,都不会出现乱码。
2 字符集的最终设定受当前代码所在的环境影响,代码在控制台,就只能是gbk,代码在文件里,跟文件的编码是一致的。
本文来自投稿,不代表科技代码立场,如若转载,请注明出处https://www.cwhello.com/5786.html
如有侵犯您的合法权益请发邮件951076433@qq.com联系删除