frosty的博客


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

正则表达式

发表于 2020-03-24 | 分类于 基础知识

正则是用 //包裹

[abc] :任意取一个值

[a-z] : 表示一个范围

[0-9] :

\d : 数字

\D : [^0-9]

\w : 英文数字和下划线

\W : 非英文数字下划线

\s : 空白字符

\S : 非空包字符

^ : 非

. : 任意字符


量词:

{n} : 正好出现n次

{n.m} : 最少n次,最多m次

{n,} : 最少n次,最多不限

+ : 最少出现1次

? : 最少0次,最多1次

*:可有可没有(0或0以上),贪婪匹配


// i : 忽略大小写


^放在开头 :行首

$ : 行尾

Linux_centos6网络配置

发表于 2020-03-20 | 分类于 操作系统

今天对vm中的centos6进行了网络配置在此记录一下

setup配置

vi /etc/sysconfig/network-scripts/ifcfg-th0 : 把ONBOOT=”no”改为ONBOOT=”yes”

serviece network restart: 重启网络服务


配置ip找了很多博客文章,终于找到一个能配成功能够ping通baidu的博客) (若无法访问请科学上网)

记录下需要的改动(包括之前文章学到的)

  1. 将虚拟机网络设置为NAT模式

  2. 查看本网关,网关需要在虚拟机-编辑-虚拟网络编辑器-VMnet8-NAT查看网关

  3. 在本机查看DNS服务器(文章中未写,但可能需要配置下DNSip),可通过cmd输入ipconfig/all也可以直接查看网卡

  4. 进入setup配置(如何选项前文已提)

  5. 配置DNS,网关本机ip(直接在配置文件中配置也可以)

  6. 进入配置文件将BOOTPROTO的值改为static


记录下我最初配置的时候有哪些地方不同

  1. 本机ip地址设置的时候:我设置的192.168.—.1和.2 , .1被占用后设置.2无法使用网络,文章中似乎暗示着本机ip地址设置相同网段后的值应大于网关?
  2. BOOTPROTO未设置为static,事后我又改动下不设置为static其实也能ping通baidu(所以我怀疑是我开始的时候网关与ip地址配置错误所以无法连接外网)

修改DNS

vi /etc/resolv.conf

nameserver 8.8.8.8

虚拟机下安装Linux操作系统

发表于 2020-03-12 | 分类于 操作系统

附上学习教程

这里主要针对的是centos6版本,ISO镜像从官网下载即可

打开虚拟机点击新建虚拟机

剩下的除了设置一个安装路径,其他都是下一步

设置ISO镜像文件

介绍一些虚拟机的功能

虚拟机快照,可以快速回到拍摄快照的时刻

克隆功能

克隆可以克隆一个完全一样的操作系统,比重新安装更方便,而且你使用多少内存占用多少内存

一般用链接克隆,占的内存更小

简单的系统分区知识

/: 代表根目录

系统安装

注:centos想要进行图形安装界面,虚拟机分配的内存至少是628M

启动的瞬间(在显示VM的界面时)迅速按下F2进入到BIOS

需要进行设置,否则无法正常启动,把从硬盘启动改为从光盘启动

将第3个调到第1个对系统进行安装(键入加号)

对于真实机安装过后还需要将顺序调回改为先启动硬盘,否则每次启动都会启用光盘重装系统

(虚拟机比较智能不需要)

选择第一个

选择跳过

注:ctrl+Alt+Enter 进入全屏模式

选择下一步

选择中文简体

选择键盘

基础存储设备

选择是

选择主机名,建议不要修改

时间直接默认

设置密码

自定义分区

按照如图分区

除了boot,swap分区其他一般看个人习惯(swap一般分内存的两倍,但这里是训练没有必要)

在/(根目录)分区的时候选择分配全部分区

然后下一步

格式化

选择将修改写入键盘

直接下一步

根据你服务器用来做什么的不同来选择不同的软件(一般服务器采用最小化安装,因为你安装的越少,报错的可能性越低,被攻击的可能性越低)

这里为了达到学习的目的,我们不选择图形界面而是选择纯字符的,但又因为最小化种没有软件安装,对于初学者没有任何知识的情况下不适用,所以选择basic server(安装一些基本软件)

进入安装界面

重新引导

注如果是真实机还需要进入BIOS界面改为先启动硬盘,否则看到的还是安装界面

用户登入,一般使用初始用户(管理员用户,或者叫顶级用户),root

注密码登入的时候不会像windows一样显示星号

初探Linux

发表于 2020-02-27 | 分类于 操作系统

学习网站

常用命令

文件处理命令

命令格式与目录处理命令ls

命令格式

命令格式: 命令 [-选项] [参数]

例如:ls -la /etc

说明

  1. 个别命令使用不遵循此格式
  2. 当有多个选项时,可以写在一起
  3. 简化选项与完整选项: -a 等于 –all

ls

原意: list

命令所在路径/bin/ls

语法: ls 选项[-ald] [文件或目录]

注: tab键可以补全文件名

-a 显示所有文件,包括隐藏文件(Linux中,以点开头的文件代表隐藏文件)

-l 详细信息显示

-d 查看目录属性

-i 显示文件id号(Linux中系统通过id查找文件,每个文件都有一个id号)

处理命令

mkdir :创建目录 (make directories)

所在路径/bin/mkdir

语法: mkdir -p [目录名]

-p 递归创建 (例如要在tmp下创建一个hello_world目录然后再在hello_wrold目录下创建一个hello目录,需要加上-p选项)

例: mkdir /tmp/hello_world : 在tmp文件夹下创建hello_wrold 目录

也可在同一条命令在创建多个目录,在命令后面继续加路径就可


cd : 切换目录 (change directory)

所在路径: shell内置命令


pwd: 显示当前目录(print working directory)

所在路径 /bin/pwd


rmdir: 删除空目录 (remove empty directories)

所在路径: /bin/rmdir


cp :复制(copy)

所在路径/bin/cp

语法: cp -rp [原文件或目录][目标目录]

-r : 复制目录(若复制的是目录则需要加上这个选项)

-p : 保留文件属性

Linux可在复制的时候更改文件名即在 目标目录下添加 /更改的名字

注: 复制多个文件时只需在目标目录前加上相关路径即可,系统会默认认为最后一个是目标目录,前2个是要复制的文件

若复制的目录下存在该文件,会提示你是否覆盖,y代表覆盖,n代表不覆盖


mv:剪切 (move)

所在路径 /bin/mv

语法: mv [原文件或目录][目标目录]

也可以用来改名 在目标目录直接输入更改的名字(理解为将文件移动到当前目录下,并更改名字)

剪切目录的时候不需要


rm : 删除文件或目录 (remove)

所在路径/bing/rm

语法: rm -rf [文件或目录]

rm -rf * :删除当前文件夹下的所有内容

-r 删除目录

-f 强制执行 (若未添加该选项会提示你是否删除文件,需要恢复Y/N回复是否删除)


touch : 创建空文件

目录 /bin/touch

语法: touch [文件名]

当想创建一个文件,文件名有空格,用双引号将名字包裹,否者系统会认为是创建2个文件(不建议使用)


cat: 显示文件内容

所在路径 /bin/cat

语法 cat [文件名]

-n 显示行号


tac:显示文件内容(反向列示)(命令是cat反过来)

所在路径: /usr/bin/tac

语法: tac[文件名]


more: 分页显示文件内容

所在路径: /bin/more

语法: more [文件名]

(空格)或f 翻页

b 往回翻页

(Enter) 换行

q或Q 退出


less: 分页下那是文件内容(可向上翻页)

所在路径 /usr/bin/less

按pgUp(pgDn)向上(下)翻页 (即上下键)

语法: less [文件名]

搜索: 键入 /关键词 , 按n(next)往后找


head: 显示文件前几行

所在路径 /usr/bin/head

语法 head [文件名] (默认前十行)

-n 指定行数


tail : 显示文件后面几行

所在路径 /usr/bin/tail

语法: tail [文件名]

-n 指定行数

-f 动态显示文件末尾内容


In : 生成链接文件 (link)

所在路径 /bin/In

语法: In -s [源文件] [目标文件]

-s : 创建软链接

软链接特征:类似Windows快捷方式

如何查看一个是否为硬链接,查看id序号,硬链接与原文件的id号一样

硬链接类似拷贝(cp指令),但是与cp不同的是硬链接是与原文件同步更新的

硬链接无法跨分区且无法针对目录(软链接可以)

权限管理

权限管理命令chmod

chmod : 更改文件或目录的权限

change the permissions mode of a life

所在路径 /bin/chmod

语法: chmod [{ugoa}{+-=}{rwx}] [文件或目录]

[mode=421] [文件或目录]

-R 递归修改 (给定的目录下的所有文件和目录都会进行相应的权限改变)

ugoa: u:所拥有者(user) g:所属组(group) o:其他人(other) a:所有人(all),表明给所有人修改权限

+-=: +:增加权限 -:减少权限 =:不管以前的权限,直接赋给现在键入的权限

rwx: 权限分为r(read读权限) w(write 写权限) x(exe执行权限)

文件的权限

r : cat/more/less/head/tail

w: vim

x: script command (文件一般不具有x权限)

目录的权限如下:

r 读权限 可以查看文件内容 可以列出目录中的内容(ls)

w 写权限 可以修改文件内容 可以在目录中创建、删除文件(touch/mkdir/rm)

x 执行权限 可以执行文件 可以进入目录(cd)

可以用逗号分隔对不同类别的人(ugoa)权限改动,如chmod u+x,o-r ……


但在实际场景中,更常见的是用数字来代表权限

r —-4

w —-2

x —-1

rwxrw-r–

7 6 4

如 chmod 764 文件名

其他权限管理命令

chown: 改变文件或目录的所有者或者所属组 (change file ownership)

所在路径 /bin/chown

语法 : chown [用户][:所属组] [文件或目录]


chgrp: 改变文件或目录的所属组 (change file group ownership)

所在路径 /bin/chgrp

语法: chgrp [用户组] [文件或目录]

注: 用户创建的时候如果不属于某个组,则用缺省组


umask : 显示、设置文件的缺省权限(the user file-creation mask)

所在路径: Shell内置命令

注: 因文件一般不具有x权限,所以虽然显示的缺省组权限有x,但创建的文件都没有x权限

语法: umask [-S]

-S 以rwx形式显示新建文件缺省权限

umask 值 (方法按下图所算,且不加第一个0,来配置初始值)

注文件一般是没有x权限的

文件搜索命令

文件搜索命令find

find :搜索

所在路径/bin/find

语法: find [搜索范围] [匹配条件]


-name

eg : find /etc -name init 在给定目录下查找文件init

-iname 不区分大小写

若查找含有init的文件则改为*init*

若找开头为init后面有3个字母的文件则为 init???


-size +n 大于 -n 小于 n 等于

eg find / -size +204800 在根目录下查找大于100MB的文件

Linux大小是按数据块来的,1个数据块是512字节,0.5M,所以这里是204800而不是102400

eg find /etc -size +163840 -a -size -204800

在/etc下查找大于80MB小于100MB的文件

-a 两个条件同时满足 (and)

-o 两个条件满足任意一个即可 (or)


find /home -user 123 在根目录下查找所有者为123的文件

-group 根据所属组查找


find /etc -cmin -5 (+是超过多长时间内)

在/etc下查找5分钟内被修改过属性的文件和目录

-amin 访问时间access (对应第一个字母,min是minute)

-camin 文件属性change

-mmin 文件内容 modify


-a 两个条件同时满足 (and)

-o 两个条件满足任意一个即可 (or)

-exec/-ok 命令{} \ ; (注意花括号与斜杠之间有空格,斜杠与分号之间没有空格) 对搜索结果执行操作

ok与exec的区别在于, ok会问你是否查看,需要输入Y/N回答

-type 根据文件类型查找

f: 文件 d:目录 l:软链接文件

-type f : 只显示搜索到的文件

-inum 根据i节点查找

其他搜索命令

locate :在文件资料库中查找文件

所在路径 /usr/bin/locate

语法: locate 文件名

优点: 快速查找

缺点:若在资料库中未更新则无法查找,不在资料库管辖的目录也无法查找到如(tmp,即使updatedb后也无法查到)

updatedb: 用于更新资料库

-i : 不区分大小写


which: 搜索命令所在目录及别名信息

所在路径 /usr/bin/which

语法: which 命令

eg: which ls

路径上方的输出是别名

比如rm本身不会提示确认的,但实际是rm -i的别名所以会有提示,而你直接/bin/rm 删除的文件,无需确认直接删除(centos6不针对7及以上)


whereis: 搜索命令所在目录及帮助文档路径

所在路径 /usr/bin/whereis

语法: whereis [命令名称]


grep: 在文件中搜寻字串匹配的行并输出

语法: grep -iv [指定字串] [文件]

-i 不区分大小写

-v 排除指定字串 (去掉含有该字串的行)

-n : 输出行号

eg grep mysql /root/install.log 返回mysql的行

帮助命令

man :获得帮助信息 (manual)

所在路径 /usr/bin/man

语法: man [命令或配置文件]

空格翻页,回车往下翻,q退出,输入/-l可以迅速找到有-l的句子,按n下一页

如果想看一个配置文件详细信息(如/etc/services),直接输入man services(不能加绝对路径)

Linux帮助中得到的路径man1和man5(如通过whereis得到) , man1是针对命令的帮助, man5是对配置文档的帮助

password 有配置文件帮助,有命令的帮助,默认是命令的帮助,若要看配置文件帮助,键入man 5 password


info: 获得帮助信息

语法: info 命令


whatis: 获取命令的使用简短信息,只读取帮助文档中name部分的信息

语法: whatis 命令


apropos :获取命令配置文件的简短信息

语法: apropos 命令


help : 查询命令相关选项

语法: 命令 –help

或者: help 命令

获得shell内置命令的帮助信息(若which 命令 找不到命令路径的命令是shell内置的命令)

shell内置命令无法用man得到详细信息

用户管理命令

useradd: 添加新用户

路径 /usr/sbin/useradd

语法: useradd 用户名


passwd

所在路径 /usr/bin/passwd

语法: passwd 用户名


who:查看登录用户信息

所在路径 /usr/bin/who

语法: who


w:查看登录用户详细信息

所在路径/usr/bin/w

语法 w

压缩解压

Linux压缩格式

.gz

.zip :不许装其他软件

.rar: 装rar解压

命令

gzip: 压缩文件 (GNU zip)

路径 /bin/gzip

语法: gzip 文件

压缩过后不保存原文件

注: gzip -d是解压缩


gunzip: 解压缩.gz的压缩文件 (GNU unzip)

所在路径 /bin/gunzip

语法: gunzip 压缩文件

只能压缩文件,不能压缩目录


tar: 打包目录

所在路径 /bin/tar

语法: tar 选项[-zcf] [压缩后文件名] [目录]

-c: 打包

-v: 显示详细信t息

-f: 指定文件名

-z :打包同时压缩

若不加-z,一般是先打包再用gzip压缩(若要)

压缩后文件格式 .tar.gz

注: 虽然不加后缀名也可以,但是一般会加上,便于识别一个文件是不是压缩包

尽量采用(zcvf这个顺序)

-x:解包

-v:显示详细信息

-f: 指定解压文件

-z :解压缩

顺序尽量才有(-zxvf)


zip: 压缩文件或目录

所在路径 /usr/bin/zip

语法: zip 选项[-r] [压缩后文件名] [文件或目录]

-r 压缩目录

压缩后文件格式: .zip


unzip: 解压.zip的压缩文件

所在路径: /usr/bin/unzip

语法: unzip [压缩文件]


bzip2 : 压缩文件

所在路径 : /usr/bin/bzip2

语法: bzip2 选项[-k] [文件]

-k 产生压缩文件后保留原文件

压缩后格式 .bz2

如果是压缩目录可以用 tar -cjf(z换成j)


bunzip2: 解压缩

所在路径: /usr/bin/bunzip2

语法: bunzip2 选项 [-k] [压缩文件]

-k 解压缩后保留原文件

解压.tar.bz2 也可以用tar 的解压命令,不过把前文中的-z换成-j

网络命令

write : 给用户发信息,以Ctrl+D保存结束

所在路径 /usr/bin/write

语法: write<用户名>

进入以后输错删错了需按Ctrl + Backsapce(退格键) 或者delete

用户不在线发不出去


wall : 发广播信息(write all)

所在路径/usr/bin/wall

语法: wall [message]


ping: 测试网络连通性

所在路径/bin/ping

语法: ping 选项 IP地址

-c 指定发送次数

如果无-c选项,会一直ping除非按ctrl+C


ifconfig : 查看和设置网卡信息(注意这里针对的是centos6,对于更高版本的请根据版本决定)

所在路径 /sbin/ifconfig

语法: ifconfig 网卡名称 IP地址 (查看无需跟任何东西)

eth0 : 本地真实网卡有其他网卡则是eth1

lo: 回访网卡,本机通信于测试

注: 用这种方法设置ip,重启会自动断掉


mail : 查看发送电子邮件 针对centos6

所在路径 /bin/mail

语法: mail[用户名]

mail 不跟任何内容可以显示邮箱(弹出的界面开头的n表示new,未读 )

邮件保存在/var/spool/mail/root

进入自己的邮箱后,查看内容输入序列号即可

h: 显示当前邮箱文件

d [序列号]: 删除邮件

q : 退出

(用户不在线也能成功发送)


last : 列出目前于过去登入系统的用户信息

所在路径: /usr/bin/last

语法: last


lastlog: 列出所有用户(包括未登录过的),然后显示登录状态

所在路径 :usr/bin/lastlog

语法: lastlog


tarceroute: 显示数据包到主机间的路径

所在路径: /bin/tarceroute

语法: traceroute 主机域名


netstat: 显示网络相关信息

所在路径: /bin/netstat

语法: netstat [选项]

-t : TCP协议

-u : UDP协议

-l : 监听

-r : 路由

-n : 显示IP地址和端口号

netstat -tlum : 查看本机监听的端口

netstat -an 查看本机所有网络连接

netstat -rn 查看本机路由表


setup : 配置网络

所在路径: /usr/bin/setup

语法: settup

配ip进入网络配置

进入设备配置

自己配置需要像PHCP中的星号去掉


mount : 挂载命令

所在路径 /bin/mount

语法: mount [-t 文件系统] 设备文件名 挂载点

取消挂载直接在mount前加u即可,后面挂载点,光驱都行

一般是 mount /dev/sr0 挂载点(自己的一个目录)

关机重启命令

shutdown: 关机

语法 : shutdown [选项] 时间

-c: 取消前一个关机命令

-h: 关机

-r: 重启

shutdown -j 20:30 (20:30关机,now就是现在关机)


其他关机命令:

halt

poweroff

init 0


其他重启命令

reboot

init 6


系统运行级别

0 : 关机

1 : 单用户 : 只启动最核心的程序(类似windows的安全模式)

2: 不完全多用户,不含NFS服务 (NFS是传文件的一个简单服务)

3: 完全多用户

4: 未分配

5: 图形界面

6: 重启

1,2,3都没有图形界面

cat /etc/inittab (init的配置文件) :修改系统默认运行级别

runlevel :查询系统运行级别


logout: 退出登录命令

VIM

VIM常用操作(centos 6)

vi filename:进入命令模式

:wq :退出vim

i a o:命令模式➡插入模式 退出:ESC

:(输入冒号) :进入编辑模式


插入命令:

a : 在光标虽在字符后插入

A: 在光标所在行尾插入

i: …..字符前(省略处于a,A相同)

I: 所在行首

o: 光标下插入新行

O: 在光标上插入新行


定位命令:

:srt nu :设置行号

:set nu :取消行号

gg: 到第一行

G:到最后一行

nG:到第n行 (先退到命令模式)

:n 到第n行

$:移至行尾

0:移至行首


删除命令

x : 删除光标所在处字符

nx :删除光标后n个字符

dd : 删除光标所在行

dG: 删除光标所在行到文件末尾的内容

D : 删除光标所在处到行尾的内容

:n1,n2d : 删除指定范围的行


复制剪切命令

yy :复制当前行

nyy : 复制当前一下n行

dd : 剪切当前行

ndd : 前街当前行一下n行

p、P : 粘贴在当前光标所在行下或行上


替换和取消命令

r : 取代光标所在处字符

R : 从光标所在处开始替换字符,按ESC结束

u:取消上一步操作


搜索和搜索替换命令

/string : 搜索指定字符串, 搜索时忽略大小写: set ic

n : 搜索指定字符串的下一个出现位置 (前一个用b)

:%s /old_string /new_string /g :全文替换指定字符串, /g不询问确认, /c会讯问确认

:n1,n2s /old /new /g : 指定行替换


保存和退出命令

:w 保存修改

: w new_filename 另存为指定文件

:wq 保存修改并退出

ZZ :快捷键,保存修改并退出

:q! 不保存修改退出

:wq! 保存修改并退出(文件所有者及root可使用) , (当写权限被取消时,用此命令强行保存)

操作技巧

:r 文件名 导入当前文件中(到光标处)

:!操作命令 : 可以在不退出vim实现操作

:r !操作命令 将操作命令的结果导入vim中

:map 快捷键 触发命令

如 :map ^P I#<ESC> (注:^P可以通过ctrl+V+P一起按 或者先按ctrl +v 再按ctrl+p )

后面键入ctrl + p 就可以自动调用了

:ab 内容1 内容2 : 该定义可以使,在任何地方输入内容1按回车会让他变成内容2

注:上面内容重启后会消失,若要保存进入到对应的宿主目录中键入即可 如root : /root/.vimrc, 其他人就是/home/username/.vimrc

软件包管理

RPM包管理-rpm命令管理

RPM包命名规则

安装包一般都在光盘中

httpd-2.2.15-15.e16.centos.1.i686.rpm

httpd:软件包名

2.2.15:软件版本

15 : 软件发布次数

e16.centos 适合Linux平台

i686 : 适合的硬件平台

rmp: rpm包扩展名

rpm包依赖性

rpm包具有依赖性

比如装一个a必须要装一个b,装一个b需要装一个c

依赖模块(一般是so结尾,且模块在库文件中),去www.rpmfind.net搜索该模块在哪个库文件

安装升级与卸载

包全名: 操作的包是没有安装的软件包时,使用包全名。而且要注意路径

包名:操作已经安装的软件包时,使用包命。是搜索/var/lib/rpm/中的数据库

只对rpm有效,对yum无效


rpm安装

rpm -ivh 包全名 (一般-ivh全都写)

选项:

-i(install) 安装

-v(verbose) 显示详细信息

-h(hash) 显示进度

–nodeps 不检测依赖性 (一般不会加这条命令)


rpm包升级

