20170822PHP学习(二)服务器与客户端间的交互

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 表单元素

参见20170809html学习

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(图像资源)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容

  • 一、会话控制(session与cookie) 1.cookie简介 Cookie是存储在客户端浏览器中的数据,我们...
    空谷悠阅读 619评论 0 5
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,214评论 11 349
  • 01 端午节也算是广东的大节了!小时候有龙舟赛,我记忆中大清早我和小伙伴会到河堤边上围观,如今没有了,不晓得是不是...
    C玉莹阅读 277评论 0 1
  • 早上带领大家观足,更多的感受到自己左脚低,仿佛有一股气流一直流到身体上。我的小指麻麻的,而且有一股很强的气流流过,...
    清荷_edfa阅读 246评论 0 2