php发展史和一些其他知识

PHP发展史(了解)
php的原始含义:Personal Home Page!个人网页

最开始是由加拿大的一哥们自己开发了一个脚本,用户记录有多少人访问他的在线简历!很受欢迎!于是他就开始开发自己的工具集!

php现在含义:Hypertext Preprocessor 超文本预处理语言!

说明php是在服务器上预先处理好的,将结果返回给浏览器!

PHP的功能与特点
l php主要是用来做web服务器开发,用户实现用户的各种请求,也可以用来软件开发(不常见)

l php是开源软件,能够在所有的操作系统上稳定运行!

l php入门比较简单,语法类似于c语言!能够实现面向过程和面向对象并用!

l php运行效率高,消耗系统的资源比较少

l php支持多种主流的数据库,mssql、Oracle、mysql、sybase、DB2,但是和Mysql是“黄金搭档”

Mvc的思想:
所谓的mvc思想,就是在显示与逻辑相分离的基础之上,再把逻辑中所有数据处理模块提取出来,在需要的功能上进行调度即可!

M:Model,模型,项目中的数据处理单元

V:View,视图,项目中用于展示数据的单元(模板)

C:controller,控制器,项目中负责某个功能整体流程调度的单元!

此时,浏览器只需要和C控制器进行交互,而模型M和模型V都被控制器所调用!并且模型M和视图V之间不存在任何的交互!

项目流程简介
需求分析
了解客户的真实需求是什么?

另外,还往往要进行一次可信性分析!

设计
怎么去做,具体的算法是什么!

编码实现
敲代码,一般有两个方向:

二次开发
是指在一个成熟的产品之上,完成自己特定项目的业务逻辑,比如:

论坛:discuz,phpwind

cms:内容管理系统,dedecms(织梦),帝国,新云(asp)

社交:ThinkSNS,Ucenter Home

电商:ecshop,ecmall,shopex

二次开发的特点:前期投入的成本非常的低,如果是商业目的,需要购买授权!

基于框架的开发
什么是框架?

只规范了结构和基础的功能(各个项目共同的功能),比如:文件管理,数据库的操作等!

但是没有实现任何常规的业务逻辑!

比如:ZendFramework ThinkPHP YII CI等

框架开发的特点:业务逻辑是从0开始,但是基础代码功能并不是从0开始,而是从框架开始,省掉了做底层代码开发的时间!

最后有一个代码的优化!

测试
目的是尽可能的发现已知的错误或者漏洞

发布
开始运营

维护升级

数据库的概念
简单来说,数据库就是存储数据的仓库,我们现在的笔记就是一个数据库!

但是,光有数据库还不行,当数据越来越多的时候,我们还需要对数据库进行管理,我们称之为数据库管理系统!

数据库系统 = 数据库 + 数据库管理系统 + 数据库管理员

DataBase System(DBS) = DataBase(DB) + DataBase Management System(DBMS) + DataBase Administrator(DBA)

数据库:对大量信息进行管理的有效解决方案,安装数据结构来组织、存储和管理数据的库!

通常一个web项目(网站)会使用一个数据库来存储其所有的动态数据!

SQL
是一种关系型数据库操作语言,也是一种数据库编程语言!

SQL:Structure Query Language!结构化查询语言!

根据对数据库不同的操作对象(或操作层次),SQL又可以分成不同的操作语言:

所以,数据库的第一种操作语言就是DDL

DDL:Data Definition Language,数据定义语言

主要是用来定义和维护数据库的各种对象(比如,库,表等),也可以说操作的层次是在数据库和表的逻辑结构和存在结构上面,并没有对表中的实际数据进行任何的操作!

DDL主要的操作关键字:create,drop,alter等

DML:Data Manipulation Language,数据操作语言

主要就是对表中的记录进行增删改查操作!

注意:其中“查询”部分,又叫作DQL:Data Query Language,数据查询语言!select