rpm -Uvh 包全名

-U (upgrade)升级


rmp包卸载

rpm -e 包名(可以不写包全名)

选项:

-e(erase) 卸载

–nodeps 不检查依赖性

查询

查询是否安装

rpm -q 包命

-q (query) : 查询

rpm -qa

-a(all) : 所有


查询软件包详细信息

rpm -qi 包名

-i :查询软件信息(information)

-p :查询未安装包信息(package) (因为未安装,所以查询时输入包全名)


查询包中文件安装位置

rpm -ql 包命

-l(list) 列表

-p(package):查询未安装包信息


查询系统文件属性哪个rpm包

rpm -qf 系统文件名

-f(file) 查询系统文件属于哪个软件包


rpm -qR 包名

-R 查询软件包的依赖性 (requires)

-p 查询未安装包信息(package)


rpm包校验

rpm -V 已安装的包名

-V(verify) 校验指定RPM包中的文件

验证信息

S 文件大小是否改变

M 文件的类型或文件的权限(rwx)是否改变

5 文件MD5校验和是否改变(可以看成文件内容是否改变)

D 设备中,从代码是否改变

L 文件路径是否改变

U 文件的属主(所有者)是否改变

G 文件的属组是否改变

T 文件的修改时间是否改变

文件类型

c :配置文件

d: 普通文档

g: “鬼”文件,很少见,就是该文件不应该被这个RPM包包含

l : 授权文件

r: 描述文件

rpm包中文件提取

rpm2cpio 包全名 | \

cpio -idv .文件绝对路径 (点代表从指定文件路径提取到当前文件路径)

(rpm2cpio: 将rpm包转换为cpio格式的命令)

(cpio 一个标准工具,它用于创建软件档案文件和从档案文件中提取文件)

cpio 选项 <[文件|设备]

-i : copy-in 模式,还原

-d : 还原时自动新建目录

-v : 显示还原过程

RPM包管理-yum在线管理

yum能解决依赖性问题,yum安装服务器会自动解决依赖性问题

IP地址配置和网络yum源

网络配置

配置过程见我另一篇博客

yum源

yum源保存在/etc/yum.repos.d/CentOS-Base.repo中

内容:

[base] :容器名称,一定要放在[]中

name : 容器说明,可以自己随便写

mirrorlist :镜像站点,这个可以注释掉

baserul : 我们的yum源服务器的地址。默认是CentOs官方的ym源服务器,可以更改为其他yum源地址

enabled: 此容器是否生效,如果不写成或携程enable=1都是生效,写成enable=0就是不生效

gpgcheck : 如果是1是指RPM的数字证书生效,如果是0则不生效

gpgkey : 数字证书的公钥文件保存位置。不用修改

yum命令

查询

yum list :查询所有可用软件包列表

yum search 关键字 : 搜索服务器上所有和关键字相关的包


安装

yum -y install 包名

install 安装

-y 自动回答yes


升级

yum -y update 包名 (不加包名,是所有包,包括内核)

update: 升级

-y 自动回答yes


卸载

yum -y remove 包名

remove 卸载

尽量不要卸载,卸载也尽量不用yum,他可能把Linux系统文件一并卸载了

-y 自动回答yes


yum grouplist : 列出所有可用的软件组列表

yum groupinstall 软件组名 :安装指定软件组,组名可以用grouplist查询出来

yum groupremove 软件组名 : 卸载指定软件组

如果组名有空格,用双引号括起来

光盘yum源搭建

  1. 挂载光盘

    mount /dev/cdrom /mnt/cdrom/

  2. 让网络yum源文件失效

    cd /etc/yum.repos.d/

    mv CentOS-Base.repo \CentOS-Base.repo.bak

    mv CentOS-Debuginfo.repo \CentOS-Debuginfo.repo.bak

    mv CentOS-Vault.repo \CentOS-Vault.repo.bak

  3. 修改光盘yum源文件

    vim CentOS-Media.repo

    name = CentOS-$releasever - Media

    baseurl = file:///mnt/cdrom

    #地址为你自己的光盘挂载地址

    #file:///media/cdrom/

    #file:///media/cdrecorder/

    #注释这两个不存在的地址

    gpcheck=1

    enabled=1

    #把enabled=0改为enbaled=1,让这个yum源配置文件生效

    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

源码包管理

源码包和RPM包的区别

安装之前的区别:概念上的区别

安装之后的区别:安装位置不同


rpm包安装位置(默认位置)

/etc/ : 配置文件安装目录

/usr/bin/ :可执行的命令安装目录

/usr/lib/ :程序所使用的函数库保存位置

/usr/share/doc/ : 基本的软件使用手册保存位置

/usr/share/man/ :帮助文件保存位置


源码包安装位置(指定位置)

一般是 /usr/local/软件名/


安装位置不同带来的影响

RPM包安装的服务可以使用系统服务管理命令(service)来管理,例如RPM包安装的apache的启动方法是:

/etc/rc.d/init.d/httped start

service httpd start

而源码包安装的服务则不能被服务管理命令管理,因为没有安装到默认路径中。所以只能用绝对路径进行服务的管理

源码包安装过程

安装准备

安装c语言编译器

下载源码包


安装注意事项

源代码保存位置: /usr/local/src

软件安装位置: /usr/local/

如何确定安装过程报错:

  1. 安装过程停止

  2. 并出现error,warning或no的提示


源码包安装过程

下载源码包

解压缩下载的源码包

进入解压缩目录

./configure 软件配置与检查

定义需要的功能选项

检测系统环境是否符合安装要求

把定义好的功能选项和检测系统环境的信息都写入Makefile文件,用于后续的编辑

make 编译

如果报错了make clean 清除产生的临时文件

make install 编译安装


源码包的卸载

不需要卸载命令,直接删除安装目录即可。不会遗留任何垃圾文件

脚本安装包

脚本安装包并不是独立的软件包类型,常见安装的是源码包

是人为把安装过程写成了自动安装的脚本,只要执行脚本,定义简单的参数,就可以完成安装

非常类似Windows下软件的安装方式


Webmin是一个基于Web的Linux系统管理界面。你就可以通过图形化的方式设置用户账号、APache、DNS、文件共享等服务

可以在官网下载,在Linux安装后,可以登入网站通过图形界面对Linux进行管理

用户和用户组管理

用户配置文件

用户信息文件/etc/passwd

所以越是对服务器安全性要求高的服务器,越需要建议合理的用户权限等级制度服务器操作规范

在Linux中主要是通过用户配置文件来查看和修改用户信息


/etc/passwd

第一字段: 用户名称

第二字段: 密码标志

第三字段: UID(用户ID)

0: 超级用户

1-499: 系统用户(伪用户)

500-65535: 普通用户

第四字段: GID(用户初始组ID)

第五字段: 用户说明

第六字段: 家目录

普通用户: /home/用户名/

超级用户: /root/

第七字段: 登入之后的shell


初始组: 就是指用户一登录就立刻拥有这个用户组的相关权限,每个用户的初始组只能有一个,一般就是和这个用户的用户名相同的组名作为这个用户的初始组

附加组: 指用户可以加入多个其他的用户组,并拥有这些组的权限


shell是Linux的命令解释器

在/etc/passwd当中,除了标准Shell是/bin/bash之外,还可以写如/sbin/nologin

影子文件

第一字段: 用户名

第二字段: 加密密码

加密算法升级为SHA512散列加密算法

如果密码位是”!!”或”*”代表没有密码,不能登录

第三字段: 密码最后一次修改日期

使用1970年1月1日作为标准时间,每过一天时间戳加1

第四字段:两次密码的修改间隔时间(和第三字段相比)

第五字段:密码有效期(和第三字段相比)

第六字段: 密码修改到期前的警告天数(和第五字段相比)

第七字段:密码过期后的宽限天数(和第五字段相比)

0(不写):代表密码过期后立即失效

-1:代表密码永远不会失效

第八字段:账号失效时间

要用时间戳表示

第九字段:保留


时间戳换算

把时间戳换算为日期: date -d “1970-01-01 16066(时间戳) days”

把日期换算为时间戳: echo $(($(date –date=”2020/03/21” + %s)/86400+1))

组信息文件/etc/group和组密码文件/etc/gashadow

组信息文件/etc/group

第一字段: 组名

第二字段: 组密码标志

第三字段: GID

第四字段: 组中附加用户


组密码文件/etc/gshadow

第一字段: 组名

第二字段: 组密码

第三字段: 组管理员用户名

第四字段: 组中附加用户

用户管理相关文件

用户的家目录

普通用户: /home/用户名/ , 所有者和所属组都是此用户,权限是700

超级用户: /root/, 所有者和所属组都是root用户,权限是550


用户的邮箱

/var/spool/mail/用户名/


用户模板目录

/etc/skel/

在这里面的文件会默认添加到新创建用户的家目录中

用户管理命令

useradd

useradd [选项]用户名 :添加用户

-u UID: 手工指定用户的UID号

-d 家目录: 手工指定用户的家目录

-c 用户说明: 手工指定用户的说明

-g 组名: 手工指定用户的初始组

-G 组名: 指定用户的附加组

-s shell : 手工指定用户的登录shell 。 默认是 /bin/bash

若设置的时候一行写不完,在第一行最后一个位置写上,代表一行写不完换行的意思(不加也行,但加上更有结构性)


用户默认值文件

/etc/default/useradd

GROUP=100 用户默认组 (公有模式,Linux现在大多是私有模式)

HOME=/home 用户家目录

INACTIVE = -1 密码过期宽限天数

EXPIRE = 密码失效时间

SHELL = /bin/bash 默认shell

SKEL=/etc/skel 模板目录

CREATE_MAIL_SPOOL= yes :是否建立邮箱

/etc/login/defs

PASS_MAX_DAYS 99999 密码有效期

PASS-MIN-DAYS 0 密码修改间隔

PASS_MIN_LEN 5 : 密码最小5位

PASS_WARN_AGE 7 密码到期警告

UID_MIN 500 :

GID_MAX60000 :最小和最大UID范围

ENCRYPT_METHOD SHA512 : 加密模式

passwd

passwd [选项] 用户名

不加用户名默认为给当前用户设密码,普通用户是不能写用户名的(包括自己),只能超级用户才行

-S 查看用户密码的密码状态,仅root用户可用。

-l 暂时锁定用户。root可用

-u 解锁用户,root可用

–stdin 可以通过管道符输出的数据作为用户的密码

用户管理命令usermod和chage

usermod [选项] 用户名 修改用户信息

-u UID : 修改用户的UID号

-c 用户说明 : 修改用户的说明信息

-G 组名 : 修改用户的附加组

-L: 临时锁定用户(lock)

-U :解锁用户所送(Unlock)


change [选项] 用户名 :修改用户密码状态

-l: 列出用户的详细密码状态

-d 日期: 修改密码最后一次更改日期(shadow3字段)

-m 天数 : 两次密码修改间隔 (4字段)

-M 天数 : 密码有效期(5字段)

-W 天数 : 密码过期前警告天数 (6字段)

-I 天数 : 密码过后宽限天数 ( 7字段)

-E 日期: 账号失效时间

删除用户userdel,用户切换命令su

userdel [-r] 用户名

-r 删除用户的同时删除用户家目录


查看用户ID

id 用户名


切换用户身份su

su [选项] 用户名

-(坚决不能省): 选项只是用”-“代表连带用户的环境变量一起切换

-c 命令: 仅执行一次命令,而不切换用户身份

如su -root -c “useradd user0”

用户组管理命令

groupadd [选项] 组名

选项:

-g GID: 指定组ID


修改用户组

groupmod [选项] 组名

-g GID : 修改组ID

-n 新组名: 修改组名


删除用户组

groupdel 组名

有初始用户不能删,只有附加用户可以删


gpasswd 选项 组名

-a 用户名 : 把用户加入组

-d 用户名 : 把用户从组中删除

权限管理

ACL权限

简介与开启

可以针对单用户设置权限

dumpe2fs -h /dev/sda3

dumpe2fs命令是查询指定分区详细文件系统信息的命令

-h : 仅显示超级块中信息,而不显示磁盘块组的详细信息


临时开启分区ACL权限

mount -o remount,acl


永久开启分区ACL权限

vi /etc/fastab 进入配置文件改动(具体时搜索即可)

mount -o remount (重新挂载,使之生效)

查看与设定ACL权限

查看ACL命令

getfacl 文件名


设定ACL权限的命令

setfacl 选项 文件名

-m : 设定ACL权限

-x : 删除指定的ACL权限

-b : 删除所有的ACL权限

-d : 设定默认ACL权限

-k : 删除默认ACL权限

-R : 递归设定ACL权限

如: setfacl -m u:name:rx 文件名

(u代表user,如果时组则为g , name为用户名或组名,rx为权限)

设置以后ls -l 文件权限后会跟一个”+”

最大有效权限与删除

最大有效权限mask

mask是用来指定最大有效权限的。如果我给用户赋予了ACL权限,是需要和mask的权限”相与”(两边都为真才为真)才能得到用户的真正权限

setfacl -m m:权限 文件名 : 修改最大有效权限


删除ACL权限

setfacl -x u:用户名 文件名 (删除用户)

serfacl -x g:组名 文件名 (删除组)

serfacl -b 文件名 (删除文件所有的ACL权限)

默认与递归ACL权限

递归ACL权限:父目录在设定ACL权限时,所有的子文件和子目录也会拥有相同的ACL权限

setfacl -m u:用户名:权限 -R 目录

注: 该命令不针对新创建的文件,如果希望新文件遵守,需要设置默认ACL权限


默认ACL权限针对所有新创建的文件

setfacl -m d:u:用户名:权限 目录

文件特殊权限

SetUID(U指USER)

只有可以执行的二进制程序才能设定SUID权限

命令执行者要对该程序拥有x(执行)权限

命令执行者在执行该程序时获得该程序文件所有者的身份

SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效

如:

passwd命令拥有SetUID权限,所以普通用户可以修改自己的密码

cat命令没有SetUID权限,所以普通用户不能查看/etc/shadow文件内容

(如果有该权限,ls -l x(执行权限)的位置会显示s,GID是g,BIT是b)


设定SetUID的方法

4代表SUID 2代表SGID 1代表SBIT 7代表代表(3者都有)

chmod 4755 文件名

chmod u+s 文件名

若显示S,则代表报错(无x执行权限)


取消SetUID的方法

chmod 755 文件名

chmod u-s 文件名

SetGID

与SetGID不同的是,SGID是组身份升级为该程序文件的属组

SetGID还可以针对目录,普通用户必须拥有r和x权限

普通用户在该目录新建的文件默认属组是这个目录的属组

Sticky BIT

粘着位目前只对目录有效

普通用户对该目录拥有w和x权限,即普通用户可以在此目录拥有写入权限

如果没有粘着位权限,普通用户拥有w权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。一旦赋予了粘着位,除了root可以删除所有文件,普通用户就算拥有w权限,也只能删除自己建立的文件,不能删除其他用户建立的文件


设置粘着位

chmod 1755 目录名

chmod o+t 目录名

取消粘着位

chmod 777 目录名

chmod o-t 目录名

chattr权限

chattr [+-=] [选项] 文件或目录名

+/-/=:增加/删除/等于 权限

选项

i: 对文件设置,不允许对文件进行删除、改名,添加修改数据。对目录设置,只能修改目录下文件的数据,但允许建立和删除文件

a: 对文件,只能在文件中增加数据,不能删除和修改数据。对目录设置,那么只允许在目录中建立和修改文件,但是不允许删除

增加数据不能通关vim进入修改数据,而只能用追加方法

注:包括root

例: chattr +i 文件名


查看文件系统属性

lsattr 选项 文件名

-a :显示所有文件和目录

-d :若目标是目录,仅列出目录本身的属性,而不是子文件

sudo权限

sudo权限:root把本来只能超级用户执行的命令赋予普通用户执行

sudo的操作对象是系统命令


sudo的使用

visudo: (实际修改的是/etc/sudoers文件)

root ALL=(ALL) ALL

用户名 被管理主机的地址 = (可使用的身份) 授权命令(绝对路径)

%wheel ALL=(ALL) ALL

%组名 被管理主机的地址= (可使用的身份) 授权命令(绝对路径)


例如授权sc用户可以重启服务器

sc ALL= /sbin/shutdown -r now


普通用户执行sudo赋予的命令

sudo -l : 查看可用的sudo命令

sudo /sbin/shudown -r now : 普通用户执行sudo赋予的命令

文件系统管理

文件系统常用命令

df、du等命令

df [选项] 挂载点

-a 显示所有的文件系统信息,包括特殊文件系统

-h 使用习惯单位(kb,mb)显示容量

-T 显示文件系统类型

-m 与MB为单位显示容量

-k 以KB为单位显示容量。默认是KB


du [选项] [目录或文件名] :统计目录或文件大小

-a :显示每个子文件的磁盘占用量

-h

-s 统计总占用量,而不列出子目录和子文件的占用量


fsck [选项] 分区设备文件名

-a : 不用显示用户提示,自动修复文件系统

-y : 自动修复。和-a作用一致,不过有些文件系统只支持-y

(尽量不要用)

挂载命令

mount [-l] :查看已挂载的设备,-l显示卷标名称

mount -a 依据配置文件/etc/fstab内容,自动挂载


挂载命令格式

mount [-t 文件系统] [-L 卷标名] [-o 特殊选项] 设备文件名 挂载点

挂载光盘和U盘

挂载光盘

mkdir 建立挂载点

mount -t iso9660 挂载点 挂载位置 : 挂载光盘

mount /dev/sr0 mnt/cdrom/


umount 设备文件名或挂载点


挂载u盘

fdisk -l : 查看U盘设备文件名

mount -t 设备文件名 挂载点

unmount : 卸载

Shell基础

概述

Shell是一个命令行解释器,为用户提供向Linux内核发送请求的界面程序

Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令

脚本执行方式

echo [选项] [输出内容]

-e : 支持反斜线控制的字符转换


shell脚本第一排一定要写上#! /bin/bash告诉这是一个Shell脚本,否者可能会报错


脚本执行

赋予执行权限,直接运行:

chmod 755 文件名

./文件名

通过bash调用执行脚本

bash 文件名


dos2unix 文件名 (可以将windows下写的shell脚本转换成Linux)

Bash基本功能

历史命令与补全

history [选项] [历史命令保存文件]

-c : 清除历史命命令

-w : 把缓存中的历史命令写入历史命令保存文件

保存在该用户目录下 .bash.history (如果无-w要退出后才会将此次登录保存在内)

默认1000条,若要更改,在/etc/profile HISTSIZE更改


历史命令的调用

使用上、下箭头调用以前的历史命令

使用”!n” 重复执行第n条历史命令

“!!” 重复执行上一条命令

“!字串” 重复执行最后一条以该字串开头的命令


命令与文件补全

在Bash中,在输入命令或文件时,按tab 会自动进行补全

命令别名与常用快捷键

alias 别名=’原命令’ :设定命令别名

alias 查询命令别名


让别名永久生效 : vi /root/.bashrc


unalias 别名 :删除别名

输入输出重定向

输出重定向

命令 > 文件 : 以覆盖的方式,把命令的正确输出输出到指定的文件或设备

命令 >> 文件 : 以追加的方式,把命令的正确输出输出到指定的文件或设备

错误命令 2> 文件 以覆盖的方式,把命令的错误输出输出到指定的文件或设备

错误命令 2>> 文件 以追加的方式,把命令的错误输出输出到指定的文件或设备

命令>文件2>&1 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中

命令>>文件2>&1 以追加的方式,把正确输出和错误输出都保存到同一个文件当中

命令&>文件 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中

命令&>>文件 以追加的方式,把正确输出和错误输出都保存到同一个文件当中

命令>>文件1 2>>文件2 把正确的输出追加到文件1中,把错误的输出追加到文件2中。

/dev/null :放入这里面的文件会直接删除


输入重定向

wc [选项] [文件名]

-c 统计字节数

-w 统计单词数

-l 统计行数

wc < 文件名 把文件作为命令输入 (返回的时字节数,单词数,统计行数)

多命令顺序执行与管道符

多命令执行

;

格式 命令1 ; 命令2 多个命令顺序执行

&&

命令1 && 命令2 逻辑与 , 命令1正确执行,命令2才会执行

||

命令1 || 命令2 命令1执行不正确,命令2执行 , 命令1正确执行,命令2不会执行


管道符

格式 : 命令1 | 命令2 : 命令1的正确输出作为命令2的操作对象


在Linux中 “”内的内容会转义,’’内的时系统命令

反引号赋值的会按系统原样,如echo ‘ls’ 与执行 ls 一样

Bash变量

用户自定义变量

name=”123”

调用 echo $name


变量查看

set

变量删除

unset 变量名

环境变量

export 变量名=变量值 : 申请变量

如果将一个已设置的变量变为环境变量直接 export 变量名 即可

env: 查询变量

unset 变量名 : 删除变量

位置参数变量

$n : n为数字,0代表本身 , 1-9 为第一个到第九个参数,十以上的参数需要用大括号包含,如${10}

在执行脚本命令后面即可输入参数

更多的使用时,搜索即可

预定义变量

$$ 当前进程的进程号 (PID)

$! 后台运行的最后一个进程的进程号(PID)


接受键盘输入:

read [选项] [变量名]

-p “提示信息” : 在等待read输入时,输出提示信息

-t 秒数 : read命令会一直等待用户输入,使用此选项可以指定等待时间

-n 字符数: read命令只接受指定的字符数,就会执行

-s : 隐藏输入的数据,适用于机密信息的输入

Bash的运算符

数值运算与运算符

在Linux中变量默认为字符型,如

a=1 ; b=2;c=$a+$b

c现在实际上是1+2


declare [+/-] [选项] 变量名

-: 给变量设定类型属性

+: 取消变量的类型属性

-i:将变量声明为整数型

-x: 将变量声明为环境变量

-p:显示指定变量的被声明的类型


数值运算方法1

declare -i c=$a+$b

2:使用expr或let数值运算工具

c = $(expr $a + $b)

3: “$((运算式))” 或 “”$[运算式]”

c = $(($a+$b)) 或 c =$[$a+$b]

环境变量配置文件

简介

source : 配置文件 (修改配置文件后无需重启,直接让该配置文件生效)

或 .配置文件

Shell编程

字符截取命令

cut字段提取命令

cut [选项] 文件名

-f 列号: 提取第几列

-d 分隔符 : 按照指定分隔符分隔列 (默认是tab)

printf命令

printf ‘输出类型输出格式’ 输出内容

输出类型:

%ns: 输出字符串,n是数字指输出几个字符

%ni:

%m.nf :m代表整数位数, n代表小数位数

awk命令

