PHP
PHP核心概念
表单传值
- 表单传值存在两种方式:
GET方式,可以通过GET方式请求的场景有:
form表单,method属性为GET<a>标签中的链接默认以GET方式请求location对象的herf属性和assign()方法。如<script>location.href=""</script>和<seript>location.assign("")</script> POST方式 form表单,method属性为POST POST与GET方式的区别
GET方式的请求主要用于获取数据,不改变服务器上的资源,一般只是用于取得内容POST方式的请求主要用于增加数据,即改变服务器上的资源- 传输方式上
POST必须使用表单,而GET方式可以使用URL和表单等 GET传输的数据可以在URL上对外可见,而POST不可见GET方式传输的数据长度有限制(2K),而POST方式理论上是没有限制的。实际上只是浏览器厂商对GET方式进行了限制,实际上都没有什么长度限制GET用于传输简单数据,如数值字符串等。而POST方式可以用于传输复杂数据,如二进制。 - php中接收数据的三种方式
$_GET,$_POST,$_REQUEST都可用于接收请求中的数据。表单元素的name属性为下标,表单元素的value值为数组元素值。$_REQUEST会将get方式和post方式的数据合并到一个数组中,如果这两种方式有同名表单name元素,那么post方式会覆盖get方式提交的数据。可以在php.ini配置文件中对覆盖性进行设置。 - php表单常见处理
- 单选处理
radio,使用同名name属性区分即可 - 复选框
checkbox,使用同名带[]的name属性区分即可。因为浏览器不会识别[],而php认为[]具有特殊含义,会自动将其认为是数组形式,并且会将同名的带有[]的元素合并成数组。 - 其他同名表单项处理参照
checkbox,如下拉菜单的option也可以采取同样的处理 - 文件上传
- 文件上传是指通过web表单方式,将文件上传保存到服务器指定目录下。具有文件上传的表单
form需要将enctype属性设置为multipart/form-data,如<form method="post" enctype="multipart/form-data"></form> $_FILE变量 在php中,$_FILE变量是专门用于存储用户上传的文件的变量,本质是一个关联数组。根据下标保存文件的相关信息。
name:文件在用户端的名字,实际上用于保存文件的后缀tmp_name:文件上传到php服务器后保存的临时路径type:文件的MIME类型,用于在计算机客户端识别文件类型error:文件上传的代号,用来告知php在文件接收过程中出现了什么问题。问题代号分为七种:
0:上传成功1:文件超过大小限制。具体限制在php.ini文件的upload_max_filesize中有限定2:超过HTML的MAX_FILE_SIZE的限制3:文件只有部分被上传(如网络不稳定等原因造成)4:没有文件被上传5:找不到对应的临时文件夹tmp_name6:文件写入失效 size:文件大小 - 多文件上传
针对同样内容的多文件上传,可以使用同名name加[]的方式来实现多文件上传
MYSQL扩展
php针对mysql数据库提供了扩展,允许php作为mysql的一个客户端连接服务器进行操作。需要注意的是,在php7后可以使用mysqli等系列函数
- 连接mysql
可以使用$link = mysql_connect(ip,username,password)来获得数据库连接,默认是对一个服务器只连接一次。当需要对一个资源进行多次连接时,可以使用mysql_connect(ip,username,pwd, TRUE )。获取到的 - 设置数据库连接编码
用于保持客户端和服务器之间的字符集一致。 mysql_query("set name utf-8" , $link);或者mysql_set_charset("utf-8"); - 选择数据库
mysql_query("user databaseA");或者mysql_select_db("databaseB"); - 关闭数据库连接
在php脚本执行结束后,数据库连接会自动释放。也可以进行手动释放。 mysql_close($link); - 增删改查操作
mysql_query(SQL语句); 在执行更新操作之后会返回true或者false,而执行查询操作后会返回结果集,结果集为资源类型,转换为布尔类型时始终为true - 对结果集进行操作
使用$res = mysql_query($sql);执行查询语句获取到结果集$res
- 获取结果集行数
mysql_num_rows($res);解析获取到结果集行数 - 解析结果集
表示将结果集资源转换成php能够直接解析的数据格式(数组形式)——通过结果集中的指针按照指针所指的位置,将该条记录取出返回为数组格式。同时指针下移,直到离开结果集。
mysql_fetch_assoc():该函数用于获取关联数组,字段名作为下标,字段值作为元素值。每次解析一行结果。msyql_fetch_row():获取到索引数组,数组下标从0开始自增。每次解析一行结果。mysql_fetch_array():获取到关联或者索引数组,可以通过第二个参数进行获取结果的设置,默认为MYSQL_BOTH,即同时获取关联和索引数组。参数还有MYSQL_ASSOC和MYSQL_NUM - 其他相关函数
mysql_num_fields():获取指定结果集中所有字段数mysql_field_name():获取一个指定结果集中指定位置的字段名mysql_error():获取对应出错的提示信息mysql_errno():获取对应出错的错误代号mysql_insert_id():获取到上次插入操作所产生的自增长id,如果没有自增长id则返回0
HTTP协议
-
HTTP协议特点
- C/S模式(Clinet/Server)
- Client请求Server时,只需要传送请求方式和路径即可,通信速度较快
- HTTP允许传输任意类型的数据对象(任意MIME类型)
- 无连接,指的是HTTP每个连接只处理一个请求,服务器在处理完客户请求并收到应答之后,即断开连接。HTTP方式可以节省连接时间
- 无状态,HTTP是无状态协议。指的是对事务没有记忆能力,意味着如果后续需要处理先前的信息时,必须进行重新传送。这样可能导致每次连接传送的数据量增大
-
HTTP协议分类
- 请求协议:Client=>Server
- 响应协议:Server=>Client
-
HTTP请求
- 请求行,独占一行。如
GET/index.php/1.1,表示请求方式,资源路径,http协议号 - 请求头,用于存放各项协议的内容,但是不会每次请求都会使用全部的协议内容
Host:表示请求的主机地址(必需)Accept:表示当前请求能接收返回的MIME类型Accept_Language:表示接受的语言User_Agent:表示客户端浏览器的一些信息 - 请求体,
POST请求会有请求体,用于存放一些请求参数。而GET请求的请求参数会跟随在URL之后,以键值对的形式在请求行的资源路径上体现 -
HTTP响应
- 响应行,独占一行。如
HTTP/1.1 200 ok,表示协议版本号,状态码和状态信息 - 响应头,存放着一些具体的协议内容,与响应体之间空出一行
- 响应提,存放Server实际响应给Client的内容
-
HTTP常用状态码 1XX:信息,表示服务器收到请求,需要请求者继续执行操作。如100,101 2XX:成功,表示请求被成功接收并处理,如200 ok 3XX:重定向,需要进一步的操作以完成请求 4XX:客户端出错,请求包含语法错误或者无法完成请求,如404 not found 5XX:服务器出错,服务器在处理请求的时候出现了错误,如502 bad gateway -
PHP中HTTP响应设置 php针对HTTP协议(响应)进行了底层设计,可以通过header()函数来修改HTTP响应,即修改响应头。
header()函数在设计HTTP响应前,不应该有任何的内容输出,这是因为一旦有内容输出,系统都会认为响应头结束,相应体开始,因此理论上设置header()无效。- 在php5之后,增加了程序缓存,可以在
php.ini中的output_buffering属性中设置开启关闭。允许php输出脚本时先在Server端进行暂存,因此可以在有内容之后再进行header()设置,系统会自动调整响应头和响应体,但会报错警告。因此不推荐在有内容之后才设置响应头,最好在脚本的最开始就设置响应头。 header()的内容设置:
Location:立即跳转,重定向,并不会解析响应体。header('Location:202020selection.php');Refresh:重定向,会定时跳转,会解析响应体。header('Refresh:3;url=303030selection.php');Content-type:用于设置内容类型(MIME)类型。header('Content-type:text/html;charsetutf-8');Content-disposition:MIME类型扩展,可以激活浏览器下载。header('Content-disposition:attachment;filename=a.jpg'); -
php模拟HTTP请求 php可以通过模拟HTTP协议发起HTTP请求。CURL是一个开源库,支持HTTP,FTP,TELNET等多种协议,并且支持HTTPS。
- 在
php.ini中开启CURL扩展:extension=php-curl.dll; - 使用curl模拟http请求
- 建立连接开启回话:
$ch = curl_init(); - 设置请求选项:如
curl_setOpt($ch , $CURLOPT_URL,'localhost/2020.php');。请求选项分为如下几类:
CURLOPT_URL:设置连接对象CURLOPT_RETURNTRANSFER:将服务器执行的结果响应以文件流的形式返回给请求界面(php脚本)CURLOPT_POST:表示是否采用POST方式发起请求,默认为GETCURLOPT_POSTFIELDS:用来传递POST提交的数据,分为两种形式——字符串形式name=abc&password=123和数组形式array('name'=>'abc'...)CURLOPT_HEADER:表示是否得到相应的header信息(即响应头),默认不获取 - 执行请求:
$content = curl_exec($ch);,其中$content表示获取到的响应信息 - 关闭连接:
curl_close($ch);
文件编程
文件编程指的是利用php代码对文件或者文件夹进行的增删改查等操作。在实际开发中会有很多内容(如上传的文件,配置文件等)具有不确定性,不能在一开始就手动创建,这样就需要用到php文件编程。
目录操作
mkdir(路径名):如果想要创建的路径已经存在,可以使用错误抑制符抑制报错rmdir(路径名):删除路径opendir(路径名):打开目录,返回一个路径资源对象,包含路径下的所有文件和目录。$res = opendir('uploads');readdir(资源变量):读取资源对象。从资源中读取指针所在位置,读取后指针下移直到移出资源:echo readdir($res);closedir(资源变量):关闭资源dirname(路径):用于获取该路径的上层路径readpath(路径):取得该路径的真实路径,如果该路径为文件那么得到的是falseis_dir(路径):判断指定路径是否为目录scandir(路径):封装版的opendir+readdir+closedir,获取一个指定路径下的所有文件信息,以数组形式返回。
echo '<pre>';
var_dump(scandir('uploads'));
文件操作
touch(文件路径名):创建一个新文件file_get_contents(文件路径):获取指定文件中的内容file_put_contents(文件名,内容):将指定内容写入文件,如果路径下不存在该文件会直接创建,如果不存在该路径则不会创建路径
php4中的文件操作,是将文件作为资源处理,无论是读或者写都是依赖资源指针
fopen(文件路径,打开方式):打开方式分为r/w/a/x,返回一个资源对象fread(资源,长度):从打开的资源中读取指定字节长度的内容fwrite(资源,内容):向打开的资源中写入指定的内容fclose(资源):关闭指定的资源
其他文件操作函数
is_file():判断是否是文件(不识别路径)filesize():获取文件大小file_exists():判断文件是否存在(识别路径)unlink():取消文件名与磁盘的连接(即删除文件)filemtime():返回文件最后一次修改的时间fseek():设定fopen打开文件的指针位置fgetc():一次获取一个字符fgets():一次获取一个字符串,默认为行file():读取文件,类似于file_get_contents,区别是按行读取,返回一个数组
文件下载 表示从服务器将文件通过HTTP协议传输到浏览器,浏览器不解析而是将其保存为相应的文件。
- 可以使用
<a href=""></a>来进行文件下载,但是这样会出现以下问题:
- a标签能够让浏览器自动下载的内容有限——只有在浏览器发现无法解析时才会启用自动下载
- a标签的href属性会使用文件资源的绝对路径,这样会暴露服务器存储数据的位置,会导致安全问题
- 还可以以文件流的形式将文件内容传递给浏览器,在响应头中告知浏览器不要解析,直接开启文件下载
<?php
header('Content-type:text/html;charset=utf-8');
header('Content-type:application/citem-stream');
header('Accept-ranges:bytes');
header('Content-disposition:attachment;filename='.$file);
header('Accept-length:'.filesize($file));
$file = 'a.txt';
$file = iconv('GBK','UTF-8',$file);
$res = fopen($file , 'r') or die();
while($row = fread($res , 1024)){
echo $row;
}
fclose($res);
会话技术
-
会话技术分类
- cookie:是指在HTTP协议下,服务器或者脚本可以维护客户工作站上信息的一种方式。Cookie是由Web服务器保存在用户浏览器上的小文本文件(HTTP协议响应头),可以包含有关用户的信息,无论何时用户链接到服务器,Web站点都可以访问Cookie
- Session:Session指的是一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统的时间。Session可以将用户信息保存到服务器端,Session技术是通过Cookie实现的。
-
会话技术区别
- 安全性:Session存储在服务器端,安全性高;Cookie存储在客户端,安全性低
- 数据大小:Cookie的数量(20个)和大小(4K)都有长度限制;Session数据存储不限。
- 可用数据类型:Cookie只能存储简单类型(数据和字符串);Session可以存储复杂数据(自动序列化)
- 保存位置:Cookie保存在客户端;Session保存在服务端
-
Cookie的使用 浏览器在首次请求服务器时,php可以通过setCookie()函数将数据通过响应头的形式将Cookie保存在浏览器。浏览器的后续请求都会携带Cookie,会自动保存在php的$_COOKIE中。
- 设置Cookie信息
setCookie(名,值),cookie名必须为字符串,cookie值可以为简单类型中的整数或者字符串,如setCookie(‘name’,'Mark'); - 读取Cookie信息
通过读取$_COOKIE数组来获取请求cookie中的数据,如var_dump($_COOKIE); -
Cookie高级应用
- Cookie生命周期
不设定生命周期,则默认会话结束(关闭浏览器)时Cookie失效。通过setCookie()函数的第三个参数可以设置时间戳,用于设置Cookie的生命周期,如setCookie('name' , 'mark' , time() + 7*24*60*60);
- 当时间戳设置为0时,为默认设置,即会话结束后关闭;
- 删除cookie只能通过设置生命周期来实现
- 清空cookie可以使用
setCookie('name','');实现 - 设置时间戳过期
setCookie('name','mark',time()); - Cookie的作用范围
不同的文件层级中,默认Cookie是在不同的文件夹下有访问限制。上层文件中设定的Cookie可以在下层(子文件夹)中访问,但是子文件夹中设定的Cookie不能在上层文件夹中访问。
- 默认范围,即不设定Cookie的访问范围
- 设定为1,即告知浏览器当前Cookie的作用域是网站根目录,如
setCookie('a','b',time()+24*60,'1'); - Cookie跨子域
在同一级别域名下,一级域名(如www.jarvis.com)可以有多个子域名,他们是搭建在不同的服务器上的,但是可以通过Cookie设置实现Cookie共享访问。但是默认是不允许跨域名访问Cookie的。
- 通过
setCookie()方法的第五个参数设定Cookie的有效域名,setCookie('name' , 'jarvis' , time() , '1' , 'www.jarvis.com'); - 当不设定有效域名时,默认为当前站点有效
- 设定跨子域的Cookie
在设定有效域名访问的时候,使用上级域名设定即可,如设定jarvis.com,所有以jarvis.com结尾的网站都可以共享该Cookie - Cookie数组数据
Cookie本身只能支持简单数据(数字或者字符串),能够保留的数据本身有限且不成体系,如果需要使用Cookie来保存一组数据,需要将其凑成数组(Cookie不支持数组),如setCookie('good_ids[0]' , '1000086');,setCookie('good_ids[1]' , '1000086');。读取时使用echo $_COOKIE['good_ids'][0];即可。 -
Session的使用
- Session的原理
Session与浏览器无关,但是和Cookie有关。Session是基于Cookie实现的。
- 当php遇到
session_start()时会开启session会话,会自动检测sessionID,如果在cookie中存在,则会使用现成的作为Session的id;如果Cookie中不存在,则会创建一个sessionID通过响应头以Cookie的形式保存在浏览器端。 - 初始化超全局变量
$_SESSION为一个空数组 - php会根据sessionID去指定位置(session文件的存储位置)去匹配对应的文件,不存在该文件时则会创建一个sessionID命名的文件;若存在该文件,则会读取文件内容,将数据存储到
$_SESSION中 - 脚本执行结束时,会将
$_SESSION中存储的所有数据序列化存储到sessionID对应的文件中。 - Session的基本使用
若启用session,则任何时候都要开启session,每在php脚本中使用$_SESSION时就会开启一次。而$_SESSION是通过session_start()函数定义的,没有直接定义,因此需要使用session_start()函数开启session后才能访问$_SESSION。 - 设置读取Session信息
如果需要存储信息到Session中,只需要向$_SESSION中添加数据即可,如$SESSION['hobby'] = array('baseball' , 'hocky');。需要获取Session中的数据时,直接从$_SESSION中读取即可,如echo $_SESSION - 删除一个Session信息
使用unset()函数即可,如unset($_SESSION('name')); - 删除全部的Session信息
使$_SESSION变为一个空数组即可完成删除,如$_SESSION = array(); -
Session的相关配置 基础配置(php.ini)中的配置
session.name = PHPSESSID,表示保存到Cookie中的sessionID对应的名字session.aotu_start = 0,表示是否自动开启session(默认关闭),即无需手动通过session_start()开启session.save_handler = file,表示session保存数据的方式,默认是文件方式session.save_path = /tmp,表示session文件的默认存储位置session.cookie_lifetime = 0,表示PHPSESSID在浏览器端对应Cookie的声明周期,默认是会话结束即失效session.cookie_domain,表示cookie可以允许访问的子域,默认的PHPSESSID只能当前主机访问 -
Session的销毁 Session的删除是指清空$_SESSION中的数据,使其无法访问,销毁指的是直接删除Session文件。
- Session销毁使用函数
session_destory(),会根据session_start()得到的sessionID将指定的session文件进行销毁。 -
Session垃圾回收机制 Session会话技术中,session文件并不会自动清除,这导致会有很多不同的session垃圾文件,影响效率。通过给session文件指定生命周期,以最后修改时间综合判定,这样就可以及时清理无效的僵尸文件。 任何一次Session开启,Session都会尝试读取session文件,读取后有可能触发垃圾回收机制(几率触发,类似于java的gc)。垃圾回收机制会自动读取所有session文件的最后编辑时间,结合生命周期作为是否回收的标准。 垃圾回收参数如下:
session.gc_maxlifetime = 1440,规定的session文件最大生命周期为24minsession.gc_probability = 1,垃圾回收概率因子session.gc_divisor = 1000,垃圾回收概率分母,即默认触发概率为1/1000
会话技术的本质是为了实现跨脚本共享数据,在一个脚本中定义会话数据,即可以在另一个脚本中访问到该数据。
|