PHP7语言基础——交互之表单


PHP能做很多事情,甚至可以开发桌面应用程序,但是最广泛的应用还是在网页开发中,然而,开发网页不得不与表单打交道。我们时刻都需要收集用户通过表单提交来的信息以便进行进一步处理。表单是程序和用户交互的主要方式。

表单的种类

这些知识是HTML的范畴,这里只简单的提一下,如果需要详细了解,请自行翻阅HTML文档。

文本域及其类型

让用户输入数据并对用户输入进行处理是最常见的交互类型,我们使用input标签来表示文本域,HTML5中提供了很多不同的输入类型,输入类型使用type属性定义。

  1. text
    text类型是文本域最常见的类型。格式如下:

    text文本框:<input type='text' name='test'>
    

    网页效果:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v9pAlGaN-1584154420241)(D:\mkdownpad2\php7.3.8官方手册笔记\表单.assets\image-20200308194435468.png)]

  2. color
    color类型的表单将会调出拾色器用于选取颜色:

    color:<input type='color' name='test'>
    

    网页效果:

    在这里插入图片描述

  3. date
    date类型允许从一个日期选择器选择一个日期:

    生日:<input type='date' nam='bday'>
    

    网页效果:
    在这里插入图片描述

  4. email
    email类型用于应该包含email地址的输入域,不规范的输入会提示错误:

    Email:<input type='email' name='useremail'>
    

    网页效果:
    在这里插入图片描述

  5. number
    number类型用于应该包含数值的输入域,并且还能够设定对所接收数字的限定,也可设置步进长度。

    数量(1~10,步进为3):<input type="number" name="quantity" min="1" max="10" step="3">
    

    网页效果:
    在这里插入图片描述

  6. range
    range类型用于应该包含一定范围内数字值的输入域,显示为滑动条:

    <input type="range" name="points" min="1" max="10">
    

    网页效果:
    在这里插入图片描述

  7. url
    url类型用于应该包含URL地址的输入域。在提交表单时,会自动验证url的值:

    请输入一个网址:<input type="url" name="url">
    

    网页效果:
    在这里插入图片描述

以上是常见的input表单类型,input的type参数能接受的类型如下表:

描述
button 定义可点击的按钮(通常与 JavaScript 一起使用来启动脚本)。
checkbox 定义复选框。
color 定义拾色器。**注意:**Internet Explorer 和 Safari 不支持 元素。
date 定义date控件(包括年、月、日,不包括时间)。**注意:**Internet Explorer 或 Firefox 不支持 元素。
datetime 定义date和time控件(包括年、月、日、时、分、秒、几分之一秒,基于 UTC 时区)。注意:Internet Explorer、Firefox 或者 Chrome 不支持 元素,Safari 中部分支持。Opera 12 以及更早的版本中完全支持。
datetime-local 定义 date 和 time 控件(包括年、月、日、时、分、秒、几分之一秒,不带时区)。**注意:**Internet Explorer 或 Firefox 不支持 元素。
email 定义用于 e-mail 地址的字段。**注意:**Internet Explorer 9(以及更早的版本)或 Safari 不支持 元素。
file 定义文件选择字段和 “浏览…” 按钮,供文件上传。
hidden 定义隐藏输入字段。
image 定义图像作为提交按钮。
month 定义month和year控件(不带时区)。**注意:**Internet Explorer 或 Firefox 不支持 元素。
number 定义用于输入数字的字段。**注意:**Internet Explorer 9 以及更早的版本不支持 元素。
password 定义密码字段(字段中的字符会被遮蔽)。
radio 定义单元按钮。
range 定义用于精确值不重要的输入数字的控件。
reset 定义重置按钮(重置素有的表单值为默认值)。
search 定义用于输入搜索字符串的文本字段。**注意:**Internet Explorer 9(以及更早的版本)或 Safari 不支持 元素。
submit 定义提交按钮。
tel 定义用于输入电话号码的字段。
text 默认。定义一个单行的文本字段(默认宽度为20个字符)。
time 定义用于输入时间的控件(不带时区)。注意: Internet Explorer 或 Firefox浏览器不支持使用type=“time” 属性的 HTML 元素。
url 定义用于输入URL的字段。**注意:**Internet Explorer 9 (及更早IE版本), 或 Safari 浏览器不支持使用 type=“url” 属性的 HTML 元素。
week 定义week和year控件(不带时区)。**注意:**Internet Explorer 或 Firefox 浏览器不支持使用 type=“week” 属性的 HTML 元素。

其他表单类型

  1. 下拉框
    下拉框使用select标签定义。
    【示例】

    <select name="car">
        <option value="volo">Volo</option>
        <option value="saab">Saab</option>
        <option value="mercedes">Mercedes</option>
        <option value="audi">Audi</option>
    </select>
    

    网页效果:

    在这里插入图片描述

  2. 文本域
    Textarea 对象代表 HTML 表单中的一个文本域 (text-area)。
    【示例】

    <textarea name='textarea'></textarea>
    

    网页效果:

    在这里插入图片描述

