13、表单

  1)GET vs. POST

  GET 和 POST 都创建数组(例如,array( key => value, key2 => value2, key3 => value3, ...))。此数组包含键/值对,其中的键是表单控件的名称,而值是来自用户的输入数据。

  GET 和 POST 被视作 $_GET 和 $_POST。它们是超全局变量,这意味着对它们的访问无需考虑作用域 - 无需任何特殊代码,您能够从任何函数、类或文件访问它们。

  $_GET 是通过 URL 参数传递到当前脚本的变量数组。

  $_POST 是通过 HTTP POST 传递到当前脚本的变量数组。

  通过 GET 方法从表单发送的信息对任何人都是可见的(所有变量名和值都显示在 URL 中)。GET 对所发送信息的数量也有限制。限制在大于 2000 个字符。不过,由于变量显示在 URL 中,把页面添加到书签中也更为方便。

  通过 POST 方法从表单发送的信息对其他人是不可见的(所有名称/值会被嵌入 HTTP 请求的主体中),并且对所发送信息的数量也无限制

  此外 POST 支持高阶功能,比如在向服务器上传文件时进行 multi-part 二进制输入。

  不过,由于变量未显示在 URL 中,也就无法将页面添加到书签。

  提示:开发者偏爱 POST 来发送表单数据。

  2)表单验证(不验证不安全,验证了也不能确保安全。。。。)

  <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

  $_SERVER["PHP_SELF"] 将表单数据发送到页面本身,而不是跳转到另一张页面。这样,用户就能够在表单页面获得错误提示信息。

  3)htmlspecialchars() 函数把特殊字符转换为 HTML 实体。

  string htmlspecialchars    ( string $string   [, int $flags = ENT_COMPAT | ENT_HTML401   [, string $encoding = ini_get("default_charset")   [, bool $double_encode = true  ]]] )

  这意味着< 和 > 之内的 HTML 字符会被替换:

    & (和) 转成 &amp;

    " (双引号) 转成 &quot;(unless ENT_NOQUOTES is set)

    '(单引号) 转成&#039;((for ENT_HTML401) or &apos; (for  ENT_XML1, ENT_XHTML or ENT_HTML5), 只有当$flags的值为 ENT_QUOTES会被转换)

    (小于) 转成 &lt;

    > (大于) 转成 &gt;

  此函数只转换上面的特殊字符,并不会全部转换成 HTML 所定的 ASCII 转换。

  这样可防止攻击者通过在表单中注入 HTML 或 avaScript 代码(跨站点脚本攻击)对代码进行利用。

  eg:

  <?php
  $new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
  echo $new; // &lt;a href='test'&gt;Test&lt;/a&gt;
  ?>

  关于htmlspecialchars更详细的说明:

  http://www.php.net/manual/en/function.htmlspecialchars.php

  4)XXS攻击例子(W3school上面截的例子):

  

  关于XXS攻击如何绕过htmlspecialchars

  https://www.zhihu.com/question/27646993

 5)表单验证实例:

  eg1:去除表单提交的数据中不必要的字符

  <?php
  // 定义变量并设置为空值
  $name = $email = $gender = $comment = $website = "";

  if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $name = test_input($_POST["name"]);
    $email = test_input($_POST["email"]);
    $website = test_input($_POST["website"]);
    $comment = test_input($_POST["comment"]);
    $gender = test_input($_POST["gender"]);
  }

  function test_input($data) {
    $data = trim($data);//去掉$data中不必要的字符(多余的空格、制表符、换行)
    $data = stripslashes($data);//删除用户输入数据中的反斜杠(\)
    $data = htmlspecialchars($data);
    return $data;
  }
  ?>
 eg2:检查 $_POST 变量是否为空(通过 PHP empty() 函数)。如果为空,则错误消息会存储于不同的错误变量中。如果不为空,则通过 test_input() 函数发送用户输入数据:

  <?php
  // 定义变量并设置为空值
  $nameErr = "";
  $name = "";

  if ($_SERVER["REQUEST_METHOD"] == "POST") {
    if (empty($_POST["name"])) {
     $nameErr = "Name is required";
    } else {
     $name = test_input($_POST["name"]);
    }
  }

  ?>

  <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

  Name: <input type="text" name="name">

  <!--将错误的输入直接显示在页面-->
  <span class="error">* <?php echo $nameErr;?></span>
  <br><br>

  </form>

  eg3:PHP - 验证 Name、E-mail、以及 URL

  <?php
  // 定义变量并设置为空值
  $nameErr = $emailErr= $websiteErr = "";
  $name = $email = $website = "";

  if ($_SERVER["REQUEST_METHOD"] == "POST") {//判断表单提交方式为POST
    if (empty($_POST["name"])) {//name值为空,存入nameErr信息
      $nameErr = "Name is required";
    } else {//name不为空时检查name是否合法
      $name = test_input($_POST["name"]);
      // 检查名字是否包含字母和空格
      if (!preg_match("/^[a-zA-Z ]*$/",$name)) {//跟js一样用正则表达式判断,不符合时给nameErr赋值
        $nameErr = "Only letters and white space allowed";
      }
    }
   //判断邮件格式
    if (empty($_POST["email"])) {
      $emailErr = "Email is required";
    } else {
      $email = test_input($_POST["email"]);
      // 检查电邮地址语法是否有效
      if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) {
        $emailErr = "Invalid email format";
      }
    }
   //判断URL格式
    if (empty($_POST["website"])) {
      $website = "";
    } else {
      $website = test_input($_POST["website"]);
      // 检查 URL 地址语言是否有效(此正则表达式同样允许 URL 中的下划线)
      if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%
      =~_|]/i",$website)) {
        $websiteErr = "Invalid URL";
      }
    }
   }
  ?>

  到这里PHP基础知识就完了,当然不要以为PHP就这么一点内容。这只是基础语法。感觉学习语言还是要自己动手做做的。