awk ‘条件1{动作1} 条件2{动作2}…’ 文件名 (会提取列,$2就可以代表第二列)

条件,一般使用关系表达式作为条件

如:x>10 判断变量x是否大于10

动作,

格式化输出与流程控制语句

在awk中可以用printf和print(Linux中无print),print会在每次执行的结束自动加上换行符


BEGIN(做awk的条件,在做所有数据读取之前做跟上的动作)

awk ‘BEGIN’


END:与BEGIN相反


FS内置变量(指定分隔符)

放在动作中如{FS = “:”}

一般会在FS动作前加一个BEGIN,因为awk会先读取一条内容,再读取发生的动作

sed命令

sed是一种几乎在所有UNIX平台(包括Linux)的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令

set [选项]’[动作]’ 文件名

-n : 一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕

-e: 允许对输入数据应用多条sed命令编辑

-i: 用sed的修改结果直接修改读取数据的文件而不是由屏幕输出

动作:

a\ : 追加,在当前行后添加一行或多行

c: 行替换

等等

eg: sed ‘s/旧字符/新字符串/g’ 文件名

sed ‘3s/74/99g’ 文件名 在第三行把74换成99 (未加3则代表从全文查找)

字符处理命令

排序命令

sort [选项] 文件名

-f 忽略大小写

-n: 以数值型进行排序,默认使用字符串型排序

-r : 反向排序

条件判断

判断文件类型

test [选项] 文件 或 [选项 文件]

-b :判断该文件是否存在,并且是否为块设备文件(是块设备文件为真)

等,使用时搜索即可


判断文件权限

-r 文件 : 判断该文件是否存在’+’,并且是否该文件拥有读权限(有读权限为真), 三种类型,只要有一种类型有就有

等等


两个文件之间也能进行比较

比如 :文件1 -nt 文件2 判断文件1的修改时间是否比文件2的新 (新为真)

流程控制

if语句

单分支if条件语句

if [ 条件判断式 ] (中括号与条件判断式之间有空格)

then

程序

fi


双分支if条件语句

if [条件判断式]

​ then

条件成立

else

条件不成立,执行另一个程序

fi


多分支if条件语句

if [条件判断式1]

then

程序

elif [条件判断式2]

then

…

fi

case语句

case $变量名 in

“值1”)

如果变量的值等于值1,执行程序1

;;

“值2”)

….

esac

for循环

for 变量 in 值1 值2 值3… (几个值执行几次)

do

程序

done


for ((初始值;循环控制条件;变量变化))

do

​ 程序

done

while循环与until循环

while [ 条件判断式 ]

do

程序

done


until循环是条件不成立执行

与while格式一样

服务管理

服务分类

chkconfig –list

查看服务自启动状态,可以看到所有RPM包安装的服务

查看服务安装位置一般是/usr/local

RPM服务的管理

独立服务管理

RPM包安装在默认位置中

源码包安装在指定位置,一般是/usr/local/


独立服务的启动

/etc/init.d/独立服务名 start|stop|status|restart|

service 独立服务名 start|stop|restart|status


独立服务的自启动

chkconfig [–level 运行级别] [独立服务名] [on|off]

修改/etc/rc.d/rc.local

使用ntsysv命令管理自启动

Linux系统管理

进程管理

进程查看

ps aux : 查看系统中所有进程,使用BSD操作系统格式

ps -le : 查看系统中所有进程,使用Linux标准命令格式

USER:进程得用户

PID:进程ID号

%CPU

%MEM:该进程占用物理内存

VSZ:占用虚拟内存

RSS:占实际物理内存

TTY:该进程由哪个终端(具体终端遇见时搜索)


查看系统健康状态

top [选项]

-d 秒数 : 指定top命令每隔几秒更新,默认是3秒

交互模式可执行得命令

?或h : 显示交互模式得帮助

P: 以CPU使用率排序

M:以内存得使用率排序

N:以PID排序

q:退出top


查看进程树

pstree [选项]

-p : 显示进程PID

-u : 显示进程得所属用户

终止进程

kill 进程号 : 终止进程

kill -l :查看可用得进程信号

信号具体值使用时搜索即可


killall [选项] [信号] 进程名 : 按照进程名杀死进程

-i : 交互式,询问是否要杀死某个进程

-I : 忽略进程名得大小写

工作管理

把进程放入后台

一种直接在后面加& : 进入后台继续运行

一种是命令执行过程中按下ctrl+z :进入后台并暂停


查看后台工作

jobs [-l]

-l : 显示工作的PID

+号代表最近一个放入后台的工作,也是工作恢复时,默认恢复的工作


将后台暂停的工作恢复到前台执行

fg %工作号

%工作号: %号可以省略,但是注意工作号和PID的区别


后台暂停工作恢复到后台执行

bg %工作号

需要与前台交互的进程无法使用该命令

系统资源查看

vmstat [刷新延时 刷新次数 ]


dmesg开机时内核检测信息(硬件信息)

dmesg


查看内存使用状态

free [-b|-k|-m|-g]

-b : 以字节为单位显示

-k : 以KB为单位显示,默认是以KB

-m : 以mb

-g : 以GB


显示cpu信息

cat /proc/cpuinfo


uptime

显示系统的启动时间和平均负载,也就是top命令的第一行。w命令也可以看到这个数据


uname [选项]

-a : 查看系统所有相关信息

-r : 查看内核版本

-s : 查看内核名称


file /bin/ls

判断当前系统的位数


lsb_release -a

查看Linux系统的发行版本


lsof [选项] :查看进程调用或打开的文件的信息

-c 字符串 : 只列出以字符串开头的进程打开的文件

-u 用户名: 只列出某个用户的进程打开的文件

-p pid : 列出某个PID进程打开的文件

系统定时任务

crongd服务管理与访问控制

service crond restart


crontab [选项]

-e : 编辑crontab定时任务

-l : 查询任务

-r : 删除当前用户所有的crontab任务

格式

* * * * *

分别为一个小时当中的第几分钟,一天当中的第几小时,一个月当中的第几天,一年当中的第几月,一周当中的星期几

日志管理

简介

日志(rsyslogd)

日志大多在/var/log下(使用时搜索即可)

备份

dump [选项] 备份之后的文件名 原文件或目录

-level: 0-9十个备份机背

-f 文件名 : 指定备份之后的文件名

-u : 备份成功之后,把备份时间记录在/etc/dumpdates文件之中

-v : 显示备份过程中更多的输出信息

等


恢复命令

restore [模式选项] [选项]

模式选项有4种

-C : 比较备份数据和实际数据变化

-i : 进入交互模式

-t: 查看模式,查看备份文件拥有哪些数据

-r: 还原数据,用于还原数据

选项:

-f:指定备份文件的文件名

HTML+CSS+JS 学习

发表于 2019-12-24 | 分类于 -[ctf学习之路] -[语言学习]

学习网站

HTML

标签

1
2
3
4
5
6
7
8
9
10
11
12
<!-- html5 的基本头-->
<!DOCTYPE html> <!--声明。(HTML5)-->
<html>
<head lang="en"> <!--以及头部head,语言-->
<meta charset="UTF-8"> <!--设置编码-->
<title></title> <!--标题,显示的网页边栏的标题-->
</head> <!--头结束-->

<body> <!--网页主体部分-->

</body> <!--主体结束-->
</html> <!--网页结束-->
  1. :标题 可为h1,h2……h6。

  2. </p>

    : 包围的部分为一个段落,不需要再输入换行标签

  3. 超链接:导入其他网站

    *<a href=”网页url”> *“网页上链接显示的内容”</a>

  4. <img src=”路径(相对/绝对)”> :显示图片

  5. <br/>:换行

  6. HTML格式化 (均需要结束标记)

    <b>:定义粗体文本

    <big>: 定义大号字

    <em>: 定义着重文字

    <i>: 定义斜体字

    <small>: 定义小号字

    <strong>: 定义加重语气

    <sub>: 定义下标字

    <sup>:定义上标字 类似于次方的数字上标

    <ins>: 定义插入字 下划线

    <del> : 定义删除字

标签属性

  1. <h1>:align对齐方式 —— <h1 align = “right”></h1>

  2. <body>:bgcolor背景颜色 ,background设置背景图片

  3. <a>: target规定在何处打开链接 _blank 新页面 , _self本地打开

  4. 通用属性

    class : 规定元素类名

    id : 规定ID

    style : <style type=”text/css”></style> 规定元素样式,一般放在头文件(head包括中的),

    title : 规定元素的额外信息

HTML样式

  1. 标签:

    <style>:定义样式

    <link>: 资源引用

  2. 属性:

    rel = “stylesheet”:外部样式表

    type = “text/css”: 引入文档的类型

    margin-left: 边距


三种样式表插入方法:

  • 外部样式表:从外部文件中导入,放在head中

    <link rel=”stylesheet” type=”text/css” herf= “mystyle.css”>

  • 内部样式表:直接在网页内部书写

    <style type= “text css”>

    body {background-color: 颜色}

    p {margin-left: 20px}

    </style>

  • 内联样式表:

    <p style= “color:red”> ——直接在标签中改


HTML链接

链接数据

  1. 文字链接

    1
    <a href="地址">'你想要变成链接的文字'</a>
  2. 图片链接

    1
    2
    3
    <a here="地址">
    <img src="图片地址" width="100px" height="100px">
    </a>

属性

  1. href属性:执行另一个文档的链接

  2. name属性:创建文档内的链接

    1
    2
    <a name="tips"> hello </a>
    <a here="#tips">跳转到hello</a> //点击后会跳转到hello处

img标签属性

  1. width属性
  2. height属性
  3. alt属性:指定图片无法显示时候,显示文本内容

例子见图片链接

表格

基本标签

<table>:定义表格

<caption>:定义表格标题

<th>:定义表格的表头

<tr>:定义表格的行

<td>:定义表格的单元

<thead>:定义表格的页眉

<tbody>:定义表格的主题

<tfoot>:定义表格的页脚

<col>:定义表格的列属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<table border = "1" cellpadding="10">  //加上border才有表格显示,cellpadding是边距使表格变大
//cleespcing单元格的间距,bgcolor颜色
//background加上图片
<caption>表格</caption> //标题
<tr>
<th>单元</th> //表头有着重效果
</tr>
<tr>
<td>单元格</td>
</tr>
<tr>
<td>单元格</td>
</tr>
</table>

列表

基本标签

<ol>有序列表

<ul>无序列表

<li>列表项 (li放在ul,ol中)

<dl>列表

<dt>列表项

<dd>描述

dd嵌套在dt中再嵌套在dl中

属性

  1. <ul><li>: disc,circle,square(实体元 ,空心元,方块实体)

    1
    <ul type = "disc/circle.square"> </ul>
  2. <ol><li>: A 、a、l、i(更改显示序列是数字还是字母….) start(设置序列开始的数字/字母…) , (使用时网上搜索即可,后文一致)

    1
    <ol type = ""></ol>
  3. ul/ol li 可以互相嵌套,列表中加入列表

块

块元素

特点:每次以新行开始:如p,h1

<!– 块–>:注释

内联元素

不会以新行开始如, <b> ,<a>,<img>

div 元素

主要组合HTML容器

span元素

内联元素,可作为文本的容器,可用他包裹一部分,然后再在css文件中进行更改,将span包裹的部分样式更改

HTML 布局

  1. 使用<div>元素布局:用多个div语句然后加上不同id,通过不同id使用css样式将多个div包裹的语句展示在网页的不同位置
  2. 使用<table>元素布局

HTML表单

为了获取不同类型用户的输入

标签

<form>: 表单

<input>:输入域

<textarea>:文本域

<label>:控制标签

<fieldset>:定义域

<legend>:域的标题

<select>:选择列表

<optgroup>:选项组

<option>:下拉列表的选项

<button>:按钮

<checkbox>:复选框

<radio>:单选框

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<form>
用户名:
<input type="text">
密码:
<input type="password">
你喜欢的水果://复选框
苹果<input type="checkbox"> //会在苹果后出现一个框,可以点击代表选择
香蕉<input type="checkbox"> //可多选
你的性别 //单选框
男<input type="radio" name="sex"> //name 将两个集合在一起,否则没有单选的效果
女<input type="radio" name="sex">
请选择数字 //下拉列表
<select>
<option> 1</option>
<option> 2</option>
<option> 3</option>
</select>
//文本域,row,cols,代表行于列
<textarea cols="30" rows="30">在此填写你的个人信息</textarea>
//创建按钮
<input type="button" value="按钮"> // value代表的是在按钮上显示的值
<input type="submit" value="提交">
</form>

表单与PHP进行交互

1
2
3
4
5
<form cation="为PHP地址" method="get/post"> //提交后会跳转到PHP地址
用户名: <input type = "text" name="name">
密 码: <input type = "password" name="password">
<input type="submit" value="提交" >
</form>

框架

使用<iframe>标签

1
2
3
<iframe src="frame地址"> //frame地址中有html语句,这样就可以将不同展示效果集中到一个网页中,同时可以在地址中的html继续使用iframe可以实现嵌套

</iframe>

背景

标签

background:背景图片

bgcolor:背景颜色,用 #ABC(A,B,C分别代表用16进制从0到FF,注:每个都是两位) , 也可以用颜色名字如blue,red。

1
<body background = "图片地址" bgcolor="">

实体

将预留字符串替换成字符(将例如<h1>关键词在网页中展现出来)

如左尖括号用&lt表示

使用时直接网上搜索即可

全局属性

  1. contenteditable:可编辑列表 默认为可编辑,若等于false则不可编辑

  2. designMode: 两个值on与off,on为可编辑

  3. hidden:掩盖元素,true与false,默认为true

  4. spellcheck:对用户的输入进行语法检查,如单词拼写错下面会有红线

  5. tabindex:设置按下table跳转到位置, 值为1,2,3,;值代表跳转顺序 (一般是针对链接表单)

HTML5新增标签(元素)

article元素

代表文档、页面或应用程序中独立的、完整的\可以独自被外部引用的内容

可以嵌套与表示插件

section元素

用于对网站应用程序中页面上的内容进行分块,与article相比,section是强调段落,article强调独立的一块,如在article中嵌套section

nav元素

用作页面导航的连接组,用nav将不同a元素所指向的链接包裹起来一般是将其包裹列表

aside元素

用来表示当前页面或文章的附属信息部分,一般用来包含当前页面或主要内容相关的引用、侧边栏、广告等

header元素

用来定义文档的页眉

footer元素

定义文档或节的页脚,通常用来包含文档的作者、版权信息等

address元素

一般用于文档或文章的作者/拥有者的联系信息

包裹的文本通常呈现斜体

form元素

注:前文是form标签,这里是属性

1
2
3
4
<form id = "testform">
<input type = "text">
</form>
<textarea form="testform "></textarea> // 按规范,一般是将该行放在form标签中,但这里的form属性和form标签id一样,则可以放在form标签后面

required元素

添加此属性后,若未输入内容则无法提交

CSS

基础语法

selector {

property:value

}

slector:选择器

property:属性

value:更改的值

属性多于1个,用分号隔开

值大于一个,需要加上引号

1
2
3
4
5
h1{
font-size:14px;
color:red;
font-family :"sans serif";
}

高级语法

选择器的分组

1
2
3
4
5
h1,h2,h3,h4,h5,h6{

color:red;

}

继承

1
2
3
body{
color:green;
}

派生选择器

若原文中有两个strong标签,分别被p标签和li标签所包裹,现在需要更改li标签中strong中的样式而不更改p标签中的样式

1
2
3
4
5
6
li strong{
color:red
}
strong{
color:blue //不会覆盖上面的stong所设定的样式
}

id选择器

id选择器可以为标有id的HTML元素指定特定的样式,id选择器以”#来定义”

1
2
3
4
5
6
7
8
9
10
11
<p id = "pid">hello css</p>  //这是html中的语句
<div id= "1">
测试
</div>

#pid{ //css语句
color:red
}
#1{
color: blue
}

也可以将id与派生选择器一起使用,eg: #id名 标签名 (即id下的其他标签)

类选择器

类选择器以一个点显示

类选择器也可以与派生选择器一起使用,css样式的.类名后加空格再加其他标签即可

1
2
3
4
5
6
7
8
9
10
11
//html语句
<p class="class1">class代表一个类</p>
<div class="class2">将class放在div中</div>

//css语句
.class1{
color:blue
}
.class2{
color:red
}

注:类选择器的class可以存在相同的class值,而id只能出现一次

属性选择器

对指定属性的HTML元素设置样式,直接 [属性]{ }加样式即可

还有属性和值选择器,html中会对属性赋值,可以用 [属性= “值”]{ }加上样式

样式

只列举了部分,因为我只是为了学语法,所以具体应用缺什么谷歌即可

背景

  1. background-attachment:背景图像是否固定或者随着页面的其余部分滚动

  2. background-color: 这是元素的背景颜色

  3. background-image: 把图片设置为背景 // 用法: background-image: url(“地址”)

  4. background-position:设置背景图片的起始位置(有几种位置,right,left等等,网上搜搜即可)

    注:有2个值,一个代表显示的位置,一个代表显示部位从哪儿开始,也可以填具体数值(百分数),代表距离左(右)多少

  5. background-repeat:设置背景图片是否及如何重复 // 当图片太小而被设置为背景时,默认是将图片重复来充满网页

    有几个值background-repeat:。 repeat:允许重复 repeat-x(y):x(y)轴重复 no-repeat:不允许重复

  6. background-size:规定背景图片的尺寸

  7. background-origin:规定背景图片的定位区域

  8. background-clip:规定背景的绘制区域


一下为更改一些基本属性,并不只针对背景

Padding:内边距(文字离边框的距离)

width:更改宽度

文本

  1. color:颜色
  2. direction:文本方向

CSS定位

改变元素在页面上的位置

定位机制

普通流:

元素按照在HTML中的位置绝对排布的过程

浮动

  1. 浮动

    浮动即浮动在页面之上

    float属性可以用的值

    • left:向左浮动
    • right
    • none:不浮动
    • inherit:从父级继承浮动属性
  2. clear属性:

    去掉浮动属性(部分元素会继承浮动,用clear清除)

    • left:去掉向左浮动
    • right
    • both
    • inherit

绝对布局

定位属性

如position,top,left等

例如:position有四个属性 absolute,fixed,relative,static,代表该位置快布局时的属性

  1. relative:相对布局,该部分显示完后,再跟其他内容

    若块与块之间覆盖,可用z-index:数字 来决定哪一个块在上面(谁覆盖谁,谁大谁覆盖谁)

    绝对布局也存在覆盖问题

  2. absolute,位置确定,若有其他显示在该位置,会将其覆盖

  3. fixed:当滚动页面的时候,该块任固定在原来页面的位置(随页面移动而移动)

  4. static:静态的,设置偏移如width,对它是没有效果的

CSS盒子模型

包括margin、border、padding、content部分组成(如内边框,外边框,高,宽,内容等)

具体内容网上搜索即可

JavaScript

基础

JavaScript组成

  1. ECMAScript:解释器、翻译,将语言翻译成计算机能识别的语言

    几乎没有兼容问题

  2. DOM:Document Object Model,赋予js操作html的能力,如获取id,元素等

    有一些操作不兼容

  3. BOM: Browser Object Model ,赋予操作浏览器的能力

    各组成部分的兼容性,兼容性问题由来

    完全不兼容

变量

var 变量 = “值”

变量类型

typedof 变量 可以得到变量类型

number,string,boolean,funtion(函数),object(对象),undefined

类型转换

显示类型转换(强制类型转换)

parseInt:转换成数字 (可能会遇到NaN:Not a Number ,NaN与NaN不等)

parseFloat:转换小数

隐式类型转换

==,===

减法

流程控制

js中流程控制与c类似,if ,switch,?:,break,continue

循环可以用

1
2
3
4
for(var i in arr)
{
alert(i)
}

这种格式,输出i中所有内容

Json

定义见谷歌

当你定义一堆变量后认为太复杂了可以用json

如

1
2
3
4
5
6
7
var a = 12;
var b = 5;
var c = 'abc';

var json = {a:12 , b: 5 , c:'abc'} // 不同于数组,数组用的[]
alert(json.a) ; //拿出json中的a
alert(json['a']) ;

json与数组的区别

  1. json是字母下标,而数组是数字
  2. 数组可以用 数组.length 获取数组有多少个元素,而json不行
  3. 数组循环可以用 数组,length 来进行判别, 而json用 for(var i in json)

数组

创建方式有多种:

  1. var a = [1,2,3];
  2. var a=new Array(1,2,3);

添加

arr.push():从尾部压进

arr.unshift():从头部加进

arr.spilice(起点,长度,要插入的元素):先删除元素再插入元素(若只需要插入,让长度为0即可)

删除

arr.pop:从尾部删除

arr.shift:从头部删除

arr.spilice(起点,长度):从什么位置开始删,删多长

其他

sort:排序(默认将数组中的数字当作字符串排序,解决方案谷歌一下)

contact:链接

join():用参数的连接符将数组连接

函数

funtion 函数名

argument:可以函数中使用,他是一个数组,数组里是传入的参数(定义函数的时候可以不写形参,但在引用函数的时候加入参数,然后用argument实现调用)

定时器

开启

setInterval(函数,时间): 每隔时间毫秒,执行一次函数

setTimeout(函数,时间):过时间毫秒,执行一次(只执行一次)

注:函数不加括号,时间单位是毫秒

关闭

clearInterval(参数):关闭计时器

clearTimeout

注:想关闭指定的定时器,在前面使用的时候需要先赋值,如令一个变量=定时器语句

DOM基础

简单来说就是平时见到的doument前缀

DOM节点

childNodes:子节点 (注:因浏览器原因,空白处也会被当作文本节点)

nodeType:查看节点样式,3是文本节点,1是元素节点

parentNode:父节点

offsetparent:获取定位的父级

首尾子节点

  1. firstChild:第一个节点(可能包括文本节点)

    firstyElementChild:第一个元素节点 (后面类似)

  2. lastChild

兄弟节点

  1. nextSibling
  2. previousSibling

DOM方式操作元素属性

  1. setAtrribute(名称,值)
  2. getAttribute(名称)
  3. removeAtrribute(名称)

创建、插入和删除元素

创建

  1. createElement(标签名):创建一个节点

  2. appendChild(节点):追加一个节点(末尾)

    父级.appendChild(节点) :在父级增加一个节点(先创建再插入)

    注:会先把元素从原有父级上删掉,再添加

插入

  1. inserBefore(子节点,原有节点):在原有节点之前插入

删除

  1. removeChild(节点)

文档碎片(基本没使用)

创建文档碎片

  1. creatementDocumentFragment();

表格应用