表单

Form对象代表一个HTML表单,表单通常用于收集用户数据,包含了 input 元素如:文本字段,复选框,单选框,提交按钮等。表单对象包含如下属性:

属性 描述
acceptCharset 服务器可接受的字符集。
action 设置或返回表单的action属性。定义了当表单被提交时数据被送往何处。
enctype 设置或返回表单用来编码内容的 MIME 类型。如果表单没有 enctype 属性,那么当提交文本时的默认值是 “application/x-www-form-urlencoded”。当 input type 是 “file” 时,值是 “multipart/form-data”。
id 设置或返回表单的id。
length 返回表单中的元素数目。
method 设置或返回将数据发送到服务器的HTTP 方法。如:get、post等。
name 设置或返回表单的名称。
target 设置或返回表单提交结果的Frame 或 Window 名。值包含_blank|_parent|_self|_top中的一个。

处理表单数据的基本过程是:数据从web表单(form)发送到PHP代码,经过处理再生成HTML输出。它的处理原理是:当PHP处理一个页面的时候会检查URL、表单数据、上传文件、可用cookie、Web服务器和环境变量,如果有可用信息,就可以通过PHP访问自动全局变量数组$_GET$_POST$_FILES$_COOKIE$_SERVER$_ENV得到。

表单基本结构

表单的基本结构是由<from></form>标识包裹的区域:

<html>
    <head>
        <title>Example</title>
    </head>
    <body>
        <form action="#" method="POST" enctype="multipart/form-data">
            .....
        </form>
    </body>
</html>

get和post方法

在PHP中使用get和post接收来自HTML表单的值,在form表单中定义PHP的接收方式和接收地址。

get和post的区别

  1. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指定的URL地址。这个过程是不会反映在URL中的。
  2. get传送的数据量较小,不能大于2KB,这主要是因为受URL长度限制。post传送的数据量较大,一般被默认为不受限制。
  3. get安全性非常低,post安全性较高,但是get执行效率比post好。
  4. get是form的默认方法。

获取表单值

在form表单中,action属性定义提交表单的地址,method属性定义提交的方法。

【示例】

<!-- user.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>Example</title>
</head>
<body>
    <form action="user.php" method="post">
        用户名:<input type="text" name="user">
        <br />
        密码:<input type="password" name="pwd">
        <br />
        生日:<input type="date" name="bday">
        <br />
        <input type="radio" name="sex" value="male">女性
        <input type="radio" name="sex" value="famale">男性
        <br />
        <!-- checkbox的name必须使用数组形式命名,否则PHP只能接收到最后一个被选的值-->
        <input type="checkbox" name="vehicle[]" value="Bike">自行车
        <input type="checkbox" name="vehicle[]" value="Car">汽车
        <br />
        <select name="car">
            <option value="volo">Volvo</option>
            <option value="saab">Saab</option>
            <option value="mercedes">Mercedes</option>
            <option value="audi">Audi</option>
        </select>
        <br />
        <input type="submit" value="提交">
    </form>
</body>
</html>

网页效果:

在这里插入图片描述

代码中定义接收表单值的地址是user.php,接收方式是post,当用户点击提交按钮后,会将数据发送到user.php中,下面我们创建user.php来接收数据。

// user.php
<?php
echo "<pre>";
var_dump($_POST);
echo "</pre>";
?>

程序输出结果:

在这里插入图片描述

如果form中选择使用get方式上传数据,那么将user.php中的$_POST改为$_GET即可。使用get方式点击提交按钮后,浏览器URL变成了如下形式:

user.php?user=admin&pwd=admin&bday=2020-03-08&sex=famale&vehicle[]=Bike&car=mercedes可以看到我们所有的数据都是明文传送的。得到的数据结果是一样的。

处理上传文件

HTML中使用type="file"类型的表单可向服务器上传文件,服务端使用PHP接收文件数据和接收普通表单元素数据的处理方法不同,必须在form表单中定义enctype="multipart/form-data"

【示例】

<!-- file.html-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>fileupload</title>
</head>
<body>
    <form action="file.php" enctype="multipart/form-data" method="post" name="upfile">
    上传文件:<input type="file" name="filename" />
    <input type="submit" value="上传" />
    </form>
</body>
</html>

网页效果:

在这里插入图片描述

file.php文件代码如下:

