美文网首页
PHP02-from

PHP02-from

作者: 东邪_黄药师 | 来源:发表于2018-09-25 16:22 被阅读2次

表单过程:


image.png
  1. 必须有 form 标签
    1. form 必须指定 action 和 method
      不设置 action 默认是当前页面 (必须设置,因为兼容)
      不设置 method 默认是 get
    2. 表单元素(表单域)必须有 name (如果希望被提交的情况)
    3. 表单中必须有一个提交按钮

var_dump(_GET); //_GET 用于接收 URL 地址中的提交数据(一般是 GET 参数)

var_dump(_POST); //_POST 用于接收 请求体 中提交的数据(一般是 POST 提交的数据)

var_dump(_REQUEST); //_REQUEST = _GET +_POST
=============================================================

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

按照目前的情况,用户第一次请求得到这个表单页面,填写完表单内容,点击登录,表单会自动发送到
login.php ,剩下的问题就是要考虑如何在 login.php 中获取到用户提交过来的内容。

PHP 中有三个超全局变量专门用来获取表单提交内容:
_GET :用于获取以 GET 方式提交的内容,更标准的说法:接收 URL 地址问号参数中的数据_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>

棒性:指的是我们的程序应对变化的能力

===========================================================
.2. 提交方式
method 可以用于设置表单提交的方式,目前我们所认识的就是最常见两种表单提交方式: GET 和 POST 。
从效果上来看,两者都可以将数据提交到服务端,但是从实现提交的原理上两者有很大的不同:
GET
表单数据是通过 URL 中的 ? 参数传递到服务端的
可以在地址栏中看到提交的内容
数据长度有限制,因为 URL 地址长度有限(2000个字符)
POST
表单数据是通过请求体传递到服务端的,我们在界面上看不到
可以提交任何类型的数据,包括文件
由于界面上看不见,浏览器也不储存,所以更安全
至于什么情况下应该选用哪种方式,这个需要结合业务场景和这两种方式各自的特点来决定,没有绝对的答案,只
能给出一些原则:
绝不能使用 GET 来发送密码或其他敏感信息!!!
应该想清楚这次请求到底主要是去拿东西,还是去送东西
=============================================================

  1. 常见表单元素处理
    至于表单元素中的文本框文本域一类的元素,都是直接将元素的 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 属性后面 跟上 [] :
http://php.net/manual/zh/faq.html.php#faq.html.arrays

 <input type="checkbox" name="funs[]" value="football">
<input type="checkbox" name="funs[]" value="basketball">
<input type="checkbox" name="funs[]" value="world peace">

最终提交到服务端,通过 $_POST 接收到的是一个索引数组。

2.3. 选择框:

    <select name="subject">
     <!‐‐ 设置 value 提交 value ‐‐>
     <option value="1">语文</option>
      <!‐‐ 没有设置 value 提交 innerText ‐‐>
         <option>数学</option>
     </select>

==============================================================

  1. 文件上传:
    http://php.net/manual/zh/features.file-upload.php
    注意:
    修改 php.ini 中的 post_max_size 配置,让服务端可以接受更大的请求体体积
    修改 php.ini 中的 upload_max_filesize 配置,让服务端支持更大的单个上传文件
    *暂时作为了解
    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'];
    }
    }

    image.png

=========================================================
3.1. 基于文件的注册和登录

  1. 注册
  2. 用户请求一个注册页面
  3. 服务端返回一个注册表单
  4. 用户填写表单并提交
  5. 服务端接收用户提交的信息
  6. 判断是否正确填写内容以及是否勾选同意
  7. 如果出现异常界面给出提示,并返回表单
  8. 如果都正常,则保存到文件中(每个用户一行)
  9. 登录
    ===========================================================
    <?php

/**

  • 回发处理逻辑
    */
    function postback () {
    // // 申明 message 是全局 // globalmessage;

// 1. 校验参数的完整性
if (empty(_POST['username'])) { // 没有提交用户名 或 用户名为空字符串GLOBALS['message'] = '会不会玩';
return;
}

if (empty(_POST['password'])) {GLOBALS['message'] = '请输入密码';
return;
}

if (empty(_POST['confirm'])) {GLOBALS['message'] = '请输入确认密码';
return;
}

if (_POST['password'] !==_POST['confirm']) {
$GLOBALS['message'] = '两次输入的密码不一致';
return;
}

if (!(isset(_POST['agree']) &&_POST['agree'] === 'on')) {
$GLOBALS['message'] = '必须同意注册协议';
return;
}

// 所有的校验都OK
username =_POST['username'];
password =_POST['password'];

// 将数据保存到文本文件中
file_put_contents('users.txt', username . '|' .password . "\n", FILE_APPEND);
$GLOBALS['message'] = '注册成功';
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
postback();
}

?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
<form action="<?php echo _SERVER['PHP_SELF']; ?>" method="post"> <table border="1"> <tr> <td><label for="username">用户名</label></td> <td><input type="text" name="username" id="username" value="<?php echo isset(_POST['username']) ? _POST['username'] : ''; ?>"></td> </tr> <tr> <td><label for="password">密码</label></td> <td><input type="password" name="password" id="password"></td> </tr> <tr> <td><label for="confirm">确认密码</label></td> <td><input type="password" name="confirm" id="confirm"></td> </tr> <tr> <td></td> <td><label><input type="checkbox" name="agree" value="on"> 同意注册协议</label></td> </tr> <?php if (isset(message)): ?>
<tr>
<td></td>
<td><?php echo $message; ?></td>
</tr>
<?php endif ?>
<tr>
<td></td>
<td><button>注册</button></td>
</tr>
</table>
</form>
</body>
</html>

相关文章

  • PHP02-from

    表单过程: 必须有 form 标签form 必须指定 action 和 method不设置 action 默认是当...

网友评论

      本文标题:PHP02-from

      本文链接:https://www.haomeiwen.com/subject/zmeloftx.html