获取

  1. tBodies与getElementsByTagName(‘tbody’)效果一样

    row与getElementByTagName(‘tr’)

    cless与getElementByTagNmae(‘td’)

    注:三者都是数组

面向对象

面向对象编程(OOP)的特点

  1. 抽象:抓住核心问题
  2. 封装:不考虑内部实现,只考虑功能
  3. 继承:从已有对象上,继承出新的对象

对象的组成

  1. 方法:函数
  2. 属性:变量

为对象添加方法和属性

  1. this:只当前方法的对象

    window(全局的对象)

  2. 不要再系统对象中随意附加方法、属性,否则会覆盖已有方法、属性

  3. object对象:没有功能(因此一般用object创建对象)

创建对象

var 对象名 = new Object();

new 函数: 这个时候系统可以理解为在函数中偷偷创建了一个名为this的对象,并在末尾返回,所以在编写函数的时候可以在内部使用this

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function createPerson(name,qq )
{ this.name=name;
this.qq=qq;
this.showName=function()
{
alert('我的名字叫'+this.name);
};
this.showQQ=function()
{
alert('我的qq是'+this.qq);
};
}

var obj=new createPerson('张三','12345678');
obj.showName;
obj.showQQ;

理解原型

方法一般放在原型中,如上文例子中的函数应该使用

1
2
3
4
CreatePerson.prototype.showNmae = function()
{
alert('我的名字叫': this.name);
}

可以避免每次创建新方法而导致资源大量浪费

类与对象

类:模子

对象:产品(成品)

如上文中createPerson是类,obj是对象

继承

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function show()
{
alert(this);
}
show.call(12); // call中的this会改变方法中的this,这里结果是输出12

//那么继承就是

function B()
{
A.claa(this); //this是通过b创建的对象 ,然后将b创建的对象的名字传到A中,那么创建的对象通过A中的赋值语句对属性进行赋值
}
for(var i in A.prototype)
{
B.prototype[i]=A.prototype[i];
} ; // 方法继承

Mysql(SQL)学习

发表于 2019-12-14 | 分类于 -[数据库]

学习网站

MYSQL(SQL)学习

windows cmd 下mysql一些基本命令

  1. 连接认证:IP和端口确认,如果是本地都可以省略

    • 连接

      -h 主机地址 ———- -hlocalhost(可以是ip)

      -P(大写) 端口 —————– -p3306(mysql一般是3306)

    • 认证:通关用户名和密码进入服务器 -u 用户名 —- -uroot,不可以省略(匿名用户除外)

      -p 密码 —-

    • 退出命令

      \q

    注意:通常连接认证,密码不建议明文,可以在输入-p之后回车,系统会让再次输入密码

操作学习

启动和停止MySQL

即启动Mysqld.exe

  1. 命令行: Net start 服务(mysql):开启服务

    net stop 服务(mysql): 开启服务

    注:若显示服务名无效,解决方法

  2. 系统服务方式:

登入退出mysql

登入的是mysql.exe

(前文控制台下的命令已写)

基本认证语法 mysql -h(服务器ip/域名) -P(端口号) -u(用户名) -p(密码,不推荐使用明文)

退出: Exit;(带分号)

\q

Quit

设置字符集

set names 字符集

基本操作(库)

创建数据库

create database 数据库名字 [库选项]: (中括号代表可有可无)

库选项,数据库的相关属性

字符集:charset 字符集 代表着当前数据库下的所有表存储的数据默认指定的字符集(默认是DBMS)

校对集:collate 校对集

显示数据库

使用SQL创建数据库后,会产生一个对应的存储数据的文件夹(data目录下)

数据库文件夹下都有一个opt文件,保存数据库选项

  1. show databases : 显示全部数据库

  2. show databases like ‘匹配模式’;匹配模式如下

    _:匹配当前位置单个字符

    %:匹配指定位置多个字符集

    eg : ‘my%’:my开头的全部数据库

    ‘m_database’:m开头后第一个字母不确定

  3. show create database 数据库名字:显示数据库创建语句(系统加工后的指令)

显示数据库

数据存储在数据表下,数据表下存储在数据库下

use 数据库名字:选择数据库;

1
Database changed --表示当前已经进入到指定的数据库

修改数据库

alter database 数据库名字 charset [=] 字符集

修改数据库字符集(库选项):字符集和校对集

5.5之后无法修改数据库名字

修改成功,对应的opt文件会体现

删除数据库

drop database 数据库名字:删除数据库

基本操作(表)

创建数据表(需先进入数据库)

create table 表名(字段名 字段类型 [字段属性], 字段名 字段类型 [字段属性],..) [表选项];

表选项:与数据库选项类似-

Engine:存储引擎(mysql提供的具体存储数据的方式默认innodb) Charset:字符集(级别比数据库高) Collate: 校对集)

eg:创建班级表

1
2
3
4
5
6
--创建数据表
create table class(
-- 字段名 字段类型
-- 字段与表分不开
name varchar(10) -- 10个字符(不能超过)
)

可能会提示No database selected:表必须放到对应的数据库下方法如下

  1. create table mydatabase2.class(….): 即在创建的表名前加数据库名+”.”
  2. 创建表前,进入数据库,即 use 数据库名

create table 表明 like 表明:从已经存在的表复制一份(只复制结构,如果表中有数据不复制)

注: 只要使用数据库.表名,就可以在任何数据库下访问其他数据库的表名


每当一张数据表创建,那么就会在对应的数据表下创建一些文件(数量,形式等与存储引擎有关)

frm文件是结构文件对应innodb存储引擎,数据存在父目录下的ibdata文件中

显示表

show tables:显示所有表

show tabales like ‘匹配模式’:匹配数据表


显示表结构(显示表中所包含的字段信息(名字,类型,属性等))

describe(desc) 表名;

show columns from 表名;

显示如下(假设创建了个class的表)

Filed(字段名字) Type(字段类型) Null(值是否允许为空) Key(索引) Default(默认值) Extra(额外的属性)
name varchar<10> Yes NULL(表示默认值为NULL)

show creat table 表名:查看表的创建语句(已被系统改过)


Mysql的语句结束符

;与\g效果一样,字段在上排,下面跟对应的数据

\G 字段在左侧竖着,数据在右侧

eg:show create table 表名\G

修改表结构

  1. rename table 旧表名 to 新表名 :修改表名

  2. alter table 表名 表选项 [=] 值:修改表选项

  3. alter table 表名 add [column] 新字段名 列类型 [列属性] [位置first/after 字段名]:新增字段

    eg : alter table studen add column age int (默认是加到表的最后面)

    First : 在某某之前(最前面),第一个字段

    After 字段名: 放在某个字段之后(默认)

  4. alter table 表名 change 旧字段名 新字段名 字段类型 [列属性] [新位置]:修改字段名;

    新字段名一般有新类型,所以必须输入字段类型

  5. alter table 表名 modify 字段名 新类型 [新属性] [新位置]

  6. alter table 表名 drop 字段名 : 删除字段

删除表结构

drop table 表名 [,表名2…]:删除(多个)表

基本操作(数据)

插入操作(将数据存储在数据表(字段)里)

  1. insert into 表名[(字段列表)] values(对应字段列表)–(这个不需要对应表结构)

eg:insert into my_teacher (name,age) values(‘Jack’,30);

  1. Insert into 表名 values (对应表结构)

查询操作

  1. select * from 表名 : 查询表中全部数据 (*是个通配符,表示匹配所有的字段)

  2. select 字段列表 from 表名 :查询表中部分字段 (字段列表使用逗号隔开)

    eg select name from my_teacher;

  3. select 字段列表/* from 表名 where 字段名 = 值 :简单条件查询数据(mysql中没有==)

    eg : select name from my_teacher where age = 30 (查询年龄为30岁的人)

删除操作

delete from 表名 [where 条件]; (没where条件,意味着系统会自动删除该表所有数据)

eg: delete from my_teacher where age = 30;

更新操作

update 表名 set 字段名 = 新值 [where 条件] (没有则修改全部)

eg: update my_teacher set age = 28 where name = ‘Han’;

字段类型(列类型)

整数类型

  1. Tinyint

    迷你整形,系统采用一个字节来保存的整形 一个字节=8位,最大能表示的数值0-255(需设置为无符号型,默认为有符号型)

  2. Smallint

    小整形,2个字节,0-65535

  3. Mediumint

    中整形,3个字节

  4. Int

    整形(标准整形),4个字节

  5. Begint

    大整形,8个字节

注:设置为无符号需在类型后面加个unsigned

eg:creat table my_int(

int_1 tinyint,

int_2 smallint

)

注:在desc (表名) 中 属性后跟了一个数字代表着显示长度

显示长度:指数据(整形)在数据显示的时候,到底可以显示多长位(若想要数据显示的时候,保持最高位,需要给字段增加一个zerofill属性,跟在tinyint后面,zerofill会绑定unsigned)

小数类型

浮点型

  1. float:4个字节(另一种表示方法float(M,D),M个有效数字,小数部分占D位)
  2. double:8个字节

定点数:能够保证数据精确的小数(小数部分可能不精确,整数部分一定正确)

  1. Decimal: Decimal(M,d):M表示总长度,不超65,D表示小数部分长度,不超30

时间日期类型

  1. Date

    日期类型,3个字节,格式YYYY-mm-dd表示范围1000-01-01到9999-12-12,初始值0000-00-00

  2. Time

    时间类型:表示某个指定的时间,3个字节,格式HH:ii:ss(时分秒),mysql中表示的时间范围大得多-839:59:59-839:59:59。用来表示时间段

  3. Datetime

    日期时间类型:将Date和time合并起来,8个字节,格式YYYY-mm-dd HH:ii:ss,区间为各自单独能表示的区间

  4. Timestamp

    时间戳类型:从格林威治时间开始,与Datetime格式相同

  5. Year

    年类型:1个字节,能表示1900-2155年,两种插入方式0~99和四位数的具体年(69,70做界限70后是19,69前是20,如70会显示1970)

字符串

  1. char

    定长字符,char(L),L代表字符数(中文与英文字母一样),L长度为0到255

  2. Varchar

    变长字符,系统根据世纪储存的数据计算长度,分配合适长度,

    Varchar(L),L代表字符数,理论上为0到65535(但一般用于少于256的长度)

  3. Text

    文本类型

    Text:存储普通的字符文本

    Blob:存储二进制文本(图片,文件),但一般不用,一般使用链接来指向文件

    Text:系统中提供四种text

    1. Tinytext:使用一个字节,实际能够存储数据2^8 +1
    2. Text:2个字节,实际2^16+2(一般用这个,因为系统会自动选择合适的类型)
    3. Mediumtext:3个字节,2^24+3
    4. Longtext:4个字节,2^32+4
  4. Enum

    枚举类型:数据插入前确定了几个项可能是最终的数据结果,如性别,确定了不是男就是女就可以用枚举

    enum(数据值1,数据值2)

    注:因为enum的储存原理是用取下标,即1=>数据值1,2=>数据值2,那么可以直接用数值来插入(可用来节省空间)

  5. set

    将多个数据项同时保存的数据类型,将指定的项按照对应的二进制来进行控制,1表示该选项被选中,0表示没选中

    set(‘值1’,’值2’…)

    与Enum存储的是数字,而不是字符串

字段属性(列属性)

一共有6个属性:null , 默认值,列描述,主键,唯一键,和自动增长

Null属性

NULL的代表字段为空,若对应值为YES,表示字段可以为NULL

默认值

default:默认值,当用户不插入数据时所使用的值,通常为NULL

列描述

comment,是给开发人员进行维护的一个注释说明

用法: comment ‘字段描述’;

注:想查看注释,必须查看表创建语句

主键

主键是指主要的键,在一张表中,有且只有一个字段,里面的值具有唯一性(主键的字段内容不能为空,NOT NULL)

创建主键
  1. 直接在需要当作主键的字段之后,增加primary key属性来确定主键

    1
    2
    3
    create table my_pri1(
    username varchar(10) primary key
    )charset utf8;
  1. 在所有字段之后增加primary key的选项primary key(字段信息)

    1
    2
    3
    4
    create table my_pri1(
    username varchar(10),
    primary key(username)
    )charset utf8;
  2. alter table 表名 add primary key(字段);

查看主键
  1. 查看表结构,即desc 表名
  2. 查看创建语句
删除主键

alter table 表名 drop primary key;

注:虽然删除了主键,但是不能改变NOT NULL

复合主键
  1. 在创建表的时候,全部字段后跟primary key(字段名1,字段名2)
主键约束

主键增加后,会对对应的字段有数据要求

  1. 当前字段对应的数据不能空
  2. 当前字段对应的数据不能重复

自动增长

auto_increment:当给定某个字段属性之后,该列的数据没有提供确定数据,系统会根据之前已经存在的数据进行自动增加后,填充数据(一张表最多自能拥有一个自增长)

当给定属性的字段没有提供值,自动增长才会触发(只适用于数值)

初始设置

show variables like ‘auto_increment%’:查看属性

auto_increment_increment: 步长

auto_increment_offset:起始值

使用自动增长

字段后加一个属性auto_increment

修改自动增长
  1. 查看自增长:查看创建语句
  2. alter table 表名 auto_increment= 值;(修改的值不能比当前值大,虽然未报错,但修改不成功)
删除自增长

只需要在修改表的字段属性时不添加auto_increment就行了

1
alter table my_auto modify id int;(增加自增长类似,直接在int后面加一个auto_increment)

唯一键

唯一键: unique key , 保证字段数据唯一

主键也可保证唯一,但一张表只有一个

唯一键一张表可有多个(但数据可以为NULL,且可以为多个)

创建唯一键
  1. 与主键类似,在表字段后增加唯一键标识符:unique key

  2. 在所有字段后使用unique key(字段列表)

  3. 创建表后增加:

    alter table 表名 unique key(字段列表)

查看唯一键

desc 表 名 key 对应UNI

查看创建语句

删除唯一键

alter table 表名 drop index 唯一键名字;

注:无法修改唯一键,要达到修改的目的,需要先删除后增加

复合唯一键

与主键一样

表关系

表关系: 表与表之间(实体)有什么样的关系

一对一

一条表中的一条记录与另外一张表最多有一条明确的关系,通常,此设计方案保证两张表使用同样主键

用处:例如一张学生信息表,需记录学生ID(primary key),姓名,年龄,性别,籍贯,地址。而籍贯,地址,一般查的比较少,这个时候一般会将他们分别记录到两张表中,这个时候就可以将学生ID设为两张表的主键,保证每个唯一ID对应唯一一个学生的信息,

一对多

在”多”关系的表中去维护一个字段,这个字段是”一”关系的主键,例如下面多指孩子,一指母亲

例如一张母亲表,一张孩子表,一个母亲可以对应多个孩子,但一个孩子只能对应一个母亲

这个时候就在孩子ID中多加一个字段为”母亲ID”

多对多

一张表中的一条记录在另外一张表中可以匹配到多条记录,反过来一样

这个时候通过两张表自己增加字段不能解决问题,那么这个时候就通关第三张表来解决问题

eg:师生关系

  1. 一个老师教过多个班级的学生
  2. 一个学生听过多个老师讲课

首先得有两个实体,老师表,学生表

从中间设计一张表,维护两张表对应的联系,在这张表中通过一对一最终实现多对多.(逐一列举有关系的两者)

高级数据操作

新增数据

多数据插入

只要写一次insert,但是可以插入多条记录

insert into 表名 [(字段列表)] values(值列表),(值列表)….

主键冲突

进行数据插入前,不确定数据表中是否已经存在对应的主键

  1. insert into 表名 [(字段列表)] values(值列表) on duplicate update 字段 = 新值:若主键冲突则采取更新的方法

    例如你要一个人id为04,现在你想让其他人的id为04,使用该命令后,人名会被替换掉,但id04不变

  2. replace into [(字段列表)] values(值列表);

    主键冲突后,会删掉原来的数据,重新插入进去(效率没有insert高)

蠕虫复制

一分为二,成倍增加,从已有的数据中获取数据,再将数据插入到数据表中

insert table 表名 [(字段列表)] select */字段列表 from 表; (表名一样,不清楚是否可不一样)

更新数据

由前文知,若更新数据时没有加条件那么就是全表更新,但是可以用limit来限制更新的数量

update 表名 set 字段名 = 新值 [where 判断条件] limit 数量; (注,有条件也可以更改limit,因为满足where条件的可能有多个)

删除数据

也可使用limit

Delete数据不能重置auto_increment

Truncate 表名; 能够重置自增长(这个相当于先drop再creat)

查询数据

完整的查询指令

Select select选项 字段列表 from 数据源 where 条件 group by 分组 having 条件 order by 排序 limit 限制

Select 选项

系统该如何对待查询得到的结果

All : 默认 , 表示所有的记录

Distinct : 去除重复的记录 , 只保留一条 (所有字段都相同)

字段列表

有时候从需从多张表获取书,再获取数据时,可能不同表中有同名字段,这个时候需将同名字段命成不同名:别名alias

语法,在查询语句中: 字段名 [as] 别名

from 数据源

from是为全面的查询提供数据,数据源是需要是个符号二维表结构的数据即可

  1. 单表数据

    语法: from 表名

  2. 多表数据

    从多张表获取数据

    语法: from 表名1, 表名2;

    结果:两张表记录数相乘,字段数拼接(所以尽量少用)

  3. 动态数据

    from后面跟的数据不是一个实体表,而是一个从表中查询出来得到的二维结果表(子查询)

    语法: from (select 字段列表 from 表名) as 别名; (别名必需的)

    eg : select * from (select int_1,int_8 from my_int) as int_my

where子句

通过运算符比较来判断数据

Group by 子句

表示分组:根据指定的字段,将数据进行分组

  1. 分组统计:

    group by 字段名

    1
    select * from my_studentt group by class_id; -- 根据班级id进行分组

    group by 是为了分组后数据统计,分组后只会保留分组后第一条记录(一般与聚合函数一起用)

  2. 多分组

    将数组按某个字段分组,对已经分组的数据再次分组

    group by 字段1,字段2 –先按照字段1排序,再按照字段二排序

  3. 分组排序

    group by 字段1 [asc|desc] , 字段2[asc|desc],(默认为升序asc)

having子句

Having 本质和where一样,进行数据条件筛选

  1. 在group by 子句之后,可以针对分组数据进行统计筛选,但是where不行

    1
    select class_id,conut(*) as number from my_student group by class_id having number >=4   -- 挑选班级人数大于4的班级
order by 子句

Order by 排序: 根据校对规则对数据进行排序

语法: order by 字段 [asc|desc] – asc 升序

1
select * from my_student order by stu_height asc;

可进行多字段排序,先按照第一个字段,再按照第二个字段

order by 字段1[asc|desc],字段2[asc|desc]

limit 子句

限制数量获取

  1. 记录数限制

    纯粹的限制获取的数量:从第一条到指定的数量

    limit 数量

  2. 分页

    用limit限制指定区间的数据

    语法: limit offset length;

    offset: 偏移量–从哪儿开始

    length: 具体的获取多少条记录(数量不够,获取完就结束)

    1
    2
    limit 0,2 -- 获取前两条记录
    limit 2,2 -- 获取第三四条记录。

查询中的运算符

算术运算符

可用在查询中

1
2
-- 如
select int_1 + int_2 , int_1 - int_2 from ysf1

mysql中除法的运算结果用浮点数表示

比较运算符

在mysql中无==判等,而是直接使用=

注: select ‘1’ <=> 1 (这不能用=否则为赋值,而使用<=>,)

1
2
select * from my_student where stu_height >= 170;
select * from my_student where stu_age between 20 and 30 ; -- between 语法 , 查找20,30之间的人,且是闭区间, 条件1必须小于条件2,即20和30不能互换
逻辑运算符
  1. and : 逻辑与

  2. or : 逻辑或3.

  3. not: 逻辑非

