PHP VERSION = 5.3.10

一、关于 $_REQUEST

PHP 文档关于 $_REQUEST 的说明:

说明

默认情况下包含了 $_GET,$_POST 和 $_COOKIE 的数组。

更新日志

版本    说明
5.3. 引入 request_order。该指令会影响 $_REQUEST 的内容。
4.3. $_FILES 信息被从 $_REQUEST 中移除。
4.1. 引入 $_REQUEST。

在 php 5.3 以上版本中,php.ini 中的 request_order 默认设置为:

request_order = "GP"

GP 即 GET 和 POST,并不包含"C"(COOKIE),即 $_REQUEST 默认只包含 $_GET 和 $_POST。

【例】

form.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>表单</title>
</head>
<body>
<form action="doAction.php?username=deathMask" method="post">
用户名: <input type="text" name="username">
<input type="submit" value="提交">
</form>
</body>
</html>

doAction.php

<?php
var_dump($_REQUEST['username']);

此时:在用户名输入框中输入 dee,则输出:

string 'dee' (length=)

但是如果修改 php.ini 中 request_order 值的顺序:

将默认的GP 改为 PG,

request_order = "PG"

即 $_GET 和 $_POST 同键时,$_GET 的值会覆盖 $_POST 的值,此时提交表单,输出:

string 'deathMask' (length=)

二、 确定请求是 get 方法 还是  post 方法:$_SERVER['REQUEST_METHOD']

【例】

form.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>表单</title>
</head>
<body>
<form action="doAction.php" method="post">
用户名: <input type="text" name="username">
<input type="submit" value="提交">
</form>
</body>
</html>

doAction.php:

<?php
echo $_SERVER['REQUEST_METHOD'];

如果通过 form.html 提交表单,则 doAction.php 输出:POST

如果直接访问 doAction.php,则输出:GET

【例】根据请求的方法决定做什么(GET 输出界面,POST 输出数据)

<?php if($_SERVER['REQUEST_METHOD'] == 'GET'){?>
<form action="<?php echo $_SERVER['SCRIPT_NAME'];?>" method="post">
用户名:<input type="text" name="username">
<input type="submit" value="提交">
</form>
<?php }else{
echo 'Hello, '.$_POST['username'];
} ?>

三、 验证必填字段

方案:使用 strlen() 来测试 $_GET 或 $_POST 中的元素值

if(!strlen($_POST['username'])){
echo '不能为空';
}else{
echo 'Hello, '.$_POST['username'];
}

注意:不同类型的表单元素留空会对 $_GET 和 $_POST 中的元素值不尽相同。空文本框、空文本区域及空的文件上传域的值是零长度字符串;而未选中的复选框和单选按钮,不会在 $_GET 和 $_POST 中生成任何值;浏览器通常会强迫在单选下拉列表中选中一个项目,而对于多选下拉列表,如果没有选中其中任何一个项目,则结果和复选框是一样的,不会在 $_GET 或 $_POST 中生成任何值。

不仅如此,就连请求本身也并非只能来自 Web 浏览器(利用漏洞恶意攻击)。

最严格的表单验证应该:step1. 使用 isset() 检查这个元素受否存在于 $_GET 或 $_POST 中; step2. 如果元素包含在一个数组中(复选框),可以使用 is_array() 来验证是否存在于一个数组。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>验证必填字段</title>
</head>
<body>
<h1>使用isset()、strlen()和is_array() 完成严格的表单验证</h1>
<?php if($_SERVER['REQUEST_METHOD'] == 'GET'){?> <form action="<?php echo $_SERVER['SCRIPT_NAME'];?>" method="post">
用户名:<input type="text" name="username"> *必填<br /><br />
爱好:<input type="checkbox" name="hobby[]" id="">足球
<input type="checkbox" name="hobby[]" id="">足球
<input type="checkbox" name="hobby[]" id="">阅读
<input type="checkbox" name="hobby[]" id="">编程
<input type="checkbox" name="hobby[]" id="">音乐
<input type="checkbox" name="hobby[]" id="">电影<br /><br />
<input type="submit" value="提交">
</form> <?php }else{
//在检查长度之前,先检查$_POST['username']是否存在
if(!strlen($_POST['username'])){
echo '请输入用户名<br />';
} //确保 $_POST['hobby'] 存在并且是一个数组
if(!(isset($_POST['hobby']) && is_array($_POST['hobby']))){
echo '请至少选择一项<br />';
}
} ?>
</body>
</html>

注意:根据 PHP 的布尔值计算规则,字符0 可以转换为 false,因此尝试使用 empty() 代替 strlen() 可能会导致问题 —— 如果在 children 文本框中填入 0,则 $_POST['children'] 的值为0,而 empty($_POST['children']) 测试的结果为 true,从验证表单的角度来说是错误的。

【例】

<?php
if(empty($_POST['username'])){
echo '空';
}else{
echo $_POST['username'];
}

当输入0时,输出 空。

四、 验证表单输入:数字

方案:如果要确定值是否为大于或等于0的整数,可以使用函数 ctype_digit()。

<?php
if(!ctype_digit($_POST['age'])){
echo '年龄必须大于等于0';
}

(待续)

参考:

①《PHP 经典实例》

② php中使用$_REQUEST需要注意的一个问题

