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. Arduino VS. Raspberry Pi VS. Beaglebone Black

    The Arduino is a small Atmel-based microcontroller development board easily integrated into many dif ...

  2. DSP TMS320C6000基础学习(4)—— cmd文件分析

    DSP中的CMD文件是链接命令文件(Linker Command File),以.cmd为后缀. 在分析cmd文件之前,必需先了解 (1)DSP具体芯片的内存映射(Memory Map) (2)知道点 ...

  3. 对象池化技术 org.apache.commons.pool

    恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的消耗,提高系统的运行效率.Jakarta Commons Pool组件提供了一整套用于实现对象池化的框架,以及若干种各具特色的对象池实现,可以 ...

  4. jQuery表格排序组件-tablesorter

    一.引入文件 <script type="text/javascript" src="js/jquery.js"></script> & ...

  5. SQLSERVER2012 列存储索引的简单研究和测试

    SQLSERVER2012 列存储索引的简单研究和测试 SQLSERVER2012 列存储索引的简单研究和测试 看这篇文章之前可以先看一下下面这两篇文章: 列存储索引 http://www.cnblo ...

  6. CI持续集成

    CI持续集成 “我的TDD实践”系列之CI持续集成 写在前面: 我的TDD实践这几篇文章主要是围绕测试驱动开发所展开的,其中涵盖了一小部分测试理论,更多的则是关注工具的使用及环境的搭建,做到简单实践先 ...

  7. 更快的memcpy

    更快的memcpy 写代码有时候和笃信宗教一样,一旦信仰崩溃,是最难受的事情.早年我读过云风的一篇<VC 对 memcpy 的优化>,以及<Efficiency geek 2: co ...

  8. Trade-----HDU3401----单调队列优化的DP

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3401 题目意思: 有T天,你每天可以以API买进,BPI卖出,最多买ASI个,最多卖BSI个 最多只能 ...

  9. Android学习-应用程序管理

    在前段时间,公司要求做一个Android系统的应用程序管理,要实现卸载程序.清除数据.停止正在运行的服务这几大模块,现在将代码粗略总结如下: 主要运用到的类有 PackageManager Activ ...

  10. iOS extern使用教程

    ios开发使用extern访问全局变量 使用extern关键字法: 1 .新建Constants.h文件(文件名根据需要自己取),用于存放全局变量: 2. 在Constants.h中写入你需要的全局变 ...