1
select * from my_student where stu_age <=30 and stu_age >= 20;
  1. In : 在什么里面,用来替代= , 结果不是一个值, 而是多个

    语法in(结果1,结果2,结果3…),只要当前条件在结果集中出现过,那么就成立

    1
    select * from my_student where stu_id in('stu00001','stu0002')
  2. Is : 专门用来判断字段是否为NULL的运算符(用=的话,返回的也是NULL)

    语法: is null / is not null

  3. like: 用来进行模式匹配

    语法 like ‘匹配模式’(_与%)(前文已有

联合查询

可合并多个相似的选择查询的结果集。等同于将一个表追加到另一个表,从而实现将两个表的查询组合到一起,使用谓词为UNION或UNIONALL()

即:将多个查询结果纵向合并到一起:字段数不变,多个查询的记录数合并

用处:

  1. 将同一张表不同结果合并展现数据.

    例如,男生升高升序排序,女生升高降序排序。

  2. 因数据量较大,通常将同一类型数据分到多张表中,在对数据进行统计的时候,用联合查询将数据存放在一起显示

语法:

select 语句

Union [union选项]

select 语句

Union 选项:与select基本一样

Distinct: 去掉完全重复的数据(默认)

All: 保存所有结果

注:union理论上只需保证字段属一样,不需要每次拿到的数据对应字段类型一致(且保留第一个select的字段)

1
2
3
select * from my_student
union
select * from my_student;
order by的使用

联合查询中,如果要使用order by,那么对应的select语句必须用括号括起来

且若要order by生效必须配合limit使用

1
2
3
(select * from my_student where gender = '男' order by stu_height asc limit 10)
union
(select * from my_student where gender = '女' order by stu_height desc limit 10 )

连接查询

将多张表连接到一起进行查询(会导致记录数行和字段属列都会发生改变)

意义:在关系型数据库涉及过程中,实体(表)与实体之间是存在很多联系的,如前往呢所说的一对一,多对一,多对多.

分类
  1. 交叉连接

    将两张表的数据与另外一张表彼此交叉

    即从第一张表依次取出每一条记录,然后与另外一张表的全部记录挨个匹配,没有匹配条件,所有结果保留,所以记录数 = 第一张表记录数 * 第二张表记录数;字段数 = 第一张表字段数 + 第二张表记录数

    语法: 表1 cross join 表2

    1
    select * from my_student cross join my_int;
  2. 内连接

    inner join , 从一张表中取出所有的连接去另一张表匹配(有条件),成功则保留,失败了则放弃

    语法: 表1 [join] 表2 on 匹配条件

    1
    2
    select * from my_student inner join my_class on my_student.class_id = my_class.id; -- 通常加上表名,通常还会用表别名例如
    select * from my_student as s inner join my_class as c on s.class_id = c.id ; --这种更简便
  1. 外连接

    outer join:按照保留一张表(主表),根据条件去连接另外一张表(从表),根据保留哪一张表分为:

    • 左外连接(左连接): left join

      语法: 主表 left join 从表 on 连接条件

      1
      select * from my_student as s left join my_class c on s.class_id = c.id;
    • 右外连接(右连接): right join

      语法: 从表right join 从表 on 连接条件

      1
      select * from my_student as s right join my_class as c on s.class_id = c.id;

    左连接主表在左边,右连接主表在右边

    语法中左边的表在左边,同理右边

    注:即使主表在从表中一条都未匹配成功,也需要保留该记录,从表对应的字段值都为NULL

Using关键字

在连接查询中代替on,进行条件匹配,使用后,对应的同名字段,最终在结果中只会保留一个

语法: 表1 [inner,left,right] join 表2 using(同名字段列表); // 连接字段

子查询

(sub query),当一个查询是另一个查询的条件,即一条select语句中,嵌入了另外一条select语句,那么被嵌入的select语句称之为子查询语句

(补充,主查询:主要的查询对象,第一条select语句)

分类还可按位置分为where子查询,from子查询

where子查询➡(标量子查询,列子查询,行子查询)

from子查询➡(表子查询,Exists子查询)

标量子查询

子查询返回结果是一个数据

语法: select * from 数据源 where 条件判断 =/<> (select 字段名 from 数据源 where 条件判断); –<>:不等于

列子查询

返回的结果是一列(一列多行)

语法 : 主查询 where 条件 in(列子查询)

1
select name from my_class where class_id in (select class_id from my_student)
行子查询

返回的结果是一行(一行多列)

语法: 主查询 where 条件 [(构造一个行元素)] = (行子查询);

1
select * from my_student where (stu_age,stu_height) = (select max(stu_age),max(stu_height) from my_student);
表子查询

返回的结果是多行多列

语法: select 字段表 from (表子查询) as 别名 [where] [group by ] [havinf] [limit];

1
2
3
select * from (select * from my_student order by stu_height desc) as temp group by class_id
-- 因为ogroup by选择的是第一个,所以先用一个select语句将最最高的放在第一个,再用此查询,查出每个班最高的人
-- 注: as 别名 是必须的,因为from后跟的是查询,from无法识别,所以需一个名字
Exists子查询

返回的结果是1或0(类似布尔),代表成立与不成立

语法: where exists(查询语句);//where 1永远为真

1
2
select * from my_class as c where exists(select stu_id from my_student as a where s.class_id = c.class_id);
-- 求出,有学生在的所有班级
子查询关键字
  1. In

    主查询 where 条件 in(列子查询);

  2. Any

    任意一个

    = any(列子查询): 条件在查询结果中有任意一个匹配即可,等价于In

    <>any(列子查询): 条件在查询结果中不等于任意一个

    eg: 1 = any(1,2,3)➡ true

    1 <>any(1,2,3)➡ true

  3. Some

    与any完全一样

  4. ALL

    = all(列子查询): 等于里面所有

    <>all(列子查询): 不等于里面所有

整库数据备份与还原

又名SQL数据备份:备份结果都是SQL指令(mysqldump.exe专门用于备份SQL的客户端)

备份数据和指令,在数据库被破坏的时候能还原

备份文件较大,不适合特大数据备份

SQL备份

使用前需先于数据库服务器进行连接

即: mysql/mysqldump.exe -hPU 数据库名字 [表1, [表2…]] > 备份文件地址

整库备份

只提供数据库名字

1
mysqldump.exe -hlocalhost -P3306 -uroot -p123456 mydatabase > (保存的文件夹,后缀可跟.sql)

在cmd中输入

单表备份(见多表备份)
多表备份
1
mysqldump.exe -hlocalhost -P3306 -uroot -p123456 mydatabase my_student my_int > (地址)

数据还原

通过mysql.exe客户端

登录mysql前, Mysql.exe -hPup 数据库 < 文件位置

SQL指令

Source SQL文件位置 //必须先进入到对应的数据库

人为操作

打开备份文件,复制所有SQL指令,然后到mysql中粘贴复制(不推荐)

用户权限管理

指在不同的项目中给不同的角色(开发者)不同权限,为了保证数据库安全

通常一个用户的密码不会长期不变,需要经常变更密码

用户管理

Mysql中所有的用户信息都在user表中 select * from mysql.exe\G (查看信息,\G是为了显示美观)

在安装如果不选择匿名用户,以为着用户只有一个root(超级用户)

User: 用户名

host: 代表允许访问的客户端(ip或者主机地址), (*代表所有用户可以访问)

创建用户
  1. 直接用rott用户在mysql.user表中插入记录(不推荐)

  2. 使用SQL指令

    create user 用户名 identfied by ‘明文密码’

    用户: 用户名@主机地址

    主机地址: ‘’/‘%’ (代表所有地址)

    1
    create user 'user1'@'/%' identified by 123456

    简化创建用户信息(通常不用,谁都可以访问)

    1
    create user user2 -- 不限定可客户端IP, 没有密码的用户
删除用户

drop user 用户名@host

1
drop user user2@'/%';
修改用户密码
  1. set password for 用户 = password(‘新的密码’)

    1
    set password for 'user1'@'%' = password('654321');
  2. update mysql.user set password = password(‘新的密码’) where user = ‘ ‘ and host = ‘ ‘;

权限管理

权限管理分类三类

数据权限:增删改查(select、update、delete、insert)

结构权限:结构操作(create、drop)

管理权限:权限管理(create user、grant、revoke)

授予权限

grant 权限列表 on 数据库.表名(\*代表整个数据库) to 用户

权限列表:用逗号分隔,all privileges代表全部权限

数据库.表名:可是单表,也可以是具体的整个数据库(数据库.),也可以整库(\.*)

1
grant select on mydb.my_student to 'user1'@'%';
取消权限

revoke 权限列表 on 数据库.表 from 用户

1
reboke all privilegs on mydb.my_student from 'user1'@'%';
刷新权限

对用户的全选操作刷新,将操作的具体内容同步到对应的表中

flush privileges

外键

视图

创建视图

视图本质是SQL指令(select语句)

create view 视图名字 as select 指令 // 可以是单表数据,也可以是连接查询,联合查询,子查询

1
2
3
4
5
creat view student_class_v as
select * s.*,c.name from my_student as s left join
my_class as c
on
s.class_id = c.class_id

视图本身是虚拟表,关于表的一些操作,视图都可以用

1
show tables/show creat table [view].desc 视图名字

使用视图

视图是一张虚拟表,可直接当做”表”操作,本身无数据,临时执行select语句得到对应的结果,主要是查询操作

select 字段列表 from 视图名字 [子句]

修改视图

修改视图对应的查询语句

alter view 视图名字 as 新 select 语句

删除视图

drop view 视图名字

事务

自动事务

查看事务: show variables like ‘autocommit’;

关闭自动事务:set autocommit = off; (注一般不关闭,只会在特定情况才才关掉)

提交(同步到数据表,事务也会被清空): Commit

回滚(清空之前的操作): Rollback

(即使没有同步到数据表,当前客户端查询的时候,能显示执行过后的操作,因为查询的时候,系统会先用事务日志对数据进行加工,但是其他客户端看不见)

手动事务

手动事务:不管是开始还是过程还是结束都需要用户手动发送事务操作指令来实现

一个事务开启的时候,其他客户端无法操作使用事务的客户端正在操作的数据

开启事务

start transaction:开启事务//从这条语句开始,后面语句就会保存在事务日志,而不是写入数据

执行事务

将多个连续的整体的SQL指令,逐一执行

提交事务

确认提交: commit: 数据写到数据表(清空)

回滚操作: rollback: 所有数据无效并清空

回滚点

savepoin:当一系列事务操作时,而其中的步骤如果成功了,没有必要重新来过,可以在某个点,设置一个记号(回滚点),如果后面有失败可以回到这个记号位置

  1. 增加回滚点: savepoin 回滚点名字
  2. 回到回滚点: rollback to 回滚点名字

注:如果回到前面的回滚点,后面的回滚点会失效

变量

Mysql本质时编程语言,需要变量来保存数据

系统变量

show variables [ like : patter]: 查看系统所有变量

select @@变量名:查看系统变量

修改系统变量:

  1. 局部修改,只针对当前自己的客户端(档次连接有效)

    set 变量名 = 新值

  2. 全局修改:针对所有的客户端,”所有时刻”都有效

    set global 变量名 = 值 // 或者: set @@global.变量名 = 值

    注:全局修改只针对新客户端有效(对当前的客户端无效)

会话变量

也叫用户变量,与客户端绑定,只对当前用户使用的客户端生效

set @变量名 = 值

1
set @name = 'hello wrold';

因mysql中无==判等号,为了区分赋值与判等,加了一个赋值符号 :=

set @变量名 := 值


通过查询数据为变量赋值:

  1. select @变量1 = 字段1 ,@变量2 := 字段2 from 数据表 where 条件

    1
    select @name := stu_name,@stu_age from my_student limit 1 ; -- mysql中无数组,所以限制1条

    注:用 ‘=’会被系统判断为判等符号

  2. select 字段1,字段2 … from 数据源 where 条件 into @变量1, @变量2..

    1
    select stu_name,stu_age from my_student order by stu_height desc limit 1 into @name,@age;

select @变量 : 查看变量

局部变量

  1. 局部变量使用declare 关键字声明
  2. 局部变量declare语句出现位置一定是begin 和end之间 (begined是在大型语句块中使用:函数/存储过程/触发器)
  3. 声明语法: declare 变量名 数据类型[属性];

流程结构

即代码执行顺序

if分支

基本语法
  1. 用在select查询中

    语法: if(条件,为真结果,为假结果)

    1
    2
    select *,if(stu_age>20,'符合','不符合')as judge from my_student 
    -- 与where不同的是,不管大不大于20数据都会显示,但是会多一个字段显示符合或者不符合
  2. 用在复杂的语句块中(函数/存储过程/触发器)

    语法:

    if 条件表达式 then

     满足条件要执行的语句;

    End if;

复合语法

代码的判断存在两面性,两面都有对应的代码执行

语法:

if 条件表达式 then

 满足条件要执行的语句;

Else

 不满足条件要执行的语句;

End if; //不能继续加else if,只能在里面嵌套使用if,else

while循环

基本语法

循环体都是需要在大型代码块中使用

While 条件 do

 要循环执行的代码;

End while;

结构标识符

为某些特定的结构进行命名,为了是在某些地方使用名字

基本语法:

标识名字:While 条件 do

循环体

End while[标识名字];

标识符的存在是为了循环体中使用循环控制,mysql中无continue和break而是用其他的关键字替代

Iterate:迭代,就是以下的代码不执行,重新开始循环(continue)

Leave:离开,整个循环终止(break)

函数

分为两类,系统函数(内置函数)和自定义函数

不管哪一种,都是使用select 函数名(参数列表);

内置函数(部分)

字符串函数

Char_length():判断字符串的字符数

Length():判断字符串的字节数(与字符集)

Concat():连接字符串

Instr():判断字符在目标字符串中是否存在,存在返回其位置,不存在返回0

Lcase():全部小写

Left():从左侧开始截取,直到指定位置(位置如果超过长度,截取所有)

Ltrim():消除左边对应的空格

Mid():从中间指定位置开始截取,如果不指定截取长度,直接到最后

时间函数

Now():返回当前时间,日期 时间

Curdate():返回当前日期

Curtime():返回当前时间

Datediff():判断两个日期之间的天数差距,参数日期必须使用字符串格式(用引号)

Date_add(日期,interval 时间数字 type):进行时间的增加

​ Type:day/hour/minute/second

Unix_timestamp():获取时间戳

From_unixtime():将指定时间戳转换成对应的日期时间格式

数学函数

Abs():绝对值

Ceiling():向上取整

Floor():向下取整

Pow():求指数,谁的多少次方

Rand():获取一个随机数(0-1之间)

Round():四舍五入函数

其他函数

Md5():对数据进行md5加密(mysql中的md5与其他任何地方的md5加密出来的内容是完全相同的)

Version():获取版本号

Databse():显示当前所在数据库

UUID():生成一个唯一标识符(自增长):自增长是单表唯一,UUID是整库(数据唯一同时空间唯一)

自定义函数

自定义函数:用户自己定义的函数

函数:实现某种功能的语句块(由多条语句组成)

1、 函数内部的每条指令都是一个独立的个体:需要符合语句定义规范:需要语句结束符分号;

2、 函数是一个整体,而且函数是在调用的时候才会被执行,那么当设计函数的时候,意味着整体不能被中断;

3、 Mysql一旦见到语句结束符分号,就会自动开始执行

解决方案:在定义函数之前,尝试修改临时的语句结束符

基本语法:delimiter

修改临时语句结束符:delimiter 新符号[可以使用系统非内置即可$$]

中间为正常SQL指令:使用分号结束(系统不会执行:不认识分号)

使用新符号结束

修改回语句结束符:delimiter ;

创建函数

Create function 函数名(形参) returns 返回值类型

Begin

​ //函数体

​ Return 返回值数据; //数据必须与结构中定义的返回值类型一致

End

语句结束符

修改语句结束符(改回来)

注:若只有一条语句可不要begin和end

形参:在mysql中需要为函数的形参指定数据类型(形参可以有多个)

基本语法:变量名 字段类型

查看函数
  1. 查看function状态,查看所有函数

    Show function status [like ‘pattern’];

  2. 查看函数创建语句

    show creat funtion 函数名字;(不加括号)

调用函数

于内置函数调用一致

删除函数

drop function 函数名;(不加括号)

注意事项

自定义函数只能在当前数据库中使用

函数内部不能使用select(除了定义变量时使用)

变量作用域

局部作用域

使用declare关键字声明(在结构体内:函数/存储过程/触发器),而且只能在结构体内部使用

会话作用域

用户定义的,使用@符号定义的变量,使用set关键字

会话作用域:在当前用户当次连接有效,只要在本连接之中,任何地方都可以使用(可以在结构内部,也可以跨库)

全局作用域

所有的客户端所有的连接都有效:需要使用全局符号来定义

Set global 变量名 = 值;

Set @@global.变量名 = 值;

通常,在SQL编程的时候,不会使用自定义变量来控制全局。一般都是定义会话变量或者在结构中使用局部变量来解决问题。

存储过程

概念

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译(效率比较高),用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象(针对SQL编程而言)。

存储过程:简称过程

与函数的区别

相同点

1、 存储过程和函数目的都是为了可重复地执行操作数据库的sql语句的集合。

2、 存储过程函数都是一次编译,后续执行

不同点

1、标识符不同。函数的标识符为FUNCTION,过程为:PROCEDURE。

2、函数中有返回值,且必须返回,而过程没有返回值。

3、过程无返回值类型,不能将结果直接赋值给变量;函数有返回值类型,调用时,除在select中,必须将返回值赋给变量。

4、函数可以在select语句中直接使用,而过程不能:函数是使用select调用,过程不是。

基本操作

创建过程

Create procedure 过程名字([参数列表])

Begin

​ 过程体

End

结束符

查看过程

与查看函数一致(除关键字)

查看全部存储过程:show procedure status [like ‘pattern’];

查看过程创建语句:show create procedure 过程名字;

调用过程

过程:无返回值,因此select不可能调用

调用过程有专门的语法:call 过程名([实参列表]);

删除过程

基本语法:drop procedure 过程名字;

参数类型

存储过程也允许提供参数(形参和实参):存储的参数也和函数一样,需要指定其类型。

但是存储过程对参数还有额外的要求:自己的参数分类

In

表示参数从外部传入到里面使用(过程内部使用):可以是直接数据也可以是保存数据的变量

Out

表示参数是从过程里面把数据保存到变量中,交给外部使用:传入的必须是变量

如果说传入的out变量本身在外部有数据,那么在进入过程之后,第一件事就是被清空,设为NULL

Inout

数据可以从外部传入到过程内部使用,同时内部操作之后,又会将数据返还给外部。

使用

过程类型 变量名 数据类型; //in int_1 int

1
create procedure my_pro3(in int_1 int,out int_2,inout int_3 int)

触发器

触发器概念

触发器是一种特殊类型的存储过程,它不同于我们前面介绍过的存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。

触发器:trigger,是一种非常接近于js中的事件的知识。提前给某张表的所有记录(行)绑定一段代码,如果改行的操作满足条件(触发),这段提前准备好的代码就会自动执行。

作用

1、可在写入数据表前,强制检验或转换数据。(保证数据安全)

2、触发器发生错误时,异动的结果会被撤销。(如果触发器执行错误,那么前面用户已经执行成功的操作也会被撤销:事务安全)

3、部分数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为DDL触发器。

4、可依照特定的情况,替换异动的指令 (INSTEAD OF)。(mysql不支持)

优缺点

优点

1、 触发器可通过数据库中的相关表实现级联更改。(如果某张表的数据改变,可以利用触发器来实现其他表的无痕操作[用户不知道])

2、 保证数据安全:进行安全校验

缺点

1、 对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程度。

2、 造成数据在程序层面不可控。(PHP层)

基本操作

创建触发器

Create trigger 触发器名字 触发时机 触发事件 on 表 for each row

Begin

End


触发对象:on 表 for each row,触发器绑定实质是表中的所有行,因此当每一行发生指定的改变的时候,就会触发触发器.


触发时机:每张表中对应的行都会有不同的状态,当SQL指令发生的时候,都会令行中数据发生改变,每一行总会有两种状态:数据操作前和操作后

Before:在表中数据发生改变前的状态

After:在表中数据已经发生改变后的状态


触发事件:mysql中触发器针对的目标是数据发生改变,对应的操作只有写操作(增删改)

Insert:插入操作

Update:更新操作

Delete:删除操作


注意事项:一张表中,每一个触发时机绑定的触发事件对应的触发器类型只能有一个:一张表中只能有一个对应after insert触发器

因此,一张表中最多的触发器只能有6个:before insert,before update,before delete,after insert,after update,after delete

查看触发器
  1. 查看全部触发器

    Show triggers;

  2. 查看触发器的创建语句

    Show create trigger 触发器名字;

触发触发器

想办法让触发器执行:让触发器指定的表中,对应的时机发生对应的操作即可。

1、 表为my_orders

2、 在插入之后

3、 插入操作

删除触发器

基本语法:drop trigger 触发器名字;

应用

触发器针对的是数据表中的每条记录(每行),每行在数据操作前后都有一个对应的状态,触发器在执行之前就将对应的状态获取到了,将没有操作之前的状态(数据)都保存到old关键字中,而操作后的状态都放到new中。

在触发器中,可以通过old和new来获取绑定表中对应的记录数据。

基本语法:关键字.字段名

Old和new并不是所有触发器都有:

Insert:插入前全为空,没有old

Delete:清空数据,没有new

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
-- 通过订单更新商品库存
-- 两张表,一张订单表,一张库存表
-- 订单表中有goods_id与goods_num字段
-- 库存表中有id(1,2,3),name(手机,电脑,游戏机),inv(1000,500,100)字段
-- 需要做到订单更新后,库存表对应商品减少对应数量
delimiter $$
create trigger a_i_o_t after insert on my_orders for each row
begin
-- 更新商品库存:new代表新增的订单
update my_goods set inv = inv - new.goods_num where id = new.goods_id
end
$$
delimiter ;

-- 在取出库存之前还需判断库存数量是否足够
delimiter $$
create trigger b_i_o_t after insert on my_orders for each row
begin
-- 取出库存数据进行判断
select inv from my_goods where id = new.goods_id into @inv ;
-- 判断
if @inv < new.goods_num then
-- 中断操作:暴力解决,主动出错
insert into XXX values('XXX');
end if;
end
$$
delimiter ;

PHP学习

发表于 2019-12-11 | 分类于 ctf学习之路 , 语言学习

简单记录学习过程中需要记忆的东西

推荐一下学习网站,讲的非常非常非常详细

Apache

    • ·更改访问时默认的目录,在conf文件夹中找到文件httpd.conf用文本模式打开后查找documentRoot修改即可

    • SeverName可以修改别名,便于访问到此网址

  1. 对Apache修改后需要重启Apache才能生效

  2. 通过bin目录下的httped可以在cmd中检查apache是否正常,命令是在当前目录下输入httpde -t 显示ok即配置无误

    PS:这里我有个东西暂时没弄清楚,如果你在公网上有ip与域名,那么域名可以直接连接你的电脑,再经过80端口自然而然连接到你的apache的根目录,那么配置文件中的SeverName的用处到底是什么,或者说我前面的理解有误,只有当你的域名和你的Severname一样的时候才能连接到你的apache的根目录下,或者说通关你的ip并监听端口连接到你apache下需要通过Severname重定向连接到你本地ip,然后访问,问题先放在这儿,后面再学习一下计网再理解下


      这里有个理解不知道对不对,因为有时候一个ip可以对应多个网址,那么severname得作用是当用访问指向该服务器时,因为有多个虚拟主机但ip只有一个,那么再根据域名与severname匹配来 找到对应的文件夹进行匹配

  3. 这里踩了坑,php的apache扩展包无法加载到apache中,因为我在下php没下x86版本,然后一直以为是apache的问题

PHP

PHP基础知识

PHP注释

  1. 行注释:一次注释一行

    • //
    • #
  2. 块注释:一次注释一块(多行)

    /*

    */

基本知识

  1. echo 输出

  2. $定义变量

  3. 可变变量:例如$a = b;$b = 2➡$$a=2;

  4. 常量定义

    • 使用define(‘常量名‘,常量值)
    • 使用const 常量名 = 值

    PS : 常量通常以大写字母命名,这是为了更好的与变量区别。

      denfine可以定义一些特殊常量,例如define(‘-_-‘,’smile’),但是不能用const定义(但对于这种特殊常量的访问需要使用constant,例如echo constant(‘-_-‘)

    define与const还有访问全权限上的区别

  5. 字符串转数值的规则

    • 以字母开头的字符串,永远为0
    • 以数字开头的字符串,永远为1,取到碰到字符串为止(例如$b= ‘1.1.1abc’,echo(int) $b ➡ 1.1)
  6. 整数类型

    • $a = 100 ,十进制
    • $a = 0b111 二进制
    • $a=0120 八进制(前跟0)
    • $a = 0x120 十六进制 (0x)
  7. @错误抑制符

预定义变量

$_GET:获取所有表单以get方式提交的数据

$_POST:POST提交的数据都会保存于此

$_REQUEST:GET和POST提交的都会保存

$GLOBALS:PHP所有的全局变量

$_SERVER:服务器信息

$_SEESION:session会话数据

$_COOKIE:cookie会话数据

$_ENV:环境信息

$_FILES:用户上传的文件信息

系统常量

PHP_VERSION : PHP版本号

PHP_INT_SIZE: 整形大小(表示整形所占用的字节数)

PHP_INT_MAX: 整形所能表示的最大值(比如c语言中int所能表示的最大值),PHP整形中允许出现负号

系统魔术常量:魔术常量的值会跟着环境变化,用户改变不了

_DIR_: 当前被执行的脚本所在电脑的绝对路径

_FILE_: 当前被执行的脚本所在电脑的绝对路径,(带自己文件的名字)

__LINE__:当前所在的行数

__NAMESPACE__:当前所属的命名空间

__CLASS__:当前所属的类

__METHOD__:当前所属的方法

函数

  1. 函数默认值的使用,eg: function jian($num1 = 0,$ num2 = 0)

    注意: 多个默认值定义时,从最右边开始,也就是意味着不能左边的形参有默认值而右边的没有

  2. 对引用的实参进行改变function(参数1,&参数2) (即在前面加个引用地址的符号&)

    注:传用的需要改变的值必须是变量。

  3. 函数默认返回NULL。

可变函数

可变函数:用变量保存函数名字,那么可以用变量+()来充当函数使用。

eg : $变量 = ‘test_function’

   Fuction test_function(){};

   $变量()

匿名函数

语法: function(){ 函数体};(分号必须的)

使用的时候在定义函数的时候使用变量赋值即可 $func = function(){}; 调用➡$func();

变量保存匿名函数,本质得到的是一个对象(属于Closure 类)

闭包中常用


闭包:能使内部函数的局部变量不被释放

example1: (没体现闭包特性——闭包一般返回函数,即return 函数名;)

1
2
3
4
5
6
7
8
9
10
11
function display(){
$name = __FUNCTION__;
// 匿名函数的使用
// use的作用使将name传进去,因为name在外部的作用域,无法直接传入内部
$innerfunciton = funtion() use($name){

echo name ;
}
$innerfunction();
}
display();

example 2 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function display1(){
$name = __FUNCTION__;
// 匿名函数的使用
// use的作用使将name传进去,因为name在外部的作用域,无法直接传入内部
$innerfunciton = funtion() use($name){

echo name ;
}
return $innerfunction();
}
//display1(); (此时调用,就不会输出了)
//所以改变一下
$closure = display1();
//display1调用过后name应该被释放,(name为局部变量),但结果却是依然可以调用,说明$name没有被释放
$closure();

常见函数

  1. unset($变量名): 删除变量

  2. is_XXX(), xxx指int,float等,该函数用来判断变量类型,如果正确返回true ,错误返回false

  3. Var_dump(变量1,变量2……),查看变量类型

  4. Gettype(变量名): 获取类型(无值)

  5. Settype(变量名,类型):设定数据类型 ,与强制转换不同

    • 强制转换是对数据值复制的内容进行处理,不改变存储内容,例如强制转换一个变量后,用gettype获取类型,依旧是原来的类型
    • settype会改变数据本身
    • Decbin(): 十进制转二进制
    • Decoct():十进制转八进制
    • Dechex(): 十进制转十六进制
    • Bindec(): 二进制转十六进制
  6. Empty():判断数据是否为空

  7. Isset(): 判断数据存储的变量是否存在

  8. print(): 类似于echo,但有一点小区别,返回一个结构1

  9. print_r():类似于Var_dump但不输出数据类型,只输出值

  10. include ‘相对路径||绝对路径’ : 包含文件 ,遇到几次,执行几次,报错是warning(不会阻止代码执行)

    include_once: 包含文件,遇到多次,只执行一次

    require : 包含文件,和include报错不同,报错了会阻止代码运行

    PS:在包含的文件中,如果在主体(非函数内)中出现return,那么return后面的内容不会执行。但是可以在引用的时候将include复制给变量,例如$a=include_once ‘test_return.php’,如果在test_return.php中有return 3,那么$a将会被赋值为3。

  11. function_exists(‘ 函数名’):判断指定函数名字是否在内存中存在

    func_get_args(位置如:1):在自定义函数中去获取指定数值的参数,

    func_get_args():在自定义函数中获取所有的参数(数组)

    func_num_args():获取自定义函数中参数的数量

  12. 处理乱码

    1
    header('Content-type:text/html;charset=utf-8');
  13. trigger_error(‘报错的信息 ‘):人为触发错误

  14. count:获取数组元素个数

作用域

  1. 全局变量,PS:PHP中全局变量理论上不能在函数内部使用,与其他部分语言不同
  2. 局部变量
  3. 超全局变量:局部,全局变量会自动储存在超全局变量中

  • 要想在局部访问全局,可以用超全局变量 $GLOBALS (采用数组的方式)

  • 使用global关键词也可以使局部访问全局,全局访问局部

    • 使用global 变量名 的时候不能赋值

静态变量:在函数内部变量前用static修饰 ——为了跨函数共享数据(单个函数)

  • 可以用来统计函数调用次数
  • 统筹多次调用的不同结果

伪类型

帮助开发人员更好查看手册

Mixed : 混合的,可以是多种PHP的数据类型,只要是PHP中对应的类型即可

Number: 数值的,可以使任意数值类型(整形和浮点型)

错误显示设置

PHP中,两种方法设置错误处理

  1. PHP配置文件:php.ini。

    Display_errors:是否显示错误

    Error_reporting:显示什么级别的错误

  2. 在运行的PHP脚本中设置

    error_reporting():设置对应的错误显示级别

    ini_set(‘配置文件中的配置项’,’配置值’)

在PHP中使错误出现在错误日志中可以在配置文件中加上error_log = ‘你所要保存到的路径’(如…./php/errlog/errlog.log(最后的必须是error_log))

在此之前需要开启log_errors = On

字符串

nowdoc and heredoc

以下两种用于内容超过一行,无法直接用单双引号的字符串

  1. nowdoc字符串:没有单引号的单引号字符串

    $str= <<<边界符

    字符串内容

    边界符;

    注意:边界符后同一行不能跟任何内容,包括注释,空格(下边界只能跟分号)

    下边界符必须顶格,最左边

    eg:

    1
    2
    3
    4
    5
     $str= <<<'EOD'

    hello

    EOD;
  2. heredoc字符串: 没有双引号的双引号字符串

    $str= <<<边界符

    字符串内容

    边界符;

1
2
3
4
5
 $str= <<<EOD

hello

EOD;

字符串转义

常用的与c语言一样例如\t , \n

PHP中特殊的 $ (因为php中$代表变量)


单双引号的区别:

  1. 单引号中能识别\‘(不能识别如\t,),而双引号中就不能识别\‘
  2. 双引号能够识别¥符号,所以可以解析变量,单引号不可以

变量专业标识符用于区别变量(用一组大括号)

如你要输出$a的变量,但后面需紧跟bcd,但是不能直接用$abcd,这会认为是变量abcd,而直接$a bcd会多一个空格不符号要求这时候可以用{$a}bcd

字符串相关函数

PS:使用时必须将相关扩展打开

  1. strlen(),中文在utf8字符集下占3个字节

  2. implode(连接方式,数组),将数组中的元素按某种规则连接成字符串

    Explode(分割字符,目标字符串),将元素分开,成数组

    Str_split(字符串,字符长度),按照某种方式分离

  3. trim(字符串[,指定字符]):本身默认用来去除两边的空格(中间不行),也可以指定要去除的内容

    Ltrim():去除左边的

    Rtrim():去除右边的

  4. Substr(字符串,起始位置从0开始[,长度]): 指定位置开始截取字符串,可以截取指定长度(不指定到最后)

    Strstr(字符串,匹配字符):从指定位置截取到末尾

  5. strtolower():全部小写

    strtoupper():全部大写

    ucfirst():首字母大写

  6. Strpos():判断字符在目标字符串首次出现的位置

    Strrpos():最后出现的位置

  7. Str_replace(匹配目标,替换的内容,字符串本身):将目标字符串中部分字符串进行替换

数组

定义

  1. $变量= array(元素1,元素2);
  2. $变量 = [元素1,元素2…]
  3. 隐形定义:给变量增加一个中括号,eg $变量[]= 值1;

注意

  1. 数组元素的顺序以放入顺序为准,与下标无关
  2. 数组下标可以为数组,也可以为单词,单词要加引号
  3. =>键对值,如数组中name下标指定tom,name=>tom>

多维数组

数组中的元素又是数组,二维数组中还可以加数组。

数组遍历

使用foreach

Foreach($数组变量 as [$下标 =>] $值){

//通过$下标访问元素的下标,通过$值访问元素的值

}例子如下

1
2
3
4
5
6
7
$arr = array(1,2,3,4);
foreach($arr as $k => $v){
echo 'key',$k,' == value:',$v,'</br>';
}
/* 输出为 key:0 == value : 1
key:1 == value: 2 .....
*/

PHP高级应用

表达传值

概念

表单传值即浏览器通过表单元素将用户的选择或者输入的数据提交给后台服务器语言。

为什么要用表达传值

动态网站(Web2.0)的特点就是后台根据用户的需求定制数据,所谓的“需求”就是用户通过当前的选择或者输入的数据信息,表单就是这些数据的承载者。

表达传值方式

  1. get传值
  2. post传值

PHP接受数据的方式

不管是$_GET/$_POST/$_REQUEST,三个都是PHP超全局(没有范围限制)预定义数组,表单元素的“name”属性的值作为数组的下标,而value属性对应的值就是数组的元素值

$_GET[[“接受的名字”]]方式:接收GET方式提交的数据

$_POST方式:接收POST方式提交的数据

$_REQUEST方式:接收POST或者GET提交的所有数据

1)$_REQUEST所存储数据的内容:将$_POST和$_GET合并存储到一个数组

2)$_REQUEST和$_POST与$_GET的联系:如果GET和POST中有同名数组元素(下标),POST会覆盖GET(PHP中数组元素下标具有唯一性),这个可以在php.ini中进行配置

