PHP / JavaScript / jQuery 表单验证与处理总结: 第①部分 PHP 表单验证与处理

PHP VERSION = 5.3.10

一、关于 $_REQUEST

PHP 文档关于 $_REQUEST 的说明:

说明

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

更新日志

版本    说明
5.3.0    引入 request_order。该指令会影响 $_REQUEST 的内容。
4.3.0    $_FILES 信息被从 $_REQUEST 中移除。
4.1.0    引入 $_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=3)

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

将默认的GP 改为 PG,

request_order = "PG"

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

string ‘deathMask‘ (length=9)

二、 确定请求是 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需要注意的一个问题

时间: 2024-12-21 20:11:21

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

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

一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW  访问密码 f224 二. 添加一个另外一个插件jquery.validate.messages_cn.js. 改变默认提示方式. 三.jQuery表单验证插件----通过name属性来关联字段来验证,将校验规则写到 js 代码中. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.

jquery validate.js表单验证的基本用法入门--不用写繁琐的验证代码了...

jquery.validate.js是jquery下的一个验证插件,功能比较强大,早就有所耳闻但是一只没有动手用过,现在在于能够研究一下了. 这里转载一篇前辈写的文章,在我自己的理解上修改了一下,仅作记录. 先贴一个国内某大公司的代码: 1 <script type="text/javascript"> 2 function lang(key) { 3 mylang = { 4 'ls_input_myb': '请输入您的账户', 5 'ls_myb_email': '漫游

jQuery使用serialize(),serializeArray()方法取得表单数据+字符串和对象类型两种表单提交的方法

原始form表单值获取方式(手动): $.ajax({ type: "POST", url: "ajax.php", data: "Name=摘取天上星&position=IT技术", success: function(msg){alert(msg);}, error: function(error){alert(error);} }); JQ serialize()方法取值: $.ajax({ type: "POST&quo

jQuery EasyUI使用教程之创建展开行详细编辑表单的CRUD应用

当切换datagrid视图到"detailview"时,用户可以展开一行来显示该行下面的任何详细信息.此功能允许用户为放置在行详细信息面板中的编辑表单提供恰当的布局.在本教程中,我们使用DataGrid组件来减少编辑表单所占用的空间. 查看演示 Step 1:在HTML标记中创建DataGrid <table id="dg" title="My Users" style="width:550px;height:250px"

原生JavaScript判断是否为邮箱、危险字符、验证长度、验证网址、验证小数、整数、浮点数等常用的验证

(71~80)验证篇这一篇文章主要是10个比较常用表单验证功能,包括了邮箱.危险字符.验证长度.验证网址.验证小数.整数.浮点数等常用的验证,有了这些代码片段,平时的表单验证也可以不需要jquery的验证插件了,希望可以帮到大家... 71.原生JavaScript判断是否为邮箱 复制代码 代码如下: function isEmail(str){ var re=/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-

JavaScript jQuery 入门回顾 2

JQuery 滑动 利用jQuery可以在元素上创建滑动效果. slideDown() 向下滑动元素. slideUp() 向上滑动元素. slideToggle() 在 slideDown() 与 slideUp() 方法之间进行切换. $(selector).slide(speed,callback);{ 可选的 speed 参数规定效果的时长.它可以取以下值:"slow"."fast" 或毫秒. 可选的 callback 参数是滑动完成后所执行的函数名称.}

JavaScript&amp;jQuery.preventDefault()

使用事件的preventDefault()方法改变默认行为 事件有属性,还有方法,还有对象.事件本身是个对象. 事件的preventDefault()方法改变默行为,在事件发生前阻止,不让其发生.这样的应用场景有很多,常见表单验证,如必填字段不能为空. 示例1: <!DOCTYPE html><html> <head> <title>改变默认行为</title> <meta charset="UTF-8"> <

javascript & jQuery

//获取表格行数和列数 //表格行数 var rows = document.getElementById("example_table").rows.length; //表格列数 var cells = document.getElementById("example_table").rows.item(0).cells.length; javascript & jQuery

javascript --- jQuery --- Deferred对象

javascript --- jQuery --- Deferred对象 javascript的函数式编程是多么引人入胜,jQuery使代码尽可能的精简,intelligent! defer - 必应词典:v.迁延:听从:扣存:[军]使延期入伍所以deferred对象的含义就是"延迟"到未来某个点再执行. jQuery的官方文档给出了用jQuery.ajax()发送请求的基本方式http://api.jquery.com/jQuery.ajax/Example: Save some d

动态加载页面数据的小工具 javascript + jQuery (持续更新)

使用该控件,可以根据url,参数,加载html记录模板(包含json参数对应,以及具体记录位置Index根据参数描述加载对应的属性,并可以根据简单的判断分支加载对应html或者控件)至列表容器内(JQuery选择器字符串)注: 该控件在使用前需引入JQuery框架支持,使用该控件,可极大的减少Ajax列表数据动态加载开发工作的实际工作量. 使用方式: 首先,添加控件引用,并加入Jquery支持 <script src="js/jquery.js"></script&g