表单处理
表单的概念在生活中很常见, 就像是问卷调查表一样, 别人先把问卷发给你, 你照着问卷的要求填写, 完事过后再将填完的问卷发给别人, 从而达到一个将别人需要的信息传递给别人的一种方式.
传统的网页大多数的作用都是展示数据, 就是将信息传递给用户. 而在现代化的 web 开发中, 非常注重信息交互, 所以表单也随处可见, 只是形式上变成网页, 性质上还是一模一样的. 主要的作用任然是 收集指定的用户信息.
1. 表单的基本使用
form 标签有两个必要属性:
action: 表单提交地址 (填完了, 交给谁)
method: 表单以什么方式提交
例如, 我们需要在登录界面上收集用户输入的用户名和密码:
- <!DOCTYPE html>
- <HTML lang="en">
- <head>
- <meta charset="UTF-8">
- <title>
- 登录
- </title>
- </head>
- <body>
- <form action="login.php" method="post">
- <div>
- <label for="username">
- 用户名
- </label>
- <input type="text" id="username" name="username">
- </div>
- <div>
- <label for="password">
- 密码
- </label>
- <input type="password" id="password" name="password">
- </div>
- <button type="submit">
- 登录
- </button>
- </form>
- </body>
- </HTML>
按照目前的情况, 用户第一次请求得到这个表单页面, 填写完表单内容, 点击登录, 表单会自动发送到 login.PHP , 剩下的问题就是要考虑如何在 login.PHP 中获取到用户提交过来的内容.
PHP 中有三个超全局变量专门用来获取表单提交内容:
$_GET : 用于获取以 GET 方式提交的内容
$_POST : 用于获取以 POST 方式提交的内容
$_REQUEST : 用于获取 GET 或 POST 方式提交的内容
借助 $_POST 或者 $_REQUEST 就可以获取到表单提交的内容:
- <?PHP
- // 获取表单提交的用户名和密码
- echo '用户名:' . $_REQUEST['username'];
- echo '密码:' . $_REQUEST['password'];
1.1. 提交地址
action 提交地址指的是这个表单填写完成过后点击提交, 发送请求的请求地址是什么.
从便于维护的角度考虑, 一般我们最常见的都是提交给当前文件, 然后在当前文件中判断是否是表单提交请求:
- <?PHP
- if ($_SERVER['REQUEST_METHOD'] === 'POST') {
- // 表单提交请求
- }
另外, 建议使用 $_SERVER['PHP_SELF'] 动态获取当前页面访问路径, 这样就不用因为文件重命名或者网站目录结构调整而修改代码了:
- <!-- 这样写死 action 地址, 当文件重命名就需要修改代码 -->
- <form action="/foo/login.php">
- <!-- ... -->
- </form>
- <!-- 通过 `$_SERVER['PHP_SELF']` 获取路径, 可以轻松避免这个问题 -->
- <form action="<?php echo $_SERVER['PHP_SELF']; ?>">
- <!-- ... -->
- </form>
1.2. 提交方式
method 可以用于设置表单提交的方式, 目前我们所认识的就是最常见两种表单提交方式: GET 和 POST .
从效果上来看, 两者都可以将数据提交到服务端, 但是从实现提交的原理上两者有很大的不同:
GET
表单数据是通过 URL 中的 ? 参数传递到服务端的
可以在地址栏中看到提交的内容
数据长度有限制, 因为 URL 地址长度有限 (2000 个字符)
POST
表单数据是通过请求体传递到服务端的, 我们在界面上看不到
可以提交任何类型的数据, 包括文件
由于界面上看不见, 浏览器也不储存, 所以更安全
至于什么情况下应该选用哪种方式, 这个需要结合业务场景和这两种方式各自的特点来决定, 没有绝对的答案, 只能给出一些原则:
绝不能使用 GET 来发送密码或其他敏感信息!!!
应该想清楚这次请求到底主要是去拿东西, 还是去送东西
2. 常见表单元素处理
至于表单元素中的文本框文本域一类的元素, 都是直接将元素的 name 属性值作为键, 用户填写的信息作为值, 发送到服务端. 但是表单元素中还有一些比较特殊的表单元素需要单独考虑:
2.1. 单选按钮
- <!-- 最终只会提交选中的那一项的 value -->
- <input type="radio" name="gender" value="male">
- <input type="radio" name="gender" value="female">
2.2. 复选按钮
- <!-- 没有设置 value 的 checkbox 选中提交的 value 是 on -->
- <input type="checkbox" name="agree">
- <!-- 设置了 value 的 checkbox 选中提交的是 value 值 -->
- <input type="checkbox" name="agree" value="true">
如果需要同时提交多个选中项, 可以在 name 属性后面 跟上 [] :
- <input type="checkbox" name="funs[]" id="" value="football">
- <input type="checkbox" name="funs[]" id="" value="basketball">
- <input type="checkbox" name="funs[]" id="" value="world peace">
最终提交到服务端, 通过 $_POST 接收到的是一个索引数组.
2.3. 选择框
- <select name="subject">
- <!-- 设置 value 提交 value -->
- <option value="1"> 语文 </option>
- <!-- 没有设置 value 提交 innerText -->
- <option > 数学 </option>
- </select>
2.3. 文件上传
type 属性为 file 的 input 元素可以通过表单提交文件 (上传文件), 服务端 PHP 可以通过 $_FILES 获取上传的文件信息.
- <?PHP
- // 如果选择了文件 $_FILES['file']['error'] => 0
- // 详细的错误码说明: http://php.net/manual/zh/features.file-upload.errors.php
- if ($_FILES['file']['error'] === 0) {
- // PHP 在会自动接收客户端上传的文件到一个临时的目录
- $temp_file = $_FILES['file']['tmp_name'];
- // 我们只需要把文件保存到我们指定上传目录
- $target_file = '../static/uploads/' . $_FILES['file']['name'];
- if (move_uploaded_file($temp_file, $target_file)) {
- $image_file = '/static/uploads/' . $_FILES['file']['name'];
- }
- }
$_FILES 同样也是一个关联数组, 键为表单的 name , 内容如下:
- array(1) {
- ["avatar"]=>
- array(5) {
- ["name"]=>
- string(17) "demo.jpg"
- ["type"]=>
- string(10) "image/jpeg"
- ["tmp_name"]=>
- string(27) "C:\Windows\Temp\php786C.tmp"
- ["error"]=>
- int(0)
- ["size"]=>
- int(29501)
- }
- }
来源: https://www.cnblogs.com/wjw9/p/10962998.html