复选框接受数据

复选框:通常是将一类内容以同样(同名)的形式传递给后台,数据库存储通常是一个字段存储。复选框的特点:选中才会提交

1、 在浏览器端,checkbox的name属性的值不论什么都会被浏览器毫无保留的提交

2、 在PHP中$_POST/$_GET都会对同名name属性进行覆盖

解决方案:浏览器不识别[](浏览器不认为有特殊性),但是PHP认为[]有特殊性:系统自动认为该符号是数组的形式,所以PHP就会自动的将同名的但是带有[]的元素组合到一起形成一个数组

文件上传

原理

文件上传:文件从用户本地电脑通过传输方式(Web表单)保存到服务器所在电脑指定的目录下。

  1. 增加文件上传的表单:浏览器请求一个服务器的HTML脚本(包含文件上传表单)

  2. 用户从本地选择一个文件(点击上传框(按钮))

  3. 用户点击上传:文件会通过物联网传输到服务器上

  4. 服务器操作系统会将文件保存到临时目录:是以临时文件格式保存(windows下tmp)

  5. 服务器脚本开始工作:判断文件有效

  6. 服务器脚本将有效文件从临时目录移动到指定的目录下(完成)

表单写法

  1. method属性:表单提交方式必须为POST

  2. enctype属性:form表单属性,主要是规范表单数据的编码方式,文件上传只能用multipart/form-data值 (使用时,上网搜素)

  3. 上传表单:file表单

1
2
3
4
<form method = "POST" enctype="multipart/form-data" action="">
<input type ="file" name="image" />
<input type="submit" name="btn" value="上传文件"/>
</form>

$_FILE

用来保存文件属性的变量

  1. name:文件在用户(浏览器端)电脑上实际存在的名字(实际用来保留后缀)
  2. tmp_name:文件上传到服务器后操作系统保存的临时路径(实际用来给PHP后期使用)

2)tmp_name:文件上传到服务器后操作系统保存的临时路径(实际用来给PHP后期使用)

  1. type:MIME(多功能互联网邮件扩展)类型,用来在计算机中客户端识别文件类型(确定软件)

  2. error:文件上传的代号,用来告知应用软件(PHP)文件接收过程中出现了什么问题(PHP后期根据代码进行文件判断)

    注:各代号的意义搜索即可

  3. size:文件大小(PHP根据实际需求来确定是否该保留)

移动临时文件到目标位置

文件上传之后会保存到$_FILES中,那么访问文件信息的形式就是$_FILES[‘表单name属性值’][‘元素信息’]

  1. 判断是否为上传的文件(临时文件):is_uploaded_file()

  2. 移动文件:move_uploaded_file(移动的文件路径,移动到的位置要加上文件名)

多文件上传

批量上传:同名表单:将表单名字形成一个数组,而且同时将文件对应的五个要素:name

Tmp_name、size、type、error都形成对应数量的数组,每个文件上传对应数组元素的下标都是一样的:name[0] 和type[0]是属于同一个文件

批量上传:不同名表单:每个文件都会形成一个属于自己独立的5个元素的数组

当商品需要上传多个图片进行展示的时候:那么需要使用多文件上传

​ 针对一个内容但是不同文件说明:同名表单

当商品需要进行多个维度图片说明的时候:需要使用多文件上传

​ 针对是不同内容所以表单名字不一样:批量解决问题

对多文件信息遍历读取
  1. 不同名多文件上传处理方式:按照表单名字从$_FILES中取出来就可以直接使用(明确知道表单中有多少个文件上传);如果不确定表单中有多少个文件上传,不适合挨个去取(效率不高),可以通过遍历$_FILES数组,挨个取出来实现文件上传

  2. 同名多文件上传:想办法得到一个文件对应的五个元素数组。从$_FILES中把对应的name\tmp_name\size\error\type挨个取出来,然后存放到不同的数组中。

MYSQL扩展

PHP针对MySQL数据库操作提供的扩展:允许PHP当做MySQL的一个客户端连接服务器进行操作。

连库基本操作

连接数据库服务器
  1. 资源 mysqli_connect(服务器地址,用户名,密码) , (现在已废弃mysql而是用mysqli的方式,使用时先网上搜索,确定后再使用)

连接资源默认也是超全局的,任何地方都可以使用该资源进行数据库的其他操作

补充:mysql_connect默认是对一个服务器只连接一次(如果再次运行,返回的是同一个资源),但是如果有需要连接同一个资源两次,那么可以使用第四个参数:TRUE

设置连接编码

保持客户端与服务器之间的沟通顺畅:同一“语言”(字符集)

  1. 形式1:mysql_query(“set names XXX”)

  2. 形式2:mysql_set_charset(“XXX”)

  3. 怎么确定要使用何种编码

客户端当前执行脚本的界面是什么字符集,就设定成什么字符集

选定要使用的数据库
  1. 形式1:mysqli_query(“use XXX”)

  2. 形式2:mysqli_select_db(“XXX”)

关闭连接

主动释放连接:MySQL服务器的连接资源是有限的,不用了需要释放(脚本执行结束系统也会自动释放)

  1. mysql_close()
增删改操作

Mysql_query函数执行结果返回的是true或者false,true代表执行成功,false代表执行失败:失败原因分两种:一种是SQL指令本身语法错误;第二种是执行失败;

做个专门负责数据库初始化的脚本:之后要操作数据库包含该脚本即可

  1. mysqli_query(“insert ….”):通过insert指令向指定表插入对应的数据

  2. mysqli_query(“delete ….”):根据删除指令操作数据库(表)

  3. mysqli_query(“update ….”):根据更新指令操作数据库

查询操作
  1. mysqli_query(“select …”)

  2. 其他类似查询语句,比如:show语句,desc语句

以上两种情况的总结:凡是执行操作希望拿到数据库返回的数据进行展示的(结果返回:数据结果)

  1. 执行结果的处理:成功为结果集,失败为false

3)执行结果的处理:成功为结果集,失败为false

成功返回结果:SQL指令没有错误,但是如果查询结果本身为空返回也是true(结果集是一种资源:转换成bool永远为TRUE)

失败为false:SQL指令有错误

获取结果集行数

mysqli_num_rows():获取结果集中到底有多少行记录

解析结果集

将一种结果集资源(PHP不能直接使用),转换成一种PHP能够解析的数据格式:通过从结果集中(结果集指针:类似数组指针),按照结果集指针所在位置取出对应的一条记录(一行),返回一个数组,同时指针下移…直到指针移出结果集。

  1. mysqli_fetch_assoc():获取关联数组,表的表单名字作为数组下标,元素值作为数组元素值

  2. mysqli_fetch_row():获取索引数组,只获取数据的值,然后数组的下标从0开始自动索引

  3. mysqli_fetch_array():获取关联或者索引数组,但是默认是同时存在:一个记录取两次,形成一组是关联数组,一组是索引数组;但是可以通过第二个参数来决定获取的方式:MYSQL_ASSOC只获取关联数组;MYSQL_NUM只获取索引数组;MYSQL_BOTH获取全部两种。

通常结果集的操作:一般是获取里面的所有(全部记录)

相关函数
  1. mysqli_num_fields():获取一个指定结果集中所有的字段数
  2. mysqli_field_name():获取一个指定结果集中指定位置字段的名字

2)mysql_field_name():获取一个指定结果集中指定位置字段的名字

  1. mysqli_error():获取出错对应的提示信息

  2. mysqli_errno():获取出错对应的错误提示代号

    错误的判断:基于Mysql_query这个函数执行的结果:结果返回false就代表执行错误。

  3. mysql_insert_id():获取上次插入操作所产生的自增长ID,如果没有自增长ID返回0

HTTP

PHP可以用header设计HTTP响应

PHP模拟HTTP请求

原理

PHP可以通过模拟HTTP协议发起HTTP请求

CURL是一个非常强大的开源库,支持很多协议,包括HTTP、FTP、TELNET等,我们使用它来发送HTTP请求。它给我 们带来的好处是可以通过灵活的选项设置不同的HTTP协议参数,并且支持HTTPS。CURL可以根据URL前缀是“HTTP” 还是“HTTPS”自动选择是否加密发送内容。

前提条件:HTTP协议的客户端/服务端模式,HTTP协议不局限于一定要浏览器访问

Curl扩展库使用

1、 开启CURL扩展

2、 有的时候PHP版本会出现即使开启了扩展也无法使用扩展的可能:因为CURL找不到对应的dll文件:需要将相关的DLL文件放到C:windows

3、 重启Apache应用

步骤
  1. 建立连接:curl_init():激活一个CURL连接功能

  2. 设置请求选项:curl_setOpt():设定选项 ,3个参数

    CURLOPT_URL:连接对象

    CURLOPT_RETURNTRANSFER:将服务器执行的结果(响应)以文件流的形式返回给请求界面(PHP脚本)

    CURLOPT_POST:是否才有POST方式发起请求(默认请求是GET)

    CURLOPT_POSTFIELDS:用来传递POST提交的数据,分为两种方式:字符串(name=abc&password=123)以及数组形式(array(‘name’=>’abc’,…))

    CURLOPT_HEADER:是否得到响应的header信息(响应头),默认不获取

  3. 执行请求:curl_exec():执行选项(与服务器发起请求),得到服务器返回的内容

    乱码原因:20select.php中的内容有告知浏览器,但是当前是被服务器脚本23curl_http.php访问的,没有做解析;输出给浏览器之后,需要当前23curl_http.php告知浏览器对应的字符集

  4. 关闭连接:curl_close():关闭资源

文件编程

含义

文件编程指利用PHP代码针对文件(文件夹)进行增删改查操作。

在实际开发项目中,会有很多内容(文件上传、配置文件等)具有很多不确定性,不能在一开始就手动的创建,需要根据实际需求和数据本身来进行管理,这个时候就可以使用PHP文件编程来实现代码批量控制和其他操作。

分类

  1. 目录操作:文件夹
  2. 文件操作:用来存放内容

目录操作

创建目录

mkDir(路径名字):创建成功返回true,创建失败返回false

有些操作为的就是得到一个想要的结果,如果结果本身就存在,那么可以忽略得到过程的错误:抑制错误

删除目录

rmdir(‘路径’)

读取目录

读取方式:将文件夹(路径)按照资源方式打开

  1. openDir():打开资源,返回一个路径资源,包含指定目录下的所有文件(文件夹)

  2. readDir():从资源中读取指针所在位置的文件名字,然后指针下移,直到指针移出资源

    注:任何一个文件夹都有2个特殊文件, ./ 与../ , 分别代表自己与上一目录

2)readDir():从资源中读取指针所在位置的文件名字,然后指针下移,直到指针移出资源

读取所有内容:遍历操作

关闭目录

closeDir();(参数一般用前文openDir赋值给的变量)

其他函数
  1. dirName(一个路径):得到的是路径的上一层路径

  2. realPath(一个路径):得到真实路径(目录路径),如果是文件那么得到的结果是false

  3. is_dir():判断指定路径是否是一个目录

  4. scandir():封装版的opendir\readdir\closedir,获取一个指定路径下的所有文件信息,以数组形式返回

递归遍历目录

递归遍历目录:指定一个目录的情况下,将其下的所有文件和目录,及其目录内部的所有内容都输出出来。

递归遍历目录的思维逻辑

1、 设计一个能够遍历一层文件的函数

a. 创建函数

b. 安全判定:是路径才访问

c. 读取全部内容,遍历输出

2、 找到递归点:遍历得到的文件是目录,应该调用当前函数(调用自己):

a. 需要构造路径(遍历得到的结果只是文件的名字)

b. 需要注意排除.和..

c. 判断是路径还是文件

d. 递归调用函数

3、 找到递归出口:遍历完这个文件夹之后,发现没有任何子文件夹(函数不再调用自己):自带递归出口

4、 如何显示层级关系?函数第一次运行遍历的结果是最外层目录,内部调用一次说明进入一个子目录,子目录再调用一次函数进行孙子目录…如果能够在第一次调用的时候给个标记,然后在进入的时候,通过标记的变化来识别层级关系,就可以达到目的:该标记还能代表层次关系:缩进

a. 在函数参数中增加一个标记:默认值为0

b. 递归调用函数的时候也需要使用该参数:但是是属于当前层级的子层,所以+1

c. 根据层级来实现缩进:str_repeat()

文件操作

  1. file_get_contents(文件路径):获取指定文件的所有内容,如果路径不存在最好做安全处理

  2. file_put_contents(文件路径,内容):将指定内容写入到指定文件内:如果当前路径下不存在指定的文件,函数会自动创建(如果路径不存在,不会创建路径)

  3. fopen(文件路径,打开模式):打开一个文件资源,限定打开模式

    fread(资源,长度):从打开的资源中读取指定长度的内容(字节)

    fwrite(资源,内容):向打开的资源中写入指定的内容

    fclose(资源):关闭资源

    PHP4中是将文件操作用资源形式处理:不论是读还是写都依赖资源指针:文件内容中指针所在位置。

  4. is_file():判断文件是否正确(不识别路径)

  5. filesize():获取文件大小

  6. file_exists():判断文件是否存在(识别路径)

  7. unLink():取消文件名字与磁盘地址的连接(删除文件)

  8. filemtime():获取文件最后一次修改的时间

  9. fseek():设定fopen打开的文件的指针位置

  10. fgetc():一次获取一个字符

  11. fgets():一次获取一个字符串(默认行)

  12. file():读取整个文件,类似file_get_contents,区别是按行读取,返回一个数组

