PHP(二)服务器与客户端间的交互
参考
PHP 手册
陈惠贞 , 陈俊荣.PHP 7&MySQL跨设备网站开发[M].北京:清华大学出版社,2017
PHP 教程
PHP 教程
wiki_HTTP头字段
服务器与客户端间传递信息
1. HTTP头字段(HTTP Header)
1.1 定义
具体参考wiki_HTTP头字段
HTTP头字段(英语:HTTP header fields)是指在超文本传输协议(HTTP)的请求和响应消息中的消息头部分。它们定义了一个超文本传输协议事务中的操作参数。
1.2 HTTP头字段格式
针对http的,非php独有
协议头的字段是以明文的字符串格式传输,是以冒号分隔的键名与键值对,以回车(CR)加换行(LF)符号序列结尾。
更多见 请求字段 ,回应字段
常用回应字段Response
字段 | 功能 | 实例 | 备注 |
---|---|---|---|
Location | 进行重定向,自动跳转 可用来根据终端类型,跳转至PC或Mobile界面 |
Location: http://www.w3.org | |
Refresh | 隔n秒跳转到某网站 |
Refresh: 5; url=http://www.w3.org | |
WWW-Authenticate | 表明在请求获取这个实体时应当使用的认证模式 | WWW-Authenticate: Basic |
常用请求字段Request
字段 | 功能 | 实例 | 备注 |
---|---|---|---|
Content-Type | 请求体的 多媒体类型 (用于POST和PUT请求中) | Content-Type: application/x-www-form-urlencoded Content-Type:image/gif" |
1.3 PHP设置头字段
格式: header(HTTP头字段,TRUE/FALSE,HTTP回复代码)
- HTTP头字段:就是HTTP头字段格式,以字符串方式填入 具体格式在 1.2 HTTP头字段格式
- TRUE/FALSE:如果已存在相同类型的HTTP字段,是否取代,可以不填默认为TRUE取代,填FALSE不为取代
- HTTP回复代码:可不填,暂不清楚
1.4 应用
header("Location:http://www.jianshu.com");
//自动跳转到www.jianshu.com
header("Refresh:2;http://www.jianshu.com");
//2秒后跳转到www.jianshu.com
判断移动端设备,参考PHP判断手机端、PC端 、微信代码实例
2. 表单
表单语法是html语法,在PHP标记之外使用
html表单传送数据
PHP等动态网页技术处理html表单传来的数据
例
<?php
echo "你是?";
?>
<!--表单是html语法,使用html方式书写-->
<!--后面是html语法,没有php语法错误-->
<form action="welcome.php" method="post">
Name <input type="text" name="youName">
<br>
<input type="submit" value="提交">
</form>
2.1 表单的格式
<form 表单属性>
各种表单元素input/select/textarea
</form>
2.2 表单属性
- accept="..." 表单处理数据的类型,例accept="image/gif,image/jpeg"
- accept-charset="..." 表单数据的编码方式,例accept-charset="ISO-8859-1"
- action="url" 接受表单传送的数据和处理的程序,url为程序的相对或绝对地址
- method="get/post" 数据的传输方式,get或post,后面2.4 GET & POST讲
- name="..." 表单的名称
其他
2.3 表单元素
2.4 GET & POST
用户点完提交(submit元素),表单使用method(get或post)方式把数据传给action后的程序处理
get
在 PHP 中,预定义的 $_GET 变量用于收集来自 method="get" 的表单中的值
$_GET为数组,数组的key为表单元素name,数组的value为表单元素的value
例
收集表单程序
sub.php
<form name="input" action="m_get.php" method="get">
<!--传输方法为get,处理程序为m_get.php-->
<!--文本域-->
Name <input type="text" name="Name"><br>
<!--密码-->
Password <input type="password" name="Password"><br>
<!--单选-->
性别<br>
<input type="radio" name="sex" value="male">Male <br>
<input type="radio" name="sex" value="femal">Femal <br>
<!--复选-->
操作系统<br>
<input type="checkbox" name="OS" value="IOS">IOS<br>
<input type="checkbox" name="OS" value="Android">Android<br>
<!--下拉列表-->
手机<br>
<select name="phone">
<option value="apple">Apple</option>
<option value="xiaomi">Xiaomi</option>
<option value="piexl" selected>Piexl</option>
</select>
</br>
<!--提交-->
<input type="submit" value="提交"><br>
</form>
处理程序为
m_get.php
<?php
// method="get"
foreach ($_GET as $key => $value)
{
echo "$key:$value<br>";
}
?>
点完提交后,自动打开下述链接
http://127.0.0.1/m_get.php?Name=root&Password=mypasswd&sex=male&OS=IOS&phone=piexl
可以看到,链接中包含表单元素的name=值
网页运行如图
注:
在 HTML 表单中使用 method="get" 时,所有的变量名和值都会显示在 URL 中,所以在发送密码或其他敏感信息时,不应该使用这个方法!
HTTP GET 方法不适合大型的变量值。它的值是不能超过 2000 个字符的。
post
与get语法类似,只不过PHP接受数据存储在$_POST 变量
讲get中sub程序更改为method="post",处理程序m_get.php中的$_GET替换为$_POST运行效果不变,不过提交后打开的代码为
http://127.0.0.1/m_get.php
注
从带有 POST 方法的表单发送的信息,对任何人都是不可见的(不会显示在浏览器的地址栏),并且对发送信息的量也没有限制。
然而,默认情况下,POST 方法的发送信息的量最大值为 8 MB(可通过设置 php.ini 文件中的 post_max_size 进行更改)。
$_REQUES
预定义的 $_REQUEST 变量包含了 $_GET、$_POST 和 $_COOKIE 的内容。
$_REQUEST 变量可用来收集通过 GET 和 POST 方法发送的表单数据。
由method是post还是get决定url中显示还是不显示传输的数据,method都可以接收
3. Cookie
网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密)。
参考
wiki_Cookie
HTTP cookies 详解
3.1 cookie格式
一个网站可在客户端上存多个cookie,例如chrome可在地址连前面右键Cookie查看存储的Cookie
每个cookie都有以下属性
- name
- value
- 编码
- 生存周期
- 所属域名
- 在客户端的存放目录
- 安全选项
3.2 PHP写入cookie
setcookie(name,value,生命周期,路径,所属域名,安全选项)
setrawcookie(name,value,生命周期,路径,所属域名,安全选项)
- name 字符串,cookie名字,可以写入多个name不同的cookie
- value 字符串,可选填,多次写入cookie时,后面的value会覆盖前面的value,把value设为
""
,则删除cookie - 生存周期 整数,秒,例
time()+60*60*24
表示,从现在起一天,
若不设置则cookie保存在用户硬盘中,浏览器终止时cookie消失 - 路径 字符串目录,cookie在客户端的存放目录,不填默认
"/"
- 所属域名 字符串,可选填,当web服务器同时有两个域名,为了不让其中一个域名去读取另一个域名的cookie时设置
- 安全选项 TRUE表示使用安全连接(SSL,HTTPS)传送cookie,默认不填为FALSE
例
<?php
header("Content-type:text/html;charset=utf-8");
//指定网页编码为UTF-8
setcookie("UserName","简书",time()+60);
?>
查看添加的cooki
可以看到使用setcookie的value
简书
被编码了,可通过URL解码查看具体内容,如url解码,如果不想编码存储,则使用setrawcookie
写入cookie必须在任何输出语句之前
可通过放入缓存区解决,例
hearder()语句
ob_start();//把输出放入缓存区
输出语句;
setcookie语句;
ob_end_flush();//取出缓存区输出
若浏览器不支持cookie,则cookie派不上用场,但PHP语句执行成功
本地cookie可以修改
参见各种浏览器(IE,Firefox,Chrome,Opera)COOKIE修改方法,玩法丰富
3.3 PHP读取cookie
$_COOKIE为PHP内置超全局数组,直接调用,key为cookie的name,value为cookie的value
cookie的name可为数组,$_COOKIE["数组名"]则也为数组
3.4 PHP删除cookie
使用cookie创建函数,把value设为空""
4. Session/会话
Session可以理解为服务器端的cookie
由于 HTTP 地址无法保持状态,Web 服务器并不知道你是谁以及你做了什么。PHP session 解决了这个问题,它通过在服务器上存储用户信息以便随后使用(比如用户名称、购买商品等)。然而,会话信息是临时的,在用户离开网站后将被删除。如果需要永久存储信息,可以把数据存储在数据库中。
官方解释Sessions
4.1 启动Session/会话
session_start();
4.2 使用Session
$_SESSION
超全局数组,初始是空的,可以添加key和value
Session预设的生命周期为浏览器开始执行至浏览器结束,只要浏览器不关闭,$_SESSION里记录的key和value就会被保存,即使浏览器暂时关闭这个网页又打开,里面的值不会消失
Session相关函数
具体见Session 函数
4.3 销毁Session
unset($_SESSION['key']);//消除某个属性
session_destroy();//清空所有session
文件管理和输出
说明
- 以下的目录为字符串,如直接用双引号"书写记得进行转义,例
"C:\\hello\\hi"
字符串变量(路径变量)直接写不加引号 - 绝对目录相对目录和Linux里一样
1. 文件操作
函数 | 格式 | 格式说明 | 功能 |
---|---|---|---|
basename | basename(目录,排除的字符串) |
无论文件是否存在,仅对目录这一字符串进行操作 所以,不支持相对目录 最后一段字符为文件还是文件夹都可以 排除的字符串意为去掉文名中某些字符串显示,不过只有和输出的字符串最后几个字符相同时才会略去最后几个字符的输出,否则无效,可选 |
处理目录提取文件名 |
pathinfo | pathinfo(目录) | 无论文件是否存在,仅对目录这一字符串进行操作 | 返回值为数组,dirname => 路径名称,basename=>文件名(含拓展名),extention => 拓展名(不含小数点) |
dirname | dirname(目录) | 无论文件是否存在,仅对目录这一字符串进行操作 | 返回文件夹的父类文件名称 |
realpath | realpath(目录) | 必须存在,目录为文件或文件夹的绝对或相对目录 | 返回文件的绝对目录 |
mkdir | mkdir(目录,权限,TRUE/FALSE) | 目录为创建文件夹的目录 权限0开头为linux下文件权限,可不填默认0777,windows下无效,若不想设置则设为NULL TRUE/FALSE,默认不填为FALSE,当目录不存在时,创建失败返回FALSE,设为TRUE则一并创建不存在的文件夹 |
创建文件夹,成功返回iTRUE失败返回FALSE |
getcwd | getcwd() | 类似linux的pwd | 返回当前工作文件夹目录 |
chdir | chdir(目录) | 类似linux的cd | 切换工作文件夹 |
rmdir | rmdir(目录) | 类似linux的rm,目录为文件夹路径,不是文件 | 删除文件夹 |
unlink | unlink(目录) | 目录为文件 | 删除文件,成功返回TRUE,失败返回FALSE |
is_dir | is_dir(目录) | 目录为文件夹路径 | 判断是否为文件夹 |
is_file | is_file(目录) | 目录为文件目录 | 判断是否为文件 |
file_exists | file_exists(目录) | 目录为'文件夹/文件'路径 | 判断文件夹/文件是否存在 |
chmod | chmod(目录,权限) | 类linux下chmod,权限0开头 | 更改文件/文件夹权限 |
scandir | scandir(目录,排序方式) | 排序方式可不填,默认为0升序,1为降序 | 返回数组,value为文件夹下文件的名称包括当前文件夹..与父类. |
copy | copy(源目录,目标目录) | 目录为文件目录 | 复制文件,存在则覆盖 |
rename | rename(老文件名,新文件名) | 目录为文件/文件夹目录 | 重命名文件/文件夹 |
fileatime | fileatime(目录) | 获取文件/文件夹 最后的返回时间,返回unix时间戳 | |
filectime | filectime(目录) | 获取文件/文件夹 创建时间,返回unix时间戳 | |
filemtime | filemtime(目录) | 获取文件/文件夹 修改时间,返回unix时间戳 | |
filesize | filesize(目录) | 获取文件大小,单位为字节 | |
is_readable | is_readable(目录) | 文件存在且可读,返回TRUE,否则FALSE | |
is_writable | is_writable(目录) | 文件存在且可写,返回TRUE,否则FALSE |
例
<?php
$path=$_SERVER['PHP_SELF'];
echo basename("D:\\gg\\dell.sr","ll.sr")."<br>";
echo dirname("D:\\gg\\dell.sr")."<br>";
foreach (pathinfo("C:\\hello\\hi") as $key => $value)
echo $key." ".$value."<br>";
//事实上D:\\gg\\dell.sr与C:\\hello\\hi并不存在
echo realpath(getcwd())."<br>";
echo realpath(".")."<br>";//.相对目录,当前目录
mkdir(new_dir,0777);
echo "存在new_dir输出1,".file_exists(new_dir)."<br>";
chdir(new_dir);
echo "新工作目录".realpath(getcwd())."<br>";
chdir("..");//..为绝对目录代表父文件夹,类似linux
rmdir(new_dir);
echo "不存在new_dir,不输出".file_exists(new_dir)."<br>";
echo "<br>当前目录下有:<br>";
foreach (scandir(".") as $value)
echo $value."<br>";
echo "文件列表到此结束:<br>";
?>
输出为
2.文本文件
流程:打开文件->读取/修改文件->关闭文件
2.1 打开文件fopen()
fopen(目录,打开方式)
- 返回值为资源/指针(指向文件开头)
- 与C语言指针不同,指针和资源一一绑定,把指针的值赋给另一个变量,就是把资源赋给他,对资源的读取倒至指针位置的变化,则所有与改资源有关的指针指向全部变化
- 打开方式为字符串,例"r",更多如下表
擦写代表只写入指针所在处的位置,写代表指针所在处及以后都被替换
2.2 读取写入
必须先打开才能读取
fread读取并把指针向后移动读取长度
fread(资源/指针,读取长度)
- 资源指针为fopen()的返回值
- 读取长度为整数,例总长度
filesize(目录)
fget读取一行,并移动指针一行长度
fget(资源/指针)
fwrite与fputs写入用法完全一样,写入并移动指针
fwrite(资源/指针,写入的字符串,写入长度)
写入长度可不写
2.3 关闭
fclose(资源/指针)
2.4 其他函数
nl2br把文件中的换行\n,\r,\r\n转化为html的
feof(资源/指针),指针指向文件尾时返回TRUE,!feof(资源/指针)可在循环中用于判断
file_get_contents(目录)
无需打开关闭,直接读取
返回值为文件内容的字符串
file_put_contents(目录,字符串)
无须打开关闭,直接清除内容从前端写入,不存在则新建写入
返回值为写入的字节数
例
du.php
<?php
$file=fopen("file.txt","r");
$old_file=$file;
// 直接写file.txt,点会被视为字符串连接符,变成filetxt
echo fread($file,filesize("file.txt"));
echo fread($old_file,filesize("file.txt"));
// $old_file也指向资源file.txt,指针已指向末尾,无法输出
fclose($old_file);
echo "<br>"."<br>";
$file=fopen("file.txt","w");
fputs($file,"写入");
fputs($file,"\n继续写\n");
fclose($file);
$file=fopen("file.txt","a");
fputs($file,"最后写入");
fclose($file);
echo "<br>";
$file=fopen("file.txt","r");
while(!feof($file))
{
echo nl2br(fread($file,filesize("file.txt")))."<br>";
}
echo var_dump(fclose($file))."<br>";
echo "共写入".file_put_contents("file.txt","几个字节")."字节<br>";
echo "最终file.txt内容为: ".nl2br(file_get_contents("file.txt"))."<br>";
?>
file.txt
123456
qwerty
asdfgh
zxcvbn
!@#$%^
<>?{}+
运行du.php
123456 qwerty asdfgh zxcvbn !@#$%^ <>?{}+
写入
继续写
最后写入
bool(true)
共写入12字节
最终file.txt内容为: 几个字节
3. 图像文件
流程:创建图像->输出图像->释放内存
GD绘图(略),图像处理(略),图像输出
3.1 图像输出
读取外部函数
imagecreatefromgif(目录)
imagecreatefromjpeg(目录)
imagecreatefrompng(目录)
返回值为图像资源
输出图像
- http header(HTTP标头)确定传输类型
header("content-type:image/gif");
- 输出函数
imagegif(图像资源,目录)
imagejpeg(图像资源,目录)
imagepng(图像资源,目录)
若需要保存再服务器端则在目录里填写存储的位置和文件名,可以不填,默认不保存在服务器端
释放内存
imagedestory(图像资源)