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_name 6 :文件写入失效 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
会话技术的本质是为了实现跨脚本共享数据,在一个脚本中定义会话数据,即可以在另一个脚本中访问到该数据。
|