• 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需要注意的一个问题

  • 相关阅读:
    基于Andoird 4.2.2的同步框架源代码学习——同步发起端
    C#MD5为密码加密
    YOUYOU深入学习Ganglia之三(gmetad的软件架构)
    js原生appendChild的bug
    Spring MVC 教程,快速入门,深入分析
    Centos 6.4 Linux 相关问题总结
    jQuery插件之-瀑布流插件
    编辑简单的 shell程序
    Qt国际化相关类
    三层架构与MVC
  • 原文地址:https://www.cnblogs.com/dee0912/p/4532190.html
Copyright © 2020-2023  润新知