DCL:Data Control Language,数据控制语言

主要是对数据库进行统一的管理和统一的控制,比如并发控制,存取控制,安全控制等,具体的有数据库的权限管理,数据的备份与恢复等!

数据库操作
创建数据库
语法形式:

create database 数据库名[数据库选项];

其中,数据库选项主要有两个:一个是字符集,一个是校对规则(以后学)

注意:sql语句需要语句结束符分号;来结束!

创建数据库名的命名规则
1, 数据库名是否区分大小写取决于当前的操作系统!(windows下不区分,linux下面就区分),我们的原则是,就认为区分大小写!而且数据库名要见名知意!推荐使用下划线方式!

2, 原则上,数据库名可以使用任意的字符,甚至是中文,但是一些特殊的符号,比如:纯数字、特殊符号、mysql内部的关键字、中文等;这些特殊的符号应该使用标识符限定符反引号来包裹,反引号就是键盘上左上角,波浪线

删除数据库
语法形式是:

drop database 数据库名;

注意:删除数据库一定要慎重,因为整个数据库文件夹都会被删除,其中包括里面所有的数据表,而且过程一般不可逆!

修改数据库
注意:数据库的名字不可修改!只能修改数据库的库选项信息!

语法如下:

alter database 数据库名[库选项]

查看数据库
查看当前有哪些数据库:

语法是:

show databases;

查看数据库的创建语句:

语法是:

show create database 数据库名;

思考:如果现在就需要修改数据的名字,应该怎么办?

有两种方法:

1, 直接修改目录下原数据库的文件夹名,但是要谨慎,因为有的时候不是所有的数据库下的表都放在同一个地方!

把当前的数据先导出,创建一个新的数据库,把以前的数据导入进来,再删除以前的数据库!

数据表操作
每一个数据表都属于一个具体的数据库,所以,在操作表之前,应该选择默认的数据库!

use 库名

创建数据表
创建表的语法:

create table 表名(字段名1 字段1类型[,字段名2 字段2类型……])[表选项]

需要注意的是:

1, 每个字段都必须规定数据类型,字段名和字段数据类型之间以空格分隔;

2, 字段与字段之间用逗号分隔,但最后一个字段不能有逗号,

3, 表选择其实就是规定表的字符集和存储引擎(暂时用默认,后面讲)

4, 表名的命名规则和库名基本是一样的,也就是说,如果有特殊字符做表名,一样要用反引号包裹起来!

查看数据表
语法是:

show tables;

查看表的创建语句:

show create table 表名;

当数据比较多的时候,可以使用\G来代替语句结束符;看起来更加有条理性

另外,还可以查看表的结构:

也就是表的字段的类型、属性

语法是:

describe 表名; 或

desc 表名;

删除数据表
语法是:

drop table 表名;

drop table if exists 表名

加上if exists之后,即使删除一个不存在的表,既不执行也不会报错!

修改数据表
修改表名
语法如下:

rename table 旧表名 to 新表名;

注意:可以为多个表进行重命名,中间以逗号隔开!

修改列定义
又可以分成很多种操作,常见的有:增加字段,删除字段,重命名字段,修改字段数据类型!

关键字:

增加:add

删除:drop

重命名:change

修改:modify

上面的四个关键字都是子命令,还有一个上级的命令的关键字是:alter

基本的语法形式就是:

alter table 表名……

数据操作
插入数据
语法:

insert into 表名(字段列表) values (值列表);

注意:

1, 字段列表可以是该表的全部字段,也可以是部分字段(也就是只插入了部分数据,其他的默认为null,表示什么都没有)

2, 字段列表和值列表应该是一一对应的!

3, 当为全部字段插入数据的时候,字段列表可以省略!但是,插入数据的顺序必须与表中字段的顺序保持一致!为了避免出错,强烈建议写上!

4, 可以一次插入多条记录,中间以逗号隔开!

查询数据
语法:

