最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 变着花样来接参,PHP中接收外部参数的方式

    正文概述 转载于:掘金(硬核项目经理)   2021-03-17   571

    对于php这样一个web语言来说,接参是非常重要的一个能力。毕竟从前端表单或异步请求传递上来的数据都要获取到才能进行正常的交互展示。当然,这也是所有能够进行web开发的语言的必备能力。今天我们就来看看PHP各种各样的接参形式。

    首先,我们要准备一个静态页面,就像下面这个一样,它提供了一个表单,同时url里还带有一个GET参数:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
    </head>
    <body>
        <form action="?show=1" method="post">
            姓名:<input type="text" name="name"/><br />
            电话:<input type="text" name="tel"/><br/>
    
            地址(省):<input type="text" name="address.prov"/><br/>
            地址(市):<input type="text" name="address city"/><br/>
    
            兴趣1:<input type="text" name="interest[]"/><br/>
            兴趣2:<input type="text" name="interest[]"/><br/>
            兴趣3:<input type="text" name="interest[]"/><br/>
    
            学历1:<input type="text" name="edu[one]"/><br/>
            学历2:<input type="text" name="edu[two]"/><br/>
    
            <input type="submit" value="提交" >
        </form>
    </body>
    </html>
    

    正常的GET_GET、G​ET、_POST方式

    // 正常的GET、POST
        echo $_GET['show'], '<br/>'; // 1
        echo $_POST['name'], '<br/>'; // 提交的内容
    

    这是最基础的也是最直接的接参方式,GET参数通过 GET获取,POST参数通过_GET 获取,POST参数通过 G​ET获取,POST参数通过_POST 获取,互相都不干扰。

    正常的$_REQUEST方式

        // 使用REQUEST
        echo $_REQUEST['show'], '<br/>'; // 1
        echo $_REQUEST['tel'], '<br/>'; // 提交的内容
    

    REQUEST则是获取所有请求中的参数,不包括上传文件。也就是说,它包含了_REQUEST 则是获取所有请求中的参数,不包括上传文件。也就是说,它包含了 R​EQUEST则是获取所有请求中的参数,不包括上传文件。也就是说,它包含了_GET 、 POST以及_POST 以及 P​OST以及_COOKIE(需要配置,默认不包含) 这三个接参变量中的所有内容。这里需要注意的一点是,PHP5.3以后, $_REQUEST 接受的参数变量内容由 php.ini 文件中的 request_order 指定,默认情况下这个配置参数的值是 GP 也就是 GET 和 POST ,并没有 COOKIE ,想要 COOKIE 的话需要修改这里添加一个C就可以了。

    如果 GET_GET 、 G​ET、_POST 中有同名的内容呢? $_REQUEST 展示的顺序也是根据这配置参数的顺序来的,从左至右,后面的覆盖前面的,比如你配置的是GP 那么参数覆盖的顺序是: POST > GET,最终显示的就是 POST 中的内容。

    register_globals问题

        // register_globals 如果打开
        echo $name, '<br/>'; // 提交的内容
        echo $tel, '<br/>'; // 提交的内容
    

    这是一个不安全的配置,也是在 php.ini 文件中进行配置的。它的作用就是将请求来的参数直接转成变量,有全局变量污染的问题,不要打开!!!现在的 php.ini 文件中基本都是默认关闭的。

    import_request_variables

        // import_request_variables 抱歉,5.4之后已经取消了
        import_request_variables('pg', 'pg_');
        echo $pg_show, '<br/>';
        echo $pg_name, '<br/>';
    

    这个函数是手动将指定的参数变量里面的内容注册为全局变量,同样的,它也在5.4之后被取消的,这样的函数都会存在风险,我们了解一下曾经有过这样一个函数即可。

    extract

        extract($_POST, EXTR_PREFIX_ALL, 'ex');
        echo $ex_name, '<br/>'; // 提交的内容
        echo $ex_tel, '<br/>'; // 提交的内容
    

    extract 是目前可以代替上面两种参数转变量的方式中目前依然支持的。它是由我们自己来控制对已存在变量的覆盖的,也就是第二个参数,这样在可控的环境下可以极大地避免污染全局变量的问题,当然前提还是我们自己要确定使用它,具体内容可以自行查找文档参考哦!

    参数名中的.和空格

        // 参数名中的.和空格
        echo $_REQUEST['address_prov'], '<br/>'; // 提交的内容
        echo $_REQUEST['address_city'], '<br/>'; // 提交的内容
    

    表单提交的 input 的 name 中如果包含 . 或者 空格 ,将直接转换成 下划线 。不过我们在前端命名中也不建议使用 . 或者 空格 ,需要的时候直接就使用 下划线 就好了,前后端不要造成歧义。

    参数名中的[]

        // 参数名中的[]
        print_r($_REQUEST['interest']); // Array (v,....) 
        echo '<br />';
        print_r($_REQUEST['edu']); // Array (k/v,....) 
    

    当表单提交的 input 的 name 是数组形式的,也就是 "interest[]" 或 "edu[one]" 这种形式时,我们接收到的参数默认就会成为一个数组形式的内容。

    高大上的php://input

        // php://input
        $content = file_get_contents('php://input');   
        print_r($content); //name=xxx&.....
    

    最后就是现在接口开发中经常会使用的 php://input 形式接参。一般是因为安全或参数字段较多的情况下,前端通过 Body Raw 的形式直接传递一整段的 Body 内容过来。这时候就只能用这种形式获取到了,这个 Body Raw 的原始内容一般会是一整段的文字,也有可能是进行过一些加密处理的内容,格式可以自己定义。而面对普通表单,我们将会接收到的也是原始的表单内容,就像上面的 name=xxx&tel=xxx&.... 这样的内容。

    需要注意的是 enctype="multipart/form-data" 时它是无法获取到内容的。同时,这种方式也是代替 $HTTP_RAW_POST_DATA 全局变量的,不要再使用淘汰的能力了哦,尽早更新新版本的PHP使用新的语法特性哦!

    总结

    随便一整理就发现原来简简单单的一个接参就有这么多种形式和需要注意的地方,还真是大开眼界。依然是那句话,学无止尽,继续深入的钻研早晚你也会成为大牛!

    测试代码: github.com/zhangyue050…

    参考文档: www.php.net/manual/zh/l… www.php.net/manual/zh/f… www.php.net/manual/zh/f…


    起源地下载网 » 变着花样来接参,PHP中接收外部参数的方式

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元