文件下载

文件下载:文件下载:从服务器将文件通过HTTP协议传输到浏览器,浏览器不解析保存成相应的文件。

提供下载方式可以使用HTML中的a标签:<a href=”互联网绝对文件路径”>点击下载</a>

缺点1:a标签能够让浏览器自动下载的内容有限:浏览器是发现如果解析不了才会启用下载

缺点2:a标签下载的文件存储路径会需要通过href属性写出来,这样会暴露服务器存储数据的位置(不安全)

PHP下载:读取文件内容,以文件流的形式传递给浏览器:在响应头中告知浏览器不要解析,激活下载框实现下载。

  1. 指定浏览器解析字符集

  2. 设定响应头设定文件返回类型:image/jpg||application/octem-stream

    设定返回文件计算方式:Accept-ranges:bytes

    设定下载提示:Content-disposition:attachment;filename=’文件名字’

    设定文件大小:Accept-length:文件大小(字节)

  3. 读取文件

  4. 输出文件

方案1:如果文件较小,可以使用PHP5的文件函数操作:file_get_contents

方案2:文件比较大(网络不好),可以使用PHP4 的文件操作方式:一次读一点

会话技术

介绍

web会话可简单理解为:用户开一个浏览器,访问某一个web站点,在这个站点点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。

HTTP协议的特点是无状态/无连接,当一个浏览器连续多次请求同一个web服务器时,服务器是无法区分多个操作是否来自于同一个浏览器(用户)。会话技术就是通过HTTP协议想办法让服务器能够识别来自同一个浏览器的多次请求,从而方便浏览器(用户)在访问同一个网站的多次操作中,能够持续进行而不需要进行额外的身份验证。

分类

  1. cookie技术

    Cookie 是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式。Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件(HTTP协议响应头),它可以包含有关用户的信息。无论何时用户链接到服务器(HTTP请求携带数据),Web 站点都可以访问 Cookie 信息

  2. session技术

    Session直接翻译成中文比较困难,一般都译成时域。在计算机专业术语中,Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。以及如果需要的话,可能还有一定的操作空间。Session技术是将数据保存到服务器端,无论何时用户链接到服务器,Web站点都可以访问Session信息:SESSION技术的实现是依赖COOKIE技术的。

区别

  1. 安全性方面

    Session存储服务器端,安全性高

    Cookie存储浏览器端,安全性低

  2. 数据大小方面

    Cookie的数量和大小都有限制(20个/4K)

    Session数据存储不限

  3. 可用数据类型

    Cookie只能存储简单数据,数值/字符串

    Session可以存储复杂数据(自动序列化)

  4. 保存位置方面

    Cookie保存在浏览器上

    Session保存在服务器上

COOKIE的基本使用

原理

COOKIE技术:服务器将数据通过HTTP响应存储到浏览器上,浏览器可以在以后携带对应的COOKIE数据访问服务器。

  1. 第一次请求时,PHP通过setcookie函数将数据通过http协议响应头传输给浏览器

  2. 浏览器在第一次响应的时候将Cookie数据保存到浏览器

  3. 浏览器后续请求同一个网站的时候,会自动检测是否存在Cookie数据,如果存在将在请求头中将数据携带到服务器

  4. PHP执行的时候会自动判断浏览器请求中是否携带Cookie,如果写到,自动保存到$_COOKIE中

  5. 利用$_COOKIE访问Cookie数据

设置COOKIE信息

Setcookie函数用来设定COOKIE信息

Setcookie(名字,值)

  1. cookie名的设置:字符串,第一个参数
  2. cookie值的设置:第二个参数
  3. cookie值的类型要求:必须是简单类型中的整数或者字符串
读取COOKIE

$_COOKIE数组的使用

COOKIE(会话技术)能够实现跨脚本共享数据

COOKIE生命周期

COOKIE生命周期:COOKIE在浏览器生存时间(浏览器在下次访问服务器的时候是否携带对应的COOKIE)

  1. 默认(不设定)时的生命周期:不设定周期默认是关闭浏览器(会话结束)
  2. 设定为一个常规日期戳的周期:通过setcookie第三个参数可以限定生命周期,是用时间戳来管理,从格林威治时间开始(如果设定七天后过期,time() + 7*24*60*60)
  3. 设定为“0”的周期:在第三个参数设定生命周期的时候,用0代替时间戳:表示就是普通设置,会话结束过期
  4. 删除一个cookie的做法:服务器没有权限去操作浏览器上的内容(不可能删除)。可以通过设定生命周期来让浏览器自动判定COOKIE是否有效:无效就清除
COOKIE作用范围

作用范围:不同的文件夹层级中,设定的COOKIE默认是在不同的文件夹下有访问限制。上层文件夹中设定的COOKIE可以在下层(子文件夹)中访问,而子文件夹中设定的COOKIE不能在上层文件夹中访问。

  1. 默认(不设定)的范围:就是使用COOKIE默认的作用范围
  2. 设定为“/”的含义:告知浏览器当前COOKIE的作用范围是网站根目录

Setcookie(名字,值,生命周期,作用范围)

COOKIE跨子域

跨子域:在同一级别域名下,myitcast.com(一级域名),可以有多个子域名(www.myitcast.com和gz.myitcast.com),他们之间是搭建在不同的服务器上(不同文件夹:E:/server/apache/htdocs和E:/web),但是可以通过COOKIE设置实现对应的COOKIE共享访问。但是默认是不允许跨域名访问的。

  1. 设定cookie的有效域名:不同的域名(包含主机)之间不能共享COOKIE

    可以通过setcookie的第五个参数来控制

    Setcookie(名字,值,生命周期,作用范围,有效域名)

  2. 不设定时的默认有效域名

  3. 跨子域的设定方法:在设定域名访问的时候用设定上级域名即可:myitcast.com,这个是有所有以myitcast.com结尾的网站都可以共享COOKIE

COOKIE数组数据

COOKIE本身只支持简单数据(数字或者字符串),能够保留的数据本身有限,也不成体系。如果需要使用COOKIE来保留一组数据的话,想办法凑成数组。(COOKIE不支持数组)

  1. 设置形式:setcookie(‘c1[k1]’, 值)

  2. 读取形式:$_COOKIE[‘c1’][‘k1’]

SESSION基本使用

原理

Session与浏览器无关,但是与Cookie有关。

  1. PHP碰到session_start()时开启session会话,会自动检测sessionID

    如果Cookie中存在,使用现成的

    如果Cookie中不存在,创建一个sessionID,并通过响应头以Cookie形式保存到浏览器上

  2. 初始化超全局变量$_SESSION为一个空数组

  3. PHP通过sessionID去指定位置(session文件存储位置)匹配对应的文件

    不存在该文件:创建一个sessionID命名文件

    存在该文件:读取文件内容(反序列化),将数据存储到$_SESSION中

  4. 脚本执行结束,将$_SESSION中保存的所有数据序列化存储到sessionID对应的文件中

开启SESSION

启用session,任何时候都需要开启session(脚本使用到$_SESSION就开启一次)

$_SESSION是通过session_start()函数的调用才会定义的,没有直接定义

Session使用需要开启session_start()

设置SESSION

如果想存储数据到session中,那么只要不断给$_SESSION数组添加元素即可

读取SESSION

$_SESSION就是一个数组,存储什么数据,什么方式存的,就是可以通过什么方式访问什么数据

会话技术的本质是为了实现跨脚本共享数据:在一个脚本中定义数据,在另外一个脚本中保存数据

删除SESSION
  1. Unset($_SESSION[元素下标])删除指定session数据

  2. 通过$_SESSION = array(); :删除全部数据(只清除了数据,文件还存在)

SESSION基础配置
  1. session.name:session名字,保存到COOKIE中sessionID对应的名字

  2. session.auto_start:是否自动开启session(无需手动session_start()),默认是关闭的

  3. session.save_handler:session数据的保存方式,默认是文件形式

  4. session.save_path:session文件默认存储的位置

    使用系统的文件夹存储不安全,需要指定对应存储路径

  5. session.cookie_lifetime:PHPsessionID在浏览器端对应COOKIE的生命周期,默认是会话结束

  6. session.cookie_path:sessionID在浏览器存储之后允许服务器访问的路径(COOKIE有作用范围)

  7. session.cookie_domain:COOKIE允许访问的子域(COOKIE可以跨子域)

两种配置方式:

  1. php.ini中配置:全局配置,修改php.ini中的配置项

  2. 脚本中配置:PHP可以通过ini_set函数来在运行中设定某些配置项(只会对当前运行的脚本有效),把这种配置称之为项目级

    @Ini_set(‘session.save_path’,’E:/server/sessions’);

销毁SEESION

Session删除是指删除session数据,$_SESSION中看不到而已;销毁session是指删除session对应的session文件。

系统提供一个函数:session_destroy(),会自动根据session_start得到的sessionID去找到指定的session文件,并把其删除。

SESSION垃圾回收

session会话技术后,session文件并不会自动清除,如果每天有大量session文件产生但是又都是失效的,会增加服务器的压力和影响session效率。

垃圾回收,是指session机制提供了一种解决垃圾session文件的方式:给session文件指定周期,通过session文件最后更改时间与生命周期进行结合判定,如果已经过期则删除对应的session文件,如果没有过期则保留。这样就可以及时清理无效的僵尸文件,从而提升空间利用率和session工作效率。

  1. 任何一次session开启(session_start),session都会尝试去读取session文件
  2. 读取session文件后,有可能触发垃圾回收机制(在session系统中也是一个函数:自己有一定几率调用)
  3. 垃圾回收机制会自动读取所有session文件的最后编辑时间,然后加上生命周期(配置文件)与当前时间进行比较(所有session文件)
    • 过期:删除
    • 有效:保留
SESSION垃圾回收设置参数
  1. session.gc_maxlifetime = 1440:规定的session文件最大的生命周期是1440秒,24分钟
  2. session.gc_probability = 1:垃圾回收概率因子(分子)
  3. session.gc_divisor = 1000:垃圾回收概率分母

默认的触发概率是1/1000

禁用COOKIE后如何使用SESSION

禁用COOKIE不能使用SESSION原因

Session技术需要利用到COOKIE技术来保存sessionID,从而使得PHP能够在跨脚本的时候得到相同的sessionID,从而访问同一个session文件。

解决思路:最终让session_start在开启之前拿到原来的sessionID(另外一个脚本的)

实现

在PHP中,想要解决没有COOKIE也实现session技术的方式有两种:

方案1:可以利用PHP提供的session函数:session_id和session_name来获得和设置sessionID或者name从而解决session_start产生新sessionID的情况(手动操作):

  1. 在session保存数据的脚本中获取sessionID和名字
  2. 想办法将数据传递给另外一个脚本:表单传值(URL或者form表单)
  3. 在需要使用到session的脚本中,先接收数据
  4. 阻止session_start产生新的ID,告诉它已经存在:session_id($id)

方案2:可以利用session机制已经提供的解决方案自动操作(配置)

原因1:默认session配置只允许使用COOKIE保存sessionID:cookie_ony

原因2:默认关闭了其他能够传送数据的方式,只保留了COOKIE

  1. 修改PHP配置文件,开启其他方式传输sessionID,关闭只允许使用COOKIE传输功能
  2. 一旦配置开启,PHP会自动将sessionID和session名字在其他位置绑定数据,同时还会在session_start的时候,考虑其他方式传递(表单)的数据,而不是只有COOKIE

面向对象编程

概念及原理

也叫OOP编程(Objected Oriented Programming),是一种基于面向过程的开发思想,与面向过程强调分解事务步骤相似,面向对象更需要追求事务操作的”主体”,也就是对象

关键字

  1. class:类,是定义面向对象主体的最外层结构,用来包裹主体的数据和功能(函数)

  2. object:对象,某类事务的具体代表,也是实际数据和功能操作的具体单元

  3. new:实例化,从一个抽象的概念得到一个符合抽象概念的具体实例的过程

  4. member:类成员,本质是class结构中的所有内容,类成员有三种

    method:方法,创建的函数

    property:属性,创建的变量

    constant:类常量:创建的常量

基本语法

定义类

class 类名 { }

实例化

new 类名[()]

$m = new 类名() // 使用变量保存对象

类成员

基本操作

  1. 成员变量: public 变量名字 [=值]; , 成员变量可赋值也可以不赋值

    成员变量访问:$对象名->属性名

    可以通过次方法新增对象的属性$对象名->属性名(类中不存在) = “值”

  2. 成员方法:[public] function 函数名(){} (正常的定义函数即可)

    调用: $对象名->方法名();

  3. 类常量: const 常量名 = 值;

    常量不是由对象来进行访问

  4. 注: 不能在类结构{}中直接写其他任何代码, 如 echo, define, if(){} , 这些只能卸载方法中

访问修饰限定符

用在属性和方法前,用来控制属性和方法的访问位置三种,public,protected,private

注:因为在PHP中并不允许所有类中的方法和属性都能在外部访问

  1. public:共有,内外部都可以访问 (注:方法默认为public)
  2. protected:只能在类的内部,能继承
  3. private:私有,只能在类的内部访问,不能继承

在内部访问类成员

在类内部不能直接调用属性

访问方法

  1. 使用全局变量初始化,然后调用属性(但当用新的对象时,需重新定义全局变量,因此不推荐)
  2. 使用内置对象this,this->属性(方法)

构造方法

__construct(),是一种类结构特殊方法,有了构造方法的类在实例化对象之后,对象会自动调用

语法: public function __construct:

通常是通过外部传参来用__construct实现属性初始化

注:在实例化对象时传的参数会自动进入__construct的参数中 , 在外部也可以调用此方法(不建议)

析构方法

__destruct:对象在被销毁时自动调用(如unset(对象))

对象传值

令一个变量等于一个对象并不会创建新的对象而是使两个变量指向同一个对象,即结果只有一个对象

类常量访问

使用范围解析操作符::

语法:类名::

静态成员

使用static关键字修饰的类成员(pubulic等依然需要加上),表示该成员属于类访问,PHP静态成员有两种,静态属性和静态方法

访问: 类+范围解析操作符+静态属性访问 (属性有$符号,不加就是一个常量,在内部也可以访问)

对象可以访问静态方法,而类只能访问不带$this的普通方法(不建议)

注:在静态方法中无法使用$this

slef关键词

静态成员或者常量的访问都必须通过类名访问,使用类名的话,在类名更新的时候不方便,引入self关键字

  1. self是用来代替类名的,与范围解析操作符::一起使用

对象克隆

clone 对象名

__clone方法,当克隆后自动调用的方法

面向对象的三大特性

封装

指将数据和对数据的操作捆绑到一起,形成对外界的隐蔽,同时对外提供可以操作的接口

继承

有一些公共的特性可以在一些基础类中体现,而其他相似或者较小类可以直接使用上级类中的公共代码

多态(PHP不支持)

指在发生类的继承的状况下,出现方法的重写,即子类拥有与父类同名方法,然后在实例化对象的时候让父类对象指向子类对象,父类对象表现的子类对象的特点

PHP继承

实现

class 子类 extends 父类 {}

有限继承

指子类继承父类成员,不是所有类容,而是继承父类部分内容

  1. 继承内容:所有公有成员,受保护成员和私有属性,不能继承父类的私有方法
  2. 受保护继承protected,表示允许被子类在子类内部访问的意思,而不允许被外部直接访问
  3. 子类若想访问父类私有成员,那么前提使父类提供了能提供私有成员的接口:即提供了共有或者受保护的方法给子类访问
  4. 静态成员也遵循继承规则,只是访问用类访问
  5. 构造方法和析构方法也可以被子类继承,此时需要注意子类对象实例化时对应的父类构造方法的参数

重写Override

  1. 子类继承父类,同时子类定义与父类同名的类成员

  2. 重写父类成员之后,子类只会直接访问子类的成员(覆盖)

    注:不管是公有还是受保护属性,一旦重写,父类的就会不存在,而私有属性不会被覆盖而丢失

  3. 子类重写父类的方法,控制权不能高于父类,即子类可以比父类更开放

    PHP中重写父类方法的时候,必须保证与父类同名方法参数一致(数量,类型)

  4. 如果想要保证父类被重写的方法继续执行(默认永远只访问子类重写的新方法),需要在子类重写方法的时候使用parent关键字,parent::函数名()

继承特点

  1. PHP中继承只能单继承,即子类只有一个父亲(有些语言支持多继承)
  2. PHP若想继承多个类,可以使用链式继承
  3. PHP继承只有私有方法不能被继承

静态延迟绑定

  1. 使用static关键字代替self进行类成员访问(slef即使继承依然绑定父类,使用static代替self则是绑定调用的对象)

最终类Final

最终类,使用finnal关键字继承类名,表示此类不可以被继承

语法: finnal class 类名

也可以用于修饰方法,代表方法不能被重写

抽象类Abstract

  1. 使用abstract关键字修饰的类,表示该类只能被继承,不能被实例化

  2. 也可以修饰方法,不过不能有方法体(大括号),且必须在抽象类里面

  3. 抽象方法因为要被子类继承实现,所以不能使用private修饰(私有方法不能被继承)

  4. 子类继承抽象类后,如果抽象类中有抽象方法,那么子类必须选择自己成为抽象类或者实现抽象方法(所有抽象方法)

接口Interface

定义:与类类似,专门用来规范一些共性类必须实现的方法

  1. 接口定义:使用interface关键字,后跟接口名字(与类结构一样)
  2. 接口不是类,不可以被实例化
  3. 接口实现:接口用来法规范类必须完成的事情,所以接口只能被类实现:implements, class 类名 implements 接口
  4. 接口成员:接口中只能定义公有抽象方法(接口中方法自带abstract不能再添加abstract)和接口常量(const)
  5. 接口成员方法必须被实现的子类或者类为抽象类,接口内必须为public
  6. 接口可以继承接口

trait代码复用

  1. trait类似class关键字(trait 名)

  2. 内部可以拥有一个类拥有成员寿星,成员方法,但不能有类常量

  3. trait不能被实例化,不能被继承

  4. trait是用来将公共代码提供给其他类使用的,而类要使用trait的前提是加载对应的trait

    use 名 即可加载(名可以为多个)

    调用时类名->名

  5. 一个类可以用多个trait,

  6. 当同时引入的多个trait有同名方法,那么会产生冲突,解决冲突的方法是使用insteadof代替处理以及对被替代方法使用别名

    • GO :: show insteadof Eat , 让GO中的show替代Eat中的show

    • Eat :: show insteadof Go

      Go::show as shows (调用GO中show使用shows)

  7. 同名覆盖问题:如果类中有引入的trait同名成员,会有不同处理

    • 属性:不允许重名,即类中不允许定义与trait中同名的成员属性(静态属性也一样)
    • 方法:类覆盖trait
  8. 继承覆盖问题:如果类中在使用trait的同时,也是继承自父类的,而trait中与父类中有同名方法,那么trait中将覆盖父类同名方法,如果要访问父类方法,可以在trait同名方法中使用parent关键字访问父类同名方法

  9. trait自己不能访问,只是用来给其他类提供代码复用的,因此允许类在使用trait时更高里面方法的访问控制权:在as之后,使用目标访问修饰限定符,修改后原来的权限不变

    例如show as public eshow(在类中使用该代码可以将show将private改为public)

  10. trait中可以使用抽象方法,用来规范实用类必须实现对应抽象方法:使用类要么为抽象类,要么就必须实现抽象方法

重载

  1. 魔术方法:指系统为类中预先设计好的,只需要开发者实现的方法,魔术方法以双下划线__开始,对象在某种特定情况下自动调用的方法,如析构方法,构造方法
  2. PHP重载是指某些容错处理,在访问没有权限或者不存在的属性或者方法的时候,会自动触发的魔术方法分为属性重载,方法重载

属性重载

  1. __get($key):读属性的时候触发
  2. __set($key,$value):写属性的时候书法
  3. __isset($key):外部调用isset()函数或者empty()函数自动触发

等等

命名空间

含义

namespace,是指认为的将内存进行分割,让不同内存区域的同名结构共存,从而解决在大型项目中可能出现的重名结构问题

基本内容

语法

namespace 空间名字

作用

能够创建同名结构、包含函数、常量和类(一个空间不允许同名)

用法

  1. 命名空间里可以定义同名的函数、常量、类(结构):因为此类结构不允许同名,这些是命名空间规范的目标(陈为空间元素)
  2. 命名空间的声明(第一次)必须在所有代码之前
  3. 一个脚本通常只会定义一个空间

命名空间子空间

定义:在已有空间之上,再在内部进行空间划分,让每个小空间独立起来

  1. namesapce + 路径符号\实现
  2. 子空间的创建不一定非要在前面创建了上级空间,即可以直接在某个脚本中创建空间

命名空间访问

三种访问方式:非限定名称、限定名称和完全限定名称

非限定名称访问

直接访问空间元素名字,访问的是当前代码所属空间的元素

限定名称访问

即在访问元素的前面使用相应的空间名字,基于子空间来实现,使用自己当前的子空间名字++元素名称访问

例如:space1\display();

完全限定名称

即从根目录(全局空间)开始访问,使用\作为全局空间开始符(开头一定要\)

例如: \space\display()

\space\space1]display()

全局空间

含义

空间元素在没有定义空间的情况下所属的空间,也是所有定义的空间的顶级空间

没有指定空间的元素属于全局空间(但是全局空间没有名字)

所有空间本质都是在全局空间下的划分

全局空间元素的访问使用完全限定名称访问

命名空间引入

将另外一个空间的元素(类、函数和常量)引入到当前空间来,当做当前空间的元素访问,从而可以减少复杂的完全限定名称访问,取而代之的是非限定名称访问

use 空间名\元素

空间引入的元素默认是类,引入其他元素加上function,const关键字

如果引入元素在当前空间存在,解决方案用别名as

PDO

在PHP开发过程中.可能会使用到多种数据库,PDO是用来进行统一的

git的学习

发表于 2019-12-02 | 分类于 git/github

  最近在学习git的使用这里简单的记录一下。附上学习网址