select */字段列表 from 表名[查询条件];

注意:查询条件是用where关键字,如果省略查询条件,相当于查询所有的数据,也就是相当于where 1

删除数据
语法:

delete from 表名[删除条件];

注意:

在实际的应用中,删除条件往往是必须的,如果没有删除条件,相当于删除了整个数据表的全部数据!这个过程一般也是不可逆!

修改数据

update 表名 set 字段1=新值1,字段2=新值2,……[修改条件]

外键
删除外键的语法:

alter table 表名 drop foreign key 外键名;

增加外键的语法:

alter table 表名 add foreign key 外键定义;

外键定义的完整语法:

Foreign Key (外键字段) references 主表名 (关联字段) [主表记录删除时的动作] [主表记录更新时的动作]

其他数据操作
数据的操作也叫作crud

C:create

R:read

U:update

D:delete

插入数据
标准语法:

insert into 表名[字段列表] values (值列表)

蠕虫复制
思考:如何以最快的速度向数据表中插入200万条数据?

含义:就是在已有的数据的基础之上,将原来的数据进行复制,插入到对应的表中!

语法规则:

insert into 表名 select *|字段列表 from 表名;

蠕虫的作用:

1, 可以快速的将一个表的数据全部复制到另一个表中!

2, 短期内为表产生大量的数据,为了测试数据库的压力以及效率!

主键重复
方案1:如果主键冲突,就直接更新!

使用如下的语法:

insert into 表名[字段列表] values (值列表) on duplicate key update 字段1=值1,字段2=值2……;

作用:即使主键已经存在,也要插入成功!

方案二:如果主键冲突,直接删除原纪录再插入!

语法是:

replace into 表名[字段列表] values (值列表)

作用:先判断有没有冲突,如果没有冲突就直接插入(新增),如果有冲突,就删除原纪录再次插入(更新)!

修改数据
标准语法:

update 表名 set 字段1=值1,字段2=值2……where 条件;

修改数据还可以加上limit子句:

update 表名 set 字段1=值1,字段2=值2……where 条件 limit数据量;

意思就是只更新前多少多少条符合条件的记录!

删除数据
基本语法:

delete from 表名 where 删除条件

加上limit子句:

delete from 表名 where 删除条件 limit 数据量;

但是,用delete语句不会重置自增长!

还有一个删除数据表数据的语法:

truncate 表名;

truncate的作用:

相当于先把该表给drop掉,再按以前的表结构重新create一次!

查询数据
查询数据是业务逻辑中使用的最多的也是最复杂的!

关于查询数据,其实才刚刚开始!

以前的语法:

select *|字段列表 from 表名 where 查询条件;

比较完整的比较:

select [select选项] */字段列表[as 字段别名] from 数据源 [where 子句][group by子句][having 子句][order by子句][limit 子句];

注意:

1, from后面的子句往往称为:五子句,也叫作查询五子句,也叫作五子查询

2, 五子查询的选项可以都没有,但是,如果有的话,就必须按照上面顺序写!

select选项
是指系统在查询出数据后,要不要去除重复的记录!有两个选项:

all:也是默认值,保留所有的查询结果!

distinct:去重,去掉重复的记录,这里的重复是指所有的字段都相同,完全一样!

所以,在实际的运用中,这个选项基本不用,因为几乎所有的表都有一个主键!

别名
所谓的别名,就是给字段或其他表达式等标识符起一个名字!基本语法是:

字段|表达式|表名|子查询结果 [as] 别名

这里的as可以省略,但是为了增加可读性,强烈建议写上!

为什么要有别名?

第一, 如果出现多表查询的时候,往往不同的表会有相同的字段名,如果要使用同名的字段,就必须给其中的一个或者两个起上别名,否则不好区分!

第二, 通常都要给一个表达式起一个别名,代表该表达式的含义!

虚拟表
查询语句比较完整的比较:

select [select选项] */字段列表[as 字段别名] from 数据源 [where 子句][group by子句][having 子句][order by子句][limit 子句];

group by子句
也称之为分组统计查询语句!

语法
group by 字段1[字段2……]

order by子句
根据某个字段进行排序,有升序和降序之分!

语法
order by 字段1 [asc|desc ]

默认为asc,也就是升序!可以省略!

当然,排序的规则要按照校对集

多字段排序

order by 字段1 [asc|desc ], 字段2 [asc|desc ]……

limit子句
limit就是限制的意思,所以,limit子句的作用就是限制查询记录的条数!

语法
limit offset,length

在项目中,如果要用到分页效果,就应该使用limit子句!

limit ($pageNum-1)* $rowPerPage,$rowPerPage

表单传值
web表单主要用来在网页中发送数据到服务器,比如:用户注册,用户登录等

表单传值有两种:get和post

submit不算是表单内容的一部分,可以理解为form的一部分!

有两件事情需要注意:

1, 无论是单选框还是复选框,除了要有name属性,还要有value值

2, 复选框中name属性,一定要加上中括号[],否则,只保留最后一个被选中的值,因为前面的全部被覆盖了!

http协议
http:HyperText Transfer Protocol 超文本传输协议!

http协议的特点
一般的协议只支持b/s模型!

1, http协议也支持c/s模型

2, 灵活,可以利用http协议传递任意类型的数据

3, 无连接请求:每次连接只能处理一个请求,浏览器向服务器发起一次请求后,只能从服务器那里得到一次响应!

4, 无状态:也叫作无记忆功能,意思是同一个浏览器向同一个服务器发起多次请求的时候,服务器不能识别该浏览器!

http协议分成了两个部分:

http请求:浏览器向服务器索要数据

http响应:服务器向浏览器反馈数据

不管是请求还是响应,其实http协议都是由一个一个的简单协议项组成的(也就是事先的一种约定)

形式如下:

协议名:协议内容(协议值)

每一个协议项都独占一行!

http请求
http请求包含了四个部分:

请求行

请求头

空行

请求数据

请求行
单独的占用一行,分为三个部分:

请求方式 请求路径 协议版本 三个部分之间用空格隔开,比如:

GET /index.index HTTP/1.1 协议的版本是1.1 以前是1.0

请求头
请求头就是所有当前需要用到的协议项的集合,每个协议项都要独占一行,比如:

host:www.itcast.cn

常见的协议项有:

host:当前url中所要请求的服务器的主机名(域名)

accept-encoding:是浏览器发给服务器,声明浏览器支持的压缩类型 比如gzip

accept_charset:表示,浏览器支持的字符集

referer:表示,此次请求来自哪个网址

accept-language:可以接收的语言类型,cn,en等

cookie:如果之前当前请求的服务器在浏览器端设置了数据(cookie),那么当前浏览器再次请求该服务器的时候,就会把对应的数据带过去

user-agent:用户代理,当前发起请求的浏览器的内核信息

accept:表示浏览器可以接收的数据类型,text/html,image/img

content-length(post):只有post提交的时候才会有的请求头,显示的是当前要提交的数据的长度(字节)

if-modified-since(get):表示,在客户端向服务器请求某个资源文件时,询问此资源文件是否被修改过

content-type(post):用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件

空行
用来分离请求头和请求数据,请求头到此结束

请求数据
只有post提交的时候才会有请求数据

查看http协议
httpwatch:专业查看整个http请求和响应的过程

firefox下面的插件:firebug

http响应
也分成了四个部分:

状态行(响应行)

响应头

空行

响应主体

状态行
独占一行 分成三个部分: 协议版本 状态码 状态描述,比如:

HTTP/1.1 200 OK

响应头
也是名:值形式,常见的有:

server:服务器主机信息

date:响应时间

last-modified:文件最后修改时间(对应请求中:if-modified-since)