php学习笔记——表单的更多相关文章

  1. [html5] 学习笔记-表单新增的元素与属性(续)

    本节主要讲解表单新增元素的controls属性.placeholder属性.List属性.Autocomplete属性.Pattern属性.SelectionDirection属性.Indetermi ...

  2. 9. Javascript学习笔记——表单处理

    9. 表单处理 9.1 表单的基础知识 ///表单用 <form> 元素表示,对应的是 HTMLFormElement 类型,继承自 HTMLElement. //属性:action.me ...

  3. JavaScript高级程序设计学习笔记--表单脚本

    提交表单 用户单击提交按钮或图像按钮时,就会提交表单.使用<input>和<button>都可以定义提交按钮,只要将其type特性的值设置为"submit" ...

  4. [html5] 学习笔记-表单新增元素与属性

    本节讲的是表单元素的form,formaction属性,frommethod,formenctype属性,formtarget,autofocus属性,required,labels属性. 1.for ...

  5. Vue.js学习笔记——表单控件实践

    最近项目中使用了vue替代繁琐的jquery处理dom的数据更新,个人非常喜欢,所以就上官网小小地实践了一把. 以下为表单控件的实践,代码敬上,直接新建html文件,粘贴复制即可看到效果~ <! ...

  6. bootstrap学习笔记(表单)

    1.基础表单 :对于基础表单,Bootstrap并未对其做太多的定制性效果设计,仅仅对表单内的fieldset.legend.label标签进行了定制. fieldset { min-width: 0 ...

  7. HTML5 学习笔记 表单属性

    HTML5新的表单属性 HTML5 的form和input 标签添加了几个新的属性 <form>新属性 autocomplete novalidate input 新属性 autocomp ...

  8. AngularJs学习笔记-表单处理

    表单处理 (1)Angular表单API 1.模板式表单,需引入FormsModule 2.响应式表单,需引入ReactiveFormsModule   (2)模板式表单 在Angular中使用for ...

  9. ZendFramework2学习笔记 表单过滤、表单验证

    ZF2有非常多内建的Filter和Validator组件,能够方便地对表单数据进行处理. Filter的作用是过滤表单数据.比如,去除一些空格,替换一些敏感词等. Validator的作用是检验表单数 ...

随机推荐

  1. 教你用Perl 实现Base64编码

    在用脚本后台发送邮件时,需要将html的内容转换成Base64编码的形式,这样邮件客户端会自动对Base64编码的内容进行解码,还原成原来的内容. Base64.pl: #!/usr/bin/perl ...

  2. .NET重构—单元测试重构

    .NET重构—单元测试重构 阅读目录: 1.开篇介绍 2.单元测试.测试用例代码重复问题(大量使用重复的Mock对象及测试数据) 2.1.单元测试的继承体系(利用超类来减少Mock对象的使用) 2.1 ...

  3. FAQ:仓储实现为什么在基础设施层?

    FAQ:仓储实现为什么在基础设施层? 目录 问答部分参考文章 问答部分返回目录 问: 仓储实现为什么在基础设施层? 答: 领域模型包含三种元素:实体.值对象和服务,这三种元素都可以以某种形式使用仓储, ...

  4. 解决URL中文乱码问题--对中文进行加密、解密处理

    解决URL中文乱码问题--对中文进行加密.解密处理 情景:在资源调度中,首先用户需要选择工作目标,然后跟据选择的工作目标不同而选择不同的账号和代理ip.处理过程如下:点击选择账号,在js中获取工作目标 ...

  5. Centos 上使用mmsh协议听猫扑网络电台 VLC播放器

    Centos 上使用mmsh协议听猫扑网络电台 VLC播放器 安装CentOS已经有一段时间了,但是由于在Linux下除了学习,其他是事情都干不了.今天想闲来无事开了CentOS就想听一下歌,突然想起 ...

  6. WCF 学习笔记之双工实现

    WCF 学习笔记之双工实现 其中 Client 和Service为控制台程序 Service.Interface为类库 首先了解契约Interface两个接口 using System.Service ...

  7. UIColor RGB颜色对照表

     色 彩 RGB  值 对 照 表   color red green blue Hexadecimal triplet example Aliceblue 240 248 255 f0f8ff   ...

  8. AI(三):微信与luis结合(上)

    目录 基本原理 公众号申请及配置 验证服务器有效性 微信请求消息类型 基本原理 基本原理如上图:腾讯微信服务器就相当于一个转发服务器,终端(手机.Pad等)发起请求至微信服务器,微信服务器然后将请求转 ...

  9. C++虚函数实现多态原理(转载)

    一.前言 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有"多种形态 ...

  10. TypeScript开发ReactNative之fetch函数的提示问题

    使用TypeScript开发ReactNative时,发现在类中调用 fetch 函数时IDE可能会提示找不到,无法加载,特别是当类中存在同名的 fetch 成员方法时更是郁闷了,虽然程序是可以执行的 ...