PHP / JavaScript / jQuery 表单验证与处理总结: 第①部分 PHP 表单验证与处理的更多相关文章

  1. JavaScript/Jquery:Validform 验证表单的相关属性解释

    当我们写提交表单的时候往往需要验证表单是否填写了内容,是否正确,这个插件可以很方便的完成我们需要的验证! 使用方法: 1.先引用js <script type="text/javasc ...

  2. jQuery Validate 表单验证插件----通过name属性来关联字段来验证,改变默认的提示信息,将校验规则写到 js 代码中

    一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW  访问密码 f224 二. 添加一个另外一个插件jquery.validate.messages_cn.js. ...

  3. EasyUI表单验证,自定义插件验证,自定义js插件验证,远程验证,常见手机号,中英文,qq等验证规则验证

     { field : 'startPort', title : "起始端口", editor: "text", width : 50, editor: { ...

  4. Ajax在jQuery中的应用 (4)向jsp提交表单数据

    ajax技术带给我们的是良好的用户体验,同时,使用jquery可以简化开发,提高工作效率. 下面就介绍一下大致的开发步骤. 工具/原料 本文中使用的是 jquery-1.3.2.min.js 方法/步 ...

  5. dom&JavaScript&Jquery

    目录 dom&JavaScript&Jquery 建节点 添加节点 删除节点: 替换节点: 属性节点 获取值操作 class的操作 指定CSS操作 操作节点 获取input用户输入 操 ...

  6. HTML系列(HTMl+CSS+JavaScript+Jquery)--un

    HTML 指超文本标签语言. 点击查看更详细的HTML内容 包括:一.基本标签;二.常用标签;三.表单<form></form>;四.表格<table></t ...

  7. form表单下的button按钮会自动提交表单的问题

    form表单下的button按钮会自动提交表单的问题 2017年01月05日 18:02:44 蓝色水 阅读数:18012更多 个人分类: asp.net   form表单下的按钮在没有指定type类 ...

  8. 大量Javascript/JQuery学习教程电子书合集

    [推荐分享]大量Javascript/JQuery学习教程电子书合集,送给有需要的人   不收藏是你的错^_^. 经证实,均可免费下载. 资源名称 资源大小   15天学会jQuery(完整版).pd ...

  9. [推荐分享]大量Javascript/JQuery学习教程电子书合集,送给有需要的人

    不收藏是你的错^_^. 经证实,均可免费下载. 资源名称 资源大小   15天学会jQuery(完整版).pdf 274.79 KB   21天学通JavaScript(第2版)-顾宁燕扫描版.pdf ...

  10. 【推荐分享】大量JavaScript/jQuery电子书籍教程pdf合集下载

    不收藏是你的错^_^. 经证实,均可免费下载. 资源名称 资源大小   15天学会jQuery(完整版).pdf 274.79 KB   21天学通JavaScript(第2版)-顾宁燕扫描版.pdf ...

随机推荐

  1. Kafka学习笔记(二):Partition分发策略

    kafka版本0.8.2.1 Java客户端版本0.9.0.0 为了更好的实现负载均衡和消息的顺序性,Kafka Producer可以通过分发策略发送给指定的Partition.Kafka保证在par ...

  2. 通过扩展让ASP.NET Web API支持W3C的CORS规范(转载)

    转载地址:http://www.cnblogs.com/artech/p/cors-4-asp-net-web-api-04.html CORS(Cross-Origin Resource Shari ...

  3. Ubuntu16.04 安装openjdk-7-jdk

    Ubuntu16.04 安装openjdk-7-jdk sudo apt-get install openjdk-7-jre 或者sudo apt-get install openjdk-7-jdk ...

  4. HDU 4972 Bisharp and Charizard 想法题

    Bisharp and Charizard Time Limit: 1 Sec  Memory Limit: 256 MB Description Dragon is watching NBA. He ...

  5. Android中动画

    两种动画 view动画 属性动画  (也可以使用xml描述动画) view 4动画 补间动画 渐变 AlphaAnimation 缩放 ScaleAnimation 平移 TranslateAnima ...

  6. js:数据结构笔记10--图和图算法

    图:是由边和定点的集合组成:  按照图的定点对是否有序可以分为:有向图和无向图:  路径:所有顶点都由边连接构成:路径长度为第一个定点到最后一个顶点之间的数量:  环:指向自身的顶点,长度为0:圈:至 ...

  7. 递推DP URAL 1225 Flags

    题目传送门 /* 1 r; 2 b; 3 w 2不能在最前面,所以dp[1] = 2; dp[2] = 2: 13 or 31 dp[i] = dp[i-1] + dp[i-2]; 只加1或3时,总数 ...

  8. 如何把car中的模块导入adams/view中

    在你的adams安装目录下的acar文件夹下找到acar.cfg文件,将里面的 MDI_ACAR_PLUS_AVIEW 后面的no改成yes,在car中的tool下面就可以找到进入view环境的命令了 ...

  9. 使用jQuery操作Cookies的实现代码

    Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是 ...

  10. 【TYVJ】1982 武器分配(费用流)

    http://tyvj.cn/Problem_Show.aspx?id=1982 一眼题.. 源向每个人连容量为1,费用为0的边. 每个人向一个中转节点na连容量1,费用0的边(你也可以不连,直接连后 ...