请选择 进入手机版 | 继续访问电脑版
绿茶科技社区

form表单在PHP中的实现方式

2019-11-12 09:47
1563
1、表单的基本使用
HTML 中有一个专门用于提交数据的标签: <form> ,通过这个标签可以很容易的收集用户输入.
form 标签有两个必要属性:
  action:表单提交地址(填完了,交给谁)
  method:表单以什么方式提交
例如,我们需要在登录界面上收集用户输入的用户名和密码:
  1. <!DOCTYPE html>

  2. <html>

  3. <head>

  4.   <meta charset="UTF‐8">

  5.   <title>登录</title>

  6. </head>

  7. <body>

  8.   <form action="login.php" method="post">

  9.     <div>

  10.       <label for="username">用户名</label>

  11.       <input type="text" id="username" name="username">

  12.     </div>

  13.     <div>

  14.       <label for="password">密码</label>

  15.       <input type="password" id="password" name="password">

  16.     </div>

  17.     <button type="submit">登录</button>

  18.   </form>

  19. </body>

  20. </html>
复制代码
按照目前的情况,用户第一次请求得到这个表单页面,填写完表单内容,点击登录,表单会自动发送到login.php ,剩下的问题就是要考虑如何在 login.php 中获取到用户提交过来的内容.
PHP 中有三个超全局变量专门用来获取表单提交内容:
$_GET :用于获取以 GET 方式提交的内容
$_POST :用于获取以 POST 方式提交的内容
$_REQUEST :用于获取 GET 或 POST 方式提交的内容
借助 $_POST 或者 $_REQUEST 就可以获取到表单提交的内容:
  1. <?php

  2. // 获取表单提交的用户名和密码

  3. echo '用户名:' . $_REQUEST['username'];

  4. echo '密码:' . $_REQUEST['password'];
复制代码
1.1、提交地址
action 提交地址指的是这个表单填写完成过后点击提交,发送请求的请求地址是什么。
从便于维护的角度考虑,一般我们最常见的都是提交给当前文件,然后在当前文件中判断是否是表单提交请求:
  1. <?php

  2. if ($_SERVER['REQUEST_METHOD'] === 'POST') {

  3.   // 表单提交请求

  4.   }
复制代码
另外,建议使用 $_SERVER['PHP_SELF'] 动态获取当前页面访问路径,这样就不用因为文件重命名或者网站目录结构调整而修改代码了:
  1. <!‐‐ 这样写死 action 地址,当文件重命名就需要修改代码 ‐‐>

  2. <form action="/foo/login.php">

  3.   <!‐‐ ... ‐‐>

  4. </form>

  5. <!‐‐ 通过 `$_SERVER['PHP_SELF']` 获取路径,可以轻松避免这个问题 ‐‐>

  6. <form action="<?php echo $_SERVER['PHP_SELF']; ?>">

  7.   <!‐‐ ... ‐‐>

  8. </form>
复制代码
1.2、提交方式
method 可以用于设置表单提交的方式,目前我们所认识的就是最常见两种表单提交方式: GET 和 POST 。
  从效果上来看,两者都可以将数据提交到服务端,但是从实现提交的原理上两者有很大的不同:
GET
  表单数据是通过 URL 中的 ? 参数传递到服务端的
  可以在地址栏中看到提交的内容
  数据长度有限制,因为 URL 地址长度有限(2000个字符)
POST
  表单数据是通过请求体传递到服务端的,我们在界面上看不到
  可以提交任何类型的数据,包括文件
  由于界面上看不见,浏览器也不储存,所以更安全
  至于什么情况下应该选用哪种方式,这个需要结合业务场景和这两种方式各自的特点来决定,没有绝对的答案,只能给出一些原则:
  绝不能使用 GET 来发送密码或其他敏感信息!!!
  应该想清楚这次请求到底主要是去拿东西,还是去送东西
2、常见表单元素处理
至于表单元素中的文本框文本域一类的元素,都是直接将元素的 name 属性值作为键,用户填写的信息作为值,发送到服务端。但是表单元素中还有一些比较特殊的表单元素需要单独考虑:
2.1单选按钮
  1. <!‐‐ 最终只会提交选中的那一项的 value ‐‐>

  2. <input type="radio" name="gender" value="male">

  3. <input type="radio" name="gender" value="female">
复制代码
2.2、复选按钮
  1. <!‐‐ 没有设置 value 的 checkbox 选中提交的 value 是 on ‐‐>

  2. <input type="checkbox" name="agree">

  3. <!‐‐ 设置了 value 的 checkbox 选中提交的是 value 值 ‐‐>

  4. <input type="checkbox" name="agree" value="true">
复制代码
如果需要同时提交多个选中项,可以在 name 属性后面 跟上 [] :
  1. <input type="checkbox" name="funs[]" id="" value="football">

  2. <input type="checkbox" name="funs[]" id="" value="basketball">

  3. <input type="checkbox" name="funs[]" id="" value="world peace">
复制代码
最终提交到服务端,通过 $_POST 接收到的是一个索引数组.
2.3、选择框
  1. <select name="subject">

  2. <!‐‐ 设置 value 提交 value ‐‐>  

  3. <option value="1">语文</option>  

  4. <!‐‐ 没有设置 value 提交 innerText ‐‐>  

  5. <option>数学</option>

  6. </select>
复制代码
2.4文件上传
type 属性为 file 的 input 元素可以通过表单提交文件(上传文件),服务端 PHP 可以通过 $_FILES 获取上传的文件信息。
  1. <?php

  2. // 如果选择了文件 $_FILES['file']['error'] => 0

  3. // 详细的错误码说明:http://php.net/manual/zh/features.file‐upload.errors.php

  4. if ($_FILES['file']['error'] === 0) {

  5.   // PHP 在会自动接收客户端上传的文件到一个临时的目录

  6.   $temp_file = $_FILES['file']['tmp_name'];

  7.   // 我们只需要把文件保存到我们指定上传目录

  8.   $target_file = '../static/uploads/' . $_FILES['file']['name'];

  9.   if (move_uploaded_file($temp_file, $target_file)) {

  10.     $image_file = '/static/uploads/' . $_FILES['file']['name'];

  11.   }

  12. }
复制代码
$_FILES 同样也是一个关联数组,键为表单的 name ,内容如下:
  1. array(1) {

  2.   ["avatar"]=>

  3.   array(5) {

  4.     ["name"]=>

  5.     string(17) "demo.jpg"

  6.     ["type"]=>

  7.     string(10) "image/jpeg"

  8.     ["tmp_name"]=>

  9.     string(27) "C:\Windows\Temp\php786C.tmp"

  10.     ["error"]=>

  11.     int(0)

  12.     ["size"]=>

  13.     int(29501)

  14.   }

  15. }
复制代码



分享到 :
0 人收藏

3 个回复

倒序浏览
SammyLiu  高级会员 | 2019-11-12 09:55:27
我只是路过的......
阿新  金牌会员 | 2019-11-26 14:04:55
撸过
王清培  高级会员 | 2019-12-12 07:27:23
我只是路过的......
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

举报|Archiver|手机版|小黑屋|Lvchakeji Inc.  

Powered by Discuz! X3.3 © 2001-2016 Comsenz Inc.

返回顶部