==表单传值==
课前补充
==提问==:
- html后缀文件由谁进行解析?
- php后缀文件又由谁进行解析?
- html后缀文件中如果包含php代码,访问该html文件,php代码是否会被解析执行?
- php后缀文件中如果包含html代码,访问该php文件,html代码是否会被解析执行?
==解答==:
- html后缀文件的内容只会被浏览器解析;
- php后缀文件的内容只会被服务器的php模块解析;
- php代码不会被解析,因为默认情况下,服务器会将html后缀文件的内容全部当成普通字符串返回给浏览器,而浏览器只会解析html的标签内容,不会解析php源代码,所以php内容不会被解析。
- html代码在服务器端不会被解析,只会原样返回给浏览器,但是返回给浏览器之后,将会被浏览器解析;
==浏览器与服务交互流程分析==
1 | 浏览器-->服务器:请求\nhttp://www.xxx.com/a.html |
1. 表单传值的概念
为什么使用表单传值
绝大部分的网站几乎都拥有==登陆或注册==页面,并且也都拥有录入信息的后台。
比如我们在网站的登陆页面或注册页面填写信息提交后,填写的信息之所以能够传递到服务器,就是因为网站的页面中使用了表单传值;
什么是表单传值
概念:表单传值指的是通过==表单==构建数据,传递给服务器。
2. ==表单传值的方式==
表单传值的方式包含两种:
- POST方式
- GET方式
POST方式
==需求==:使用POST方式实现一个会员注册页面,包含帐号,密码两个填写项。
==解答==:构建一个名为code1.html的页面,代码如下
1 |
|
GET方式
==需求==:使用GET方式实现一个会员注册页面,包含帐号,密码两个填写项。
==解答==:构建一个名为code2.html的页面,代码如下
1 |
|
小结
表单传值的方式包括两种:1)POST方式;2)GET方式
表单传值的方式指的是:表单传递数据的方法;
==提问==:有传递就则必定有接收,通过表单传递方式传递出去的数据,在服务器端的PHP程序页面需要如何接收呢?
3. ==PHP接收数据的方式==
PHP接收数据的方式包含三种:
- $_POST方式
- $_GET方式
- $_REQUEST方式
$_POST方式
$_POST作用:==只==接收POST方式传递的数据。
==需求==:使用POST方式实现一个会员注册表单页面,包含帐号,密码两个填写项,同时实现在程序页面中使用$_POST和$_GET接收并输出表单页面提交传递的数据。
==解答==:
第一步,构建一个名为code3.html的页面,代码如下
1 |
|
第二步,构建名为code4.php的程序处理页面,代码如下
1 |
|
第三步,访问code3.html页面,填写注册数据,
第四步,点击提交按钮,查看最终提交后的效果,
==小结==:
$_POST只会接收POST方式传递过来的数据,不会接收GET方式传递过来的数据。
$_GET方式
作用:==只==接收GET方式传递的数据。
==需求==:使用GET方式实现一个会员注册表单页面,包含帐号,密码两个填写项,同时实现在程序页面中使用$_GET和$_POST接收并输出表单页面提交传递的数据。
==解答==:
第一步,构建一个名为code5.html的页面,代码如下
1 |
|
第二步,构建名为code6.php的程序处理页面,代码如下
1 |
|
第三步,访问code5.html页面,填写注册数据,
第四步,点击提交按钮,查看最终提交后的效果,
==小结==:
$_GET只会接收GET方式传递过来的数据,不会接收POST方式传递过来的数据。
表单传值GET方式的核心特征
使用GET方式传递数据时,提交后的链接地址的格式比较特殊,这个固定格式的链接地址就是GET方式提交数据的核心特征。
==GET方式核心特征格式说明==:
1 | 以如下链接地址为例: |
在这个数据中==“?==”问号的作用是==专门用来分隔URL链接地址和get参数数据==的;
在这个数据中==”&”==符号的作用是==专门用来分隔get参数数据与数据==的;
$_REQUEST方式
作用:同时包含$_POST,$_GET和$_COOKIE的数据。
==需求==:
- 在一个form表单中同时使用POST方式和GET方式实现表单传值,其中POST方式传递帐号和密码两个需要填写的数据,GET方式固定传递国籍country=china数据;
- 实现在程序页面中使用$_GET、$_POST和$_REQUEST接收并输出表单页面提交传递的数据。
==解答==:
第一步,构建一个名为code7.html的页面,代码如下
1 |
|
第二步,构建名为code8.php的程序处理页面,代码如下
1 |
|
第三步,访问code7.html页面,填写注册数据,
第四步,点击提交按钮,查看最终提交后的效果,
==小结==:
$_REQUEST同时包含$_POST和$_GET的元素数据;
==提问==:$_REQUEST即包含$_POST元素数据,又包含$_GET元素数据,那么当$_POST与$_GET存在下标同名的元素时,$_REQUET将会选择谁的数据作为最终值?
解答:默认情况下,$_REQUEST将会采用$_POST的值作为冲突时的最终值;但是,我们还可以通过php的配置文件修改$_REUQEST最终采用谁的值。
修改的方式和修改后的效果如下:
第一步,打开php.ini配置文件,找到request_order配置项,如下图所示
第二步,修改配置项的值为”PG”
第三步,重启apache,再次进行测试
4. ==POST方式与GET方式的区别==
无论是POST方式,还是GET方式,都属于表单传值。而表单传值的最终目的就是构建数据传输给服务器,这也就意味着POST方式和GET方式都能用来==传输数据给服务器==。
那么既然存在两种方式,我们在实际应用中应该如何来选择使用呢?
为此,我们需要进一步学习POST方式与GET方式之间的区别。POST方式与GET方式主要区别有四点:
- GET方式具有可见性,而POST方式不具有可见性;
- 基于第一点,POST方式在安全性上比GET方式要高一些;
- 在传输的数据量上,POST方式==可能==比GET方式要大;
- 在支持的数据类型上,==GET方式仅支持ASCII码==数据类型,POST方式无限制;
以上四点主要区别,无一例外,都说明了理论上POST方式比GET方式好,而在实际的使用中,我们在构建form表单时,method通常都是被指定为post方式。
==提问==:既然POST方式比GET方式优越,为什么还会有GET方式呢?
5. GET方式核心特征的应用
指定a标签的href属性
==需求==:构建分类列表页,实现点击每个分类都将跳转到同一个页面,但是最终将会输出与点击的分类相关的产品信息。
==解答==:
第一步,构建一个名为code9.html的页面,代码如下
1 |
|
第二步,构建名为code10.php的程序处理页面,代码如下
1 |
|
第三步,访问code9.html,点击不同的分类,查看最终效果
页面效果:
点击连衣裙之后的效果:
返回列表页,点击半身裙:
javascript中指定location对象的href属性
==需求==:
- 构建商品购买页面,假设商品库存为100个,要求有填写购买数量的输入框和立即购买按钮;
- 在商品购买页面中需要实现当点击立即购买按钮时,会根据用户填写的商品购买数量进行判断,如果没有超出库存则允许购买,如果超出库存则给出提示且不允许购买;
==解答==:
第一步,构建一个名为code11.html的页面,代码如下
1 |
|
第二步,构建名为code12.php的程序处理页面,代码如下
1 |
|
第三步,访问code11.html,填写商品数量,测试使用效果,
测试超出库存数量的情况:
测试没有超出库存数量的情况:
填写数量
点击购买按钮后
==小结==:
- 如果使用form表单,则最佳的传输方式为post方式,所以通常指定method为post;
- 如果是通过链接跳转到另外一个页面的场景,或者是在跳转之前还需要做判断的场景,则利用GET方式的核心特征,使用a链接或者js代码的location对象href属性更佳;
6. 单选按钮与复选框的处理
在web项目中,我们经常会在表单页面构建一些统计选项,以便在后期实现对数据更加精准的定位。常用的统计选项如单选或多选,都是我们经常会用到的。
在表单页面中单选使用的是单选按钮radio来实现的;多选使用的复选框checkbox来实现的。
表单页面中的单选按钮
==需求==:实现一个会员注册表单页面,包含帐号,密码和性别三个项,同时实现在程序页面中接收并输出表单页面提交传递的数据。
==解答==:
第一步,构建一个名为code13.html的页面,代码如下
1 |
|
第二步,构建名为code14.php的程序处理页面,代码如下
1 |
|
第三步,访问code13.html页面,填写注册数据,
第四步,点击提交按钮,查看最终提交后的效果,
==小结==:
单选按钮type值必须为radio.
表单页面中的复选框
==需求==:实现一个运动网站会员注册表单页面,包含帐号,密码和爱好三个项,其中爱好是多选选项,同时实现在程序页面中接收并输出表单页面提交传递的数据。
==解答==:
第一步,构建一个名为code15.html的页面,代码如下
1 |
|
第二步,构建名为code16.php的程序处理页面,代码如下
1 |
|
第三步,访问code15.html页面,填写注册数据,
第四步,点击提交按钮,查看最终提交后的效果,
==小结==:
如果要构建复选框,则:
- type值必须为checkbox;
- name值和value值必须指定上;
- name值需要加上“[]”中括号这个符号,否则将会形成数据的覆盖;
==文件上传==
文件上传的概念
为什么使用文件上传
在web领域,文件上传的应用非常广泛。如上传头像,上传证件照,上传报表文件等,都需要用到文件上传技术。
什么是文件上传
概念:文件上传指的是将文件从本地传输到指定的服务器。
==提问==:将文件从本地传输到服务器,从实现的角度来看是一个什么样的过程呢?
文件上传的实现思路
文件上传核心步骤
==需求==:根据文件上传的3步思路,实现注册页面头像图片上传页面及功能。
==解答==:
第一步,构建一个名为code17.html的页面,代码如下
1 |
|
第二步,构建名为code17.php的程序处理页面,代码如下
1 |
|
第三步,访问code17.html页面,选定图片文件,
第四步,点击提交按钮,查看最终提交后的效果,
1 | ####输出到浏览器的内容 |
==小结==:
- 如果要实现文件上传,form的method属性必须为post;
- form标签必须包含enctype属性,并且值必须固定为:multipart/form-data;
- 文件上传域type值必须为file;
- 必须为文件上传域指定name属性值;
- 在PHP程序中,由$_FILES负责接收上传的文件数据;
==提问==:网站项目中,实现文件上传的页面只会支持上传一个文件吗?
多文件上传
在web项目中,实现文件上传的页面时常会包含多个文件。
比如家装公司的效果图网站,一个房子内部的效果图不止一张,可能会包含多张,比如会分成客厅效果图,卧室效果图,玄关效果图,厨房效果图等等,那么,在上传文件时就需要支持多文件上传的功能了。
在PHP中我们把多文件上传分成两类:
- 不同名多文件的上传
- 同名多文件的上传
不同名多文件的上传
我们以家装公司的效果图网站来举一个例子。
==需求==:
- 实现一个家装公司效果图网站的图片上传表单页面,包含客厅效果图,卧室效果图两个文件上传域;
- 实现文件上传的程序处理功能。
==解答==:
第一步,构建一个名为code19.html的页面,代码如下
1 |
|
第二步,构建名为code20.php的程序处理页面,代码如下
1 |
|
第三步,访问code19.html页面,选定图片文件,
第四步,点击提交按钮,查看最终提交后的效果,
1 | ####浏览器输出的信息如下 |
==小结==:
不同名多文件上传时$_FILES的结构为如下所示,每个文件都固定包含5个元素的信息,
1 | Array |
同名多文件的上传
我们以证件审核网站来举一个例子。
==需求==:
- 实现一个证件审核网站的身份证正反两面图片上传表单页面;
- 实现文件上传的程序处理功能。
==解答==:
第一步,构建一个名为code21.html的页面,代码如下
1 |
|
第二步,构建名为code22.php的程序处理页面,代码如下
1 |
|
第三步,访问code21.html页面,选定图片文件,
第四步,点击提交按钮,查看最终提交后的效果,
1 | ####在浏览器中输出的信息 |
==小结==:
在同名多文件上传时,$_FILES结构如下图所示
1 | $_FILES: |
案例:封装文件上传函数
在web网站中,文件上传功能不可或缺,但是并不是每一个页面都需要文件上传功能。所以我们会将文件上传功能封装成函数,以便以后在项目中随用随取,而不需要每次都重复写相同的功能代码。
error错误码值说明
在手册中的位置:
功能分析
- 检查系统级别错误;
- 检查逻辑级别错误;
- 构建绝对不重复的文件名;
- 转移上传的文件到指定目录中;
代码实现
以下是upfile.php封装的文件上传功能函数,具体的测试使用文件code23.html和code24.php
1 | /** |
8. 全天总结
表单传值的方式:POST方式和GET方式;
PHP接收表单数据的方式:1)$_POST; 2)$_GET;3)$_REQUEST;
GET方式的核心特征:在URL链接地址后面可以通过固定的格式拼接GET参数数据,其中?是用来分隔链接地址和GET参数数据的,&符号是用来分隔GET参数数据与数据的;
POST方式与GET方式的区别:
a) GET方式具有可见性;
b) POST方式比GET方式相对安全;
c) POST方式传递的数据量==可能==比GET方式要大;
d) GET方式只支持ASCII码数据类型,POST方式无限制;
文件上传核心三步
a) 构建上传界面;
b) $_FILES接收文件数据;
c) move_uploaded_file函数转移文件
$_FILES保存的文件数据包含几个部分的内容:
a) name表示源文件名
b) type表示文件的格式类型
c) tmp_name表示存储在临时目录下的文件全路径
d) error表示上传时出现的错误码值
e) size表示上传文件的大小
如果要构建一个表单的注册页面,包含帐号,密码,性别,爱好和头像文件上传域,则form表单应该如何构建
1 | <form method="post" action="http://xxx.xx.com/xx.php" enctype="multipart/form-data"> |
课后练习
实现运动网站会员注册页面,要求:
- 表单页面包含帐号,密码,性别(男,女,保密),爱好(足球,篮球,乒乓球),头像;
- 程序页面输出表单页面提交传递的帐号,密码,性别,爱好信息;
- 程序页面还需要实现头像图片的上传功能,要求实现检查上传时系统错误,图片不能大于50K,格式只允许为jpeg或png;