<?php
echo "<pre>";
var_dump($_POST);
var_dump($_FILES);
echo "</pre>";
if ($_FILES["filename"]["error"] > 0) {
    echo "错误:".$_FILES["filename"]["error"] . "<br />";
} else {
    print_r($_FILES["filename"]);
    if (is_uploaded_file($_FILES["filename"]['tmp_name'])) {
        $upfile = $_FILES["filename"];
        // 获取数组里面的值
        $name = $upfile["name"];    // 获取上传文件的文件名
        $type = $upfile["type"];    // 获取上传文件的类型
        $size = $upfile["size"];    // 获取上传文件的大小
        $tmp_name = $upfile["tmp_name"];    // 获取上传文件的临时存放路径
        // 移动上传文件到指定目录
        move_uploaded_file($tmp_name, './upload/'.$name);
    }
}
?>

程序输出结果:

在这里插入图片描述

从输出结果可以看到var_dump($_POST);的内容为空,表明在使用file类型表单提交数据时并不使用$_POST接收数据,而是使用$_FILES来接收。

PHP中使用move_uploaded_file函数将上传的文件移动到指定位置。

另外,在PHP配置文件php.ini中默认上传文件的大小只有2MB,在上传大文件时需要对配置文件进行修改。php.ini中有关上传文件的设置如下:

  • file_uploads:是否允许HTTP文件上传,默认值为On,允许HTTP文件上传,次选项不能设置为Off。
  • upload_tmp_dir:文件上传的临时存放目录。如果没有设定,那么PHP会使用系统默认的临时目录。该选项默认为空,如果不配置这个选项,文件上传功能就无法实现。
  • upload_max_filesize:上传文件的最大尺寸。这个选项默认值为2MB,即文件上传大小为2MB,如果想上传一个50MB的文件,就必须设定upload_max_filesize=50M。仅设置upload_max_filesize=50M还是无法实现大文件的上传功能,还必须修改php.ini文件中的post_max_size选项。
  • post_max_size:通过表单POST给PHP所能接收的最大值,包括表单里的所有值,默认为8MB。如果POST数据超出限制,那么$_POST$_FILES将会为空。要上传大文件,必须设定该选项值大于upload_max_filesize选项的值,如:设置了upload_max_filesize=50M,这里就可以设置post_max_size=100M。另外,如果启用了内存限制,那么该值应当小于memory_limit选项的值。
  • max_execution_time:每个PHP页面运行的最大时间值(单位秒),默认为30秒。当我们上传一个较大的文件时,如50MB,很可能要几分钟才能上传完,但PHP默认页面最久执行时间为30秒,超过30秒该脚本就停止执行,导致出现无法打开网页的情况,因此可以把该值设置得较大些,如max_execution_time=600。如果设置为0,就表示无时间限制。
  • max_input_time:每个PHP脚本解析请求数据所用的时间(单位秒),默认为60秒。当我们上传大文件时,可以将这个值设置得较大些。如果设置为0,就表示无时间限制。
  • memory_limit:这个选项用来设置单个PHP脚本所能申请到的最大内存空间。这有助于防止脚本消耗光服务器上的可用内存。如果不需要任何内存上的限制将其设置为-1.

对URL传递的参数进行编码

PHP对URL中传递的参数进行编码,即可以实现对所传递数据的加密,又可以对无法通过浏览器传递的字符进行传递。要实现次操作一般使用urlencode()rawurlencode()函数。而对此过程的反向操作就是使用urldecode()rawruldecode()函数。

  1. urlencode()

    urlencode(string $str):string
    

    此函数便于将字符串编码并将其用于 URL 的请求部分,同时它还便于将变量传递给下一页。
    该函数返回字符串,此字符串中除了-_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此编码与WWW表单POST数据的编码方式是一样的,同时与application/x-www-form-urlencoded的媒体类型编码方式一样。

  2. urldecode()

    urldecode(string $str):string
    

    该函数解码给出的已编码字符串中的任何%##。 加号(’+’)被解码成一个空格字符。

  3. rawurlencode()

    rawurlencode(string $str):string
    

    该函数根据 » RFC 3986 编码指定的字符。

    在PHP5.3.0之前,rawurlencode » RFC 1738 来编码波浪线。

  4. rawurldecode()

    rawurldecode(string $str):string
    

    返回字符串,此字符串中百分号(%)后跟两位十六进制数的序列都将被替换成原义字符。

【示例】

<?php
$user = '张三 李四';    // 定义变量
// 对字符串进行编码
$link1 = "index.php?userid=" . urlencode($user) . "<br />";
$link2 = "index.php?userid=" . rawurlencode($user) . "<br />";
echo $link1 . $link2;
// 对字符串进行解码
echo urldecode($link1) . "<br />";
echo urldecode($link2) . "<br />";
echo rawurldecode($link2);
?>

程序输出结果:

在这里插入图片描述

从输出结果可以看出urlencode()rawurlencode()的区别在于对空格的编码上,前者使用“+”编码空格,后者使用“%20”编码空格。

如果配合JS处理页面信息,要注意urlencode()函数使用“+”代表空格会与JS代码冲突。因此在与JS交互时,应使用’rawurlencode()'来编码。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章