content-length:响应主体的长度(字节)

content-type:响应内容的数据类型:text/html,image/png等

location:重定向,浏览器遇到这个选项,就立马跳转(不会解析后面的内容)

refresh:重定向(刷新),浏览器遇到这个选项就会准备跳转,刷新一般有时间限制,时间到了才跳转,浏览器会继续向下解析

content-encodeing:文件编码格式

cache-control:缓存控制,no-cached不要缓存

空行
用来分隔响应头和响应主体

响应主体
html代码(内容)

状态码
1XX:代表http请求尚未成功

2XX:请求没有问题,同时服务器响应也没有问题

3XX:重定向,服务器要求浏览器重新发起请求

4XX:请求错误,服务器不能正常响应(一般会做一个404的友好页面!给出友好的提示!)

5XX:服务器错误,不能正常响应!

php模拟http响应
php模拟响应,其实就是通过header函数修改http协议,常见的有跳转,刷新和下载

跳转
意思就是浏览器请求到当前的文件之后,直接跳转到其他的位置

对应的http协议项:Location,具体的语法形式是:

header(‘location:新的url或uri’);

其中,如果是路径uri,浏览器会自动在前面绑定之前的域名,比如:

原来的域名是www.php17.com/model/show.php uri是:/model/register.php 相当于跳转到了:www.php17.com/model/register.php

也就是站内跳转

一旦遇到location就立即跳转!后面的代码不执行了!

刷新
刷新的本质还是跳转,不过刷新是告诉浏览器在多长时间之后进行刷新,可以刷新自己,也可以去请求其他的脚本,具体的语法是:

header(‘refresh:刷新等待的时间;url=刷新要请求的目标脚本或其他网址’);

注意:在刷新等待的时候,后面的代码会继续执行!

下载
下载可以通过a标签实现!

注意:使用a标签下载文件,只能下载那些浏览器无法解析的文件!

1, 告诉浏览器不要解析

content-type:application/octet-stream

2,指导浏览器如何保存文件

content-disposition:attachment;filename

字符串函数
strlen
获取字符串的长度,这里的长度指的是字节的长度!

substr
sub在这里是截取的意思

substr就是字符串截取函数,应该有三个参数

从指定字符串的指定起始位置开始,截取指定长度的字符串!

三个指定,应该有三个参数!

注意:字符串的起始位置是0!

如果不指定第三个参数,默认就是截取到最后!

strtolower
把字符串全部小写

strtoupper
将字符串全部大写

ucfirst
首字母大写

lcfirst
首字母小写

strrev
rev是reverse的意思,也就是反转

该函数的功能就是把字符串反转

strpos
pos是position的意思,也就是位置

所以,该函数的功能是查找并返回指定字符串中指定字符的起始位置!

所以,应该有两个参数!

strrpos
多出了一个r是reverse的意思,函数的功能从右往左查找并返回指定字符串的指定字符的起始位置!

注意:起始编号还是从左往右从0开始!

strchr
也是字符串截取函数,截取指定位置开始以后的全部字符串!

还有一个别名strstr

strrchr
也是字符串截取函数,截取从右往左指定位置开始以后的全部字符串!

trim
去除字符串的左右的空格!

数学函数
abs
取绝对值

floor
向下取整

ceil
向上取整,得到一个比当前数值大的最小整数

round
四舍五入,有两个参数,第一个是数值本身,第二个精确的小数的位数,如果不写第二个参数,默认的是0,也就是得到了一个整数

rand和mt_rand
都是获得一个指定区间的随机整数,只是mt_rand的效率更高!

注意是闭区间!


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至 chaofa_vip@126.com

文章标题:php发展史和一些其他知识

文章字数:5.7k

本文作者:Hechaofa

发布时间:2016-03-01, 10:13:47

最后更新:2020-09-30, 15:34:47

原始链接:https://chaofavip.github.io/2016/03/01/php/study/develop/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