操作本地指令

  1. vi 文件名,可以进入到编写模式,若该文件不存在则自动创建

    PS: vi进入后需要按下 i 进入到插入模式,退出时按下ESC再输入:wq就能够退出

  2. git add filename,可以将文件上传到缓存区(stage)

  3. git commit -m “(注释)”,可以将缓存区(全部)上传到分支

  4. git status, 告诉当前状态

  5. git diff filename,可以看到工作区和缓存区的区别

    git diff HEAD - - filename,可以看到工作区和版本库的区别

  6. git log ,查看历史记录,(输入q退出)

    git log - -pretty=oneline,可以减少输出

  7. git reset - -hard HEAD 可以返回上一版本

  8. git reset - -hard commitid ,可以返回到指定版本

  9. git reflog 可以记录每次操作,便于查找commitid

  10. git checkout - -file 可以撤销工作区中的修改(一次,没有使用git add)

    (git status 的提示中git restore <file>也可以用,不知区别是什么,谷歌也没找到)

  11. git reset HEAD <file> 可以把缓存区的撤销修改掉,返回工作区

    (git status提示中也可以用git restore - -staged<file>但我目前并没有搞清楚两则的区别,还是两者都是一样的?)

  12. rm file 删除工作区中的文件

    git rm file 向缓存区提交操作命令

    最后再使用git commit -m “”即可

    git checkout - -file 可以撤销删除工作区中文件的指令(实质是把版本库中的东西搬回来,因为你的版本库还并没改动,注意这个时候还没有git rm ,gir commit)

  13. cat (file),查看文件内容

远程仓库

链接本地库

  1. $ git remote add origin git@github.com:yourusername/yourdirname.git (根据自己的命名来写),将你的仓库与github关联

  2. $ git push -u origin master ,将本地库推送到远程库,因为是第一次使用所以需要加一个-u,后面则不需要。

    PS:这里我在使用这个命令的时候踩了一个坑,输入该命令后报错

    1
    2
    3
    4
    ERROR: Repository not found.
    fatal: Could not read from remote repository.
    Please make sure you have the correct access rights
    and the repository exists.
    
    在网上查了很久终于找到了解决方法,附上[网址](https://blog.csdn.net/weixin_40886892/article/details/80725071).
    
    我总结一下,将仓库中的.git目录打开(因为是隐藏没文件夹,没有该目录,需要设置,自己上网搜一下就有了),打开config文件,将url后面的改为https模式形式,具体网址为GitHub上项目的网址,项目中有可以 直接复制网址的按钮,直接使用即可没然后就能git push了
  3. 此后上传文件使用 $git push origin master 即可

    推送其他分支就用git push origin (对应分支名如dev)

  4. 当你的伙伴向项目的分支push了,那么你push会失败,这个时候应该先pull一下本地合并,再push

    注:git pull 可能会失败,因为未将远程的dev和本地的dev链接,根据下面的提示输入命令后再pull

从远程库克隆

  1. git clone (网址),从库那复制即可

(git clone 后还可以跟其他的,它满足多种协议,若想了解,可以上网搜一搜)

PS : git clone一般比较慢,是因为github.global.ssl.fastly.net该域名被限制,我现在还没找到好的教程,主要是对于各种协议,端口理解不够(计网这本书真该好好多刷几遍了)

后来问了下学长,发现设置一下代理,再挂个梯子就行了,不过一定记得github前的https改为http,至于原因,暂时学艺不精不清楚,学长是这么说的,这件事整了好几个小时,得好好整一些代理和计网了

分支

  1. git checkout -b dev , 创建dev分支然后切换到dev分支,-b参数表示创建然后再切换

    这条命令相当于包含了两条命令

    git branch dev ,创建

    git checkout dev,切换

    git switch (分支),切换分支,相对于checkout更好理解

    git switch -c (分支),创建并切换分支

  2. git branch ,查看当前分支

  3. git merge (分支),合并指定分支到当前分支

    git merge –no-ff -m “(tag)” (分支),禁用FASTWARD模式,使之能够查看分支历史,(注意ff前只有一个 -。)

  4. git branch -d (分支),将指定分支删除

  5. git log –graph,查看分支合并情况

  6. git stash,储藏现场(已经使用过了git add才能用),注意时分支

  7. git stash list 查看储存

  8. git stash apply,恢复

  9. git stash drop,删除

  10. git stash pop,恢复并删除

    ps:这里谈一下为什么要先用stash隐藏,首先如果你在add后,没有用stash,返回原分支,会发现你在分支中增加的文件(或者做的改动)在原分支也有,并且在原分支做改动的时候会发现分支中的文件也发生改动,这里可以理解为你在commit前你的各个分支都是一样的,做改动的时候也会在其他分支中改动,你又不想用commit 污染commit的记录,所以这里需要stash一下。

  11. 多次stash可以用$ git stash apply stash@{0},恢复指定的stash

  12. git cheery-pick (commitid)

    当你在分支工作的时候,需要在主分支修改一个bug,在stash分支,并在主分支改动后,你需要将改bug的改动回到分支上,否则在后面合并的时候会报错,这个指令可以将改错弄到分支上

  13. git remote 查看远程库信息

    git remote -v 显示更相信信息

标签管理

  1. git tag <name>创建标签 (先切换到要打标签的分支)

  2. git tag 查看当前标签

  3. git tag <name> commitid 向以前的commit打标签

  4. git show <tagname> 查看标签信息

  5. git tag -a <tagname> -m “内容” commitid 用于创建带有说明的标签 -a指定标签名, -m指定说明名字

  6. git tag -d <tagname>删除标签

  7. git push origin <tagname>推送标签到远程

    git push origin –tags 推送全部未推送到远程的本地标签

    推送过后要删除标签需先在本地删除,然后从远程删除

    git push origin :refs/tags/<tagname>

python学习

发表于 2019-11-26 | 分类于 语言学习

学习教材0基础入门学习python(后面标题分类为书中章节)

变量、分支、循环、条件、函数等常规内容

3.1

print() : 输出

input():用户输入,同时括号内的内容为提示用户的内容

3.2

python可对字符串进行拼接

1
2
3
4
a = "3"
b = "5"
c = a + b
print(c) # 输出35

3.3

在字符串前加一个r,代表原始字符串,即字符串中若出现转义(如\n)会默认为不换行而是以原样输出

3.4

在python中”””内容”””(3对引号),输出时结果会以引号中的换行模式输出

3.6

python中的条件分支语法如下

1
2
3
4
if 条件 : # python中需要打一个冒号,这样同时也能在第二行缩进,缩进是python辨认顺寻的一个重要方法
内容
else :
内容

3.7

python中的循环也一样,针对while需要加冒号

3.8

产生随机数可以用random模块,调用函数randint().使用之前先导入import random

如

1
2
import random
a = random.randint(1,10)

3.9

int()、float()、str():类型转换

浮点数转整数,python会直接截断小数点后的数据

type函数可用于判断数据类型

isinstance(a,b):两个参数,将a,b数据类型比对,相同则返回true

a:数据

b:数据类型

3.10

  1. python3中,整数除以整数得到的不一定是整数(很多编程语言会依然得到整数),而可能会变成浮点数

  2. 如果想得到整数可以用地板除法如 : 3//2 得到1

并且3.0 // 2 得到的依然是 1.0 (而不是1.5)

  1. python中有not的逻辑运算符得到与操作数相反的布尔类型的值
  2. python中5>3<4行得通,会被拆解为5>3 and 3<4

4.1

if-else多次使用时可以简化为

1
2
3
4
if  :
...
elif :
...

4.3

缩进是python的灵魂,如通过缩进来匹配if-else

4.4

三元操作符

a = x if 条件 else y

4.5

断言: 当关键字后i按的条件为假的时候,程序自动崩溃

语法: assert 条件

4.6

while循环

语法:

while 条件:

​   循环体

4.7

for循环

for 变量 in 可迭代对象:

  循环体

1
2
3
4
5
6
7
8
for each in "ABCDE":
print(each)
#输出结果为
A
B
C
D
E

range(): 为指定的整数生成一个数字序列,例range(100),得到的就是1到99的数字序列

语法: range(stop)

range(start,stop)

range(start,stop,step)

第一张用法会从0开始步长为1变到stop

若要输出出来先加上list,否则输出的是(start,stop)

start,stop都可以是负数

4.8

break可以退出循环

4.9

continue可以跳出循环开始下一轮循环

4.10

while与for也可以有else语句

当条件不成立的时候,执行else后的语句

5.1

列表(list):可以理解为数组

  1. 创建列表 number = [1,2,3,4,5],可以用foreach循环
  2. 列表可以添加不同类型的元素

向列表添加元素(方法)

  1. append(a): 只支持一个参数
  2. extend([a,b….]): 多个参数,
  3. insert(索引值,[a,b,c])

注: 语法均为 列表.方法名 (相当于列表是一个对象的实例化)

extend只能添加列表

insert列表,单个元素都可以,并且支持负数,表示与列表末尾的相对距离


len(): 获取列表的长度(元素个数)

通过索引值找元素的索引值也可以为负数,比如-1就是最后一个元素


从列表中删除元素(前2个是方法)

remove(): 指定一个待删除的元素(元素的值而不是索引值)

pop():参数是索引值,不带参数默认是列表中的最后一个元素

del: del 列表[索引值]:删除元素 , del 列表:删除列表


列表切片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
list1 = [ 1,2,3]
list2 = list1[1:100]
# 列表2为[2,3] , 可以取到从头到尾(不包括尾的值),例如100改为2,那么列表2为[2]
list3 = [:2]
# 列表3为[1,2]
list4 = [1:]
#列表4为[2,3]
list5 = [ : ]
#列表5为[1,2,3]
list6 = [-1:]
#列表6为[3]

#列表切片还可以加上步长
list7 = list1[::2]
#列表7为[1,3]
list8 = list1[::-1]
#列表8为[3,2,1]

#这样得到的列表是原列表的拷贝,不会影响原列表

列表用大小比较符号的时候会拿出第一个元素比较

+ 可以将两个列表连在一起

* 可以将列表重复


列表方法

count():统计某个元素出现的次数

index(,start,stop):返回某个元素第一次出现的索引值,start,stop不添加的话默认为从头开始

reverse():将整个列表原地翻转

sort():将列表元素进行排序,如果要逆向排序,在括号内输入reverse = ture即可

5.2

元组:与列表的最大区别,元组只可读,不可写。

元组(tuple)创建与列表不同,使用小括号创建

元组的标识符是逗号

1
2
3
4
5
tuple1 = (1,2,3,4) #元组
tuple2 = (1) #不是元组
tuple3 = (1,) #是元组
tuple4 = 1 #不是元组
tuple5 = 1, # 是元组

删除元组使用del 元组

5.3

字符串也可以通过索引来取值


字符串的内置方法

casefole():将所有字符改为小写

count(sub[,start[,end]]):用于查找sub参数在start,end间出现的次数,start,stop没有时查找整个字符串

find(sub[,start[,end]]): 如果找到了返回位置索引值,找不到返回-1

index(sub[,start[,end]]):

replace[old,new[,count]]:将字符串中的old参数指定的字符串转换为new参数指定的字符串

split(sep=None,maxsplit=-1):拆分字符串,将sep的位置拆开,如str.split(sep=”,”)

join:拼接字 用法区别 ‘-‘.join(countries)


字符串格式化

format: 方法

1
2
3
4
"{0} love {1}".format("I","python")
# 结果为i love python
" {a} love {b}".format(a = "I" , b="python")
#如果将0(位置参数)与关键字参数混着用,位置参数放在关键字参数之前

%

1
2
3
4
str1 = "I LOVE "
str2 = "PYTHON"
"%s%s" % (str1,str2)
#得到的时 I LOVE PYTHON

5.4

序列(列表、元组、字符串)内建方法

list(): 将元素迭代放入列表

tuple(): 将可迭代对象转换为元组,用法与list一样

str(): 转换为字符串

len():返回参数长度

max():返回参数最大值 (方法)

min(): 返回最小值(方法)

sum():返回元素和

sorted(): 与sort不同的时,它返回的是一个新列表(方法)

reversed():逆转与sorted(方法)

enumerate():生成2元组(2个元素的元组),(可以结合for each用,)

1
b = list("python") # b = ['p','y','t','h','o','n']

6.1

函数创建使用def关键字

函数返回多个值的时候用元组打包

函数给参数指定False的时候就不会传值进去

6.2

函数文档:用于给函数解释

在函数内容中用"“” "“”包裹

函数在传参的时候可以指定参数

1
2
3
4
def hello(people,where):
print("people"+"在"+"where"+"say hello")
# 调用的时候可以指定参数
hello(where = "home",people = "我")

位置参数需要放在关键字参数前面

python可以在定义时指定参数的默认值,若参数未传值,直接调用默认值


当参数不确定个数的时候,可以在参数前加个那么就可以添加多个参数,然后添加的\的参数变成元组,如果还想要其他参数,那么在指定参数的具体值得时候需要使用关键字参数来赋值


平时得*具有解包得作用

1
2
3
num = [1,2,3,4]
print (*num)
#得到的是1,2,3,4

6.3

如果在函数内部试图修改全局变量的值,python会创建一个新的局部变量替代(名字与全局变量相同)

但可以在使用变量前给变量加个global关键字

6.4

lambda:定义匿名函数

g= lambda x :2*x

:分隔参数与返回值,左边是函数的参数,右边是函数的返回值


filter()是一个过滤器

2个参数,如果第一个参数是一个函数,则将第2个可迭代对象里的每一个元素作为函数的参数进行计算

如果第一个参数为None,则直接将第2个参数中为True的值筛选出来


map():2个参数,一个函数一个可迭代对象

将可迭代对象的每一个元素作为函数的参数进行运算加工

7.1

字典

dict1={索引:值,索引:值} (注意:用的是大括号)

也可以用内置函数dict创建字典

dict2 = dict(a=1,b=2) 有多种方式创建

改变字典的值方法与列表一样,如果键在字典中没有则自动添加


内置方法

fromkeys: 创建并返回一个新的字典

keys():返回字典所有的键

value():返回字典所有的值

items():返回字典的键值对

get():当键不存在的时候不会报错

clear():清空字典

pop():给定键弹出对应值

popitem():弹出一个项

update():更新字典

在函数调用时参数前加**会使参数变成字典

7.2

集合

如果使用{}没加上映射关系则代表使集合

集合中的元素唯一,重复的元素自动删除

集合使无序的,无法通过索引找到值

除了直接用{},函数set也可以创建集合

读取集合中的值可以用for each in 集合


用in 和 not in 判断元素是否在集合中


方法

add():添加元素

remove():删除集合中已知的元素

文件系统

8.1

open(): 打开文件,该函数有多个参数,使用时搜索即可

  最近在使用open函数打开文件时输出时弹出以下错误信息

  经谷歌搜索后发现是编码问题,采用了jbk编码无法识别,所以我们将编码设置为UTF-8即可


close()方法用于关闭文件


read():读取文件,如果不设置参数,那么会全部读取出来,文件指针指向文件末尾

tell() : 告诉你当前文件指针的位置

seek(offset,from):从from(0,起始位置,1当前位置,2文件末尾) 偏移offset字节

readline():在文件中读取一整行

写入文件用方法write

8.2

OS模块

使用模块前先用import导入

方法

getcwd():返回当前工作目录

chdir(path) : 改变工作目录

listdir(path=’.’) :列举指定目录中的文件名

mkdir(path) : 创建单层目录,如该目录已存在抛出异常

makedirs(path)” 递归创建多层目录,如该目录已存在抛出异常

remove(path):删除单层目录,如该目录非空抛出异常

rename(old,new):将文件old重命名为new

system(commond):运行系统的shell命令

os.curdir :指代当前目录(‘.’)

os.pardir : 指代上一级目录

os.sep : 输出操作系统特定路径分隔符

os.linesep : 当前平台使用的行终止符

os.name : 指定当前使用的操作系统


os.path 模块

异常处理

9.2

try-except语句

try:

检测范围

except Exception [as reason]:

出现异常(Exception)后的代码

类和对象

11

类名约定以大写字母开头

class 类名: (定义类)

实例化对面名 = 类名() // 对象实例化

对象名.方法 : 调用方法


定义方法的时候self是必须参数,代表对象本身,可以用slef.属性来赋值,调用等


魔法方法: _方法名_

_init_ : 在实例化对象时,自动调用改方法,若init又参数 ,可以实例化对象时对参数赋值


python中定义私有变量只需在变量名或函数名前加上”__”

对象._类名__变量名 可访问两个下划线开头的私有变量


类继承: class 类名 (被继承的类)k

子类中定义与父类同名的方法或属性,会自动覆盖父类对应的方法或属性


super函数可以自动找到基类的方法,传入self参数

可以用于定义子类时因为定义相同的方法而使父类方法被覆盖


多重继承

class 类名 (父类1,父类2,父类3)


属性是静态变量,对对象赋值相当于覆盖属性,如果直接对类的属性改变,那么未对对象属性赋值,属性也会相应改变


__init__方法返回值一定是None


_new_(cls[,…])才是在第一个对象实例化时调用的第一个方法

与其他魔术方法不同.它第一个参数是类cls,其他参数会传给init

这个类需要返回一个实例化对象


模块

13

为了让IDLE能找到模块需要放到默认的python安装路径下

模块就是程序

import 文件名(不加后缀)


在调用时不能直接调用,而是

模块名.函数名


注!!!: 文件名不能用全数字

模块命名方式

1 import 模块名

2 from 模块名 import 函数名

3 import 模块名 as 新名字

__name__属性

__name__属性的值与程序状态有关

如果程序直接运行__name__=main,如果程序作为模块导入__name__=模块的名字

搜索路径

import sys

sys.path : 他包含的为python导入模块的搜索路径

若要指定某个文件夹而又在sys.path中,则sys.path.append(‘路径’) 即可

包

创建包的具体操作

1 创建一个文件夹用于存放相关模块文件夹即为包的名字

2 在文件夹中创建一个_init__.py的模块文件,内容可以为空(必须在每个包目录下建立一个__init_\.py模块,可以是一个空文件,也可以是写一些初始化代码,这是python的规定,用来告诉python将该目录当场一个包处理)

3 将相关的模块放入文件夹中

在程序中导入包的模块: import 包名.模块名

爬虫

14

第一个问题访问互联网

模块: urllib (rul library库)

urllib是一个包

urllib.request.rulopen()函数可以访问网页 (得到是2进制数据,转码就将得到的数据用decode方法,如 变量名.decode(“utf-8”))


requests库

安装直接pip install requests,

requests是个开源项目,可以直接在github上获取

使用时查取操作手册即可

BeautifulSoup4:网页解析器

安装直接pip install bs4

burpsuite的学习之路

发表于 2019-11-26 | 分类于 ctf学习之路

在学习ctf web的途中burpsuite是一款需要掌握的工具,此篇记录我的学习经历

下载

  burpsuite可以在官网中下载,有专业版和社区版,专业版是需要付费的,社区版虽然不需要付费但是有一些功能是被禁用的,所以可以选择在网上下载破解版,这类资源还是挺多的,也有介绍如何使用破解版的相关流程,所以我选择了破解版。

  需要注意的是,使用burpsuite需要java环境,所以还需先配置JDK,网上有些教程给的下载网站不知道为什么与官网的下载网站不一样,虽然也能配置java环境但是并不能打开jar程序,你能注意到你点开的网站和他给的截图不一样,这个时候就需要自己去jdk官网了,那样才能获得正常的页面(当然这并不是说他给的网站打开的不正常,只是不知道为什么下载的东西不完全)。但我也不知道为什么能下载的东西不一样,但是去官网点开才能和他教程给的符号,所以剩下的只需要按照教程走就行。

浏览器配置

  下载完后则需要对浏览器进行设置,让他经过本地代理从而我们能够使用burpsuite抓包,改包。我常用的浏览器是firefox和chrome并没有使用IE,所以我只需要对这两种浏览器进行设置。

firefox的设置

 进行代理服务器设置可以直接选择在网页设置中设置,点击右上角的设置,点击选项,滑到最下,点击网络设置,然后选择手动代理设置,将ip改为127.0.0.1,端口为8080就行;

 但不建议这么做,因为你如果没使用bp(burpsuite简称),你则又需要将设置改为系统代理,否则无法进行正常的网页浏览,所以我选择使用firefox的插件FoxyProxy,在firefox中按下Ctrl+Shift+A然后搜索FoxyProxy添加插件就行了,然后进入插件的Options功能中点击ADD进行如下配置

  接下来进行证书的配置,在打开代理功能的时候(一定要打开,否则无法进入),输入网址http://burp 进行访问,点击右上角的证书下载,然后进入firfox的设置-选项-隐私与安全-证书-查看证书-导入刚才下载的证书就行了;剩下的就是在你需要的时候打开就行了。

chrome

 与之前firefox一样,选择下载插件,这里就直接附上教程的传送门。与firefox只有一些小差别。

burpsuite的使用(遇到的一些问题)

  因为英语不够好,所以看官方文档比较吃力,中文教程又不够详细,所以学习使用真是一条漫长的道路,我选择一边谷歌搜索一边看b站上的教程,同时记录一下自己遇到的问题

无法拦截到response

  在按照网上的教程,设置了拦截response的选项后点击刷新页面发现已然无法拦截response,这个问题我搜了很久,但是网上没有相对应问题解答,然后非常吃力的看了下官方文档也没发现这类问题的介绍,所以我就自己尝试,在尝试的过程中发现了一个神奇的现象,就是在拦截request后将host乱改一下比如在后面乱加一些子文件,在网页报错后,从新刷新然后就能拦截到response,显示HTML码,这个问题困扰了很久,我就尝试了很多次,也不知道为什么会这样,尝试了很久以后,我怀疑是burpsuite破解版的问题,又在网上下了其他版本的破解版,甚至是官方的社区版,依然如此。一段时候后我怀疑是浏览器的问题,于是我用上了chrome(前面的尝试都是用的firefox),在进入我测试的那个网站后我欣喜的发现能拦截到response了,就在我断定是浏览器的问题时候我点击了刷新,发现又不能拦截了。但这同时也给了一个思考,为什么我在进这个网站的时候能拦截到,然后刷新的时候就不行了呢,我就想到了一个问题-缓存!对,就是缓存,于是乎我在浏览器中清除了缓存,点击刷新,binggo能拦截到response了,而且两个浏览器都可以,果然是缓存搞的怪,就这样艰难的解决了这个问题。

  总结一下:无法拦截到response可能是你在浏览这个网页时缓存了,所以你在刷新后,直接调用缓存而不需要服务器再次向你发送报文 (应该是这样的,目前http了解的内容较少,可能理解有误) ,所以你只需要删除一下缓存就行,火狐直接在历史里面就行,而且只需要勾选缓存就行了;chrome则按下Ctrl+Shift+Delete然后勾选其中的清楚缓存的图片和文件(其中的看个人意愿是否勾选全部,但如果需要刷新拦截response则需要勾选上诉提到的选项)。

12>

frosty

11 日志
8 分类
10 标签
© 2019 — 2021 frosty
|