>백엔드 개발 >PHP 튜토리얼 >PHP의 다양한 매개변수 액세스 형식에 대한 심층 분석

PHP의 다양한 매개변수 액세스 형식에 대한 심층 분석

青灯夜游
青灯夜游앞으로
2021-10-11 18:36:202766검색

이 기사는 PHP에서 외부 매개변수를 수신하는 여러 가지 방법을 안내합니다. 도움이 되기를 바랍니다.

PHP의 다양한 매개변수 액세스 형식에 대한 심층 분석

PHP와 같은 웹 언어에서는 매개변수를 받는 것이 매우 중요한 능력입니다. 결국 일반적인 대화형 디스플레이를 위해서는 프런트 엔드 양식이나 비동기 요청에서 전달된 데이터를 가져와야 합니다. 물론, 이는 웹 개발이 가능한 모든 언어에 있어서 필수적인 기능이기도 합니다. 오늘은 PHP의 다양한 매개변수 접근 형식을 살펴보겠습니다.

먼저 URL에 양식과 GET 매개변수를 제공하는 아래와 같은 정적 페이지를 준비해야 합니다. T

, _GET, G _GET을 통해 획득되고, POST 매개변수는

을 통해 획득됩니다. G ETGetGet

正常的$_REQUEST方式

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

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

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

register_globals问题

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

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

import_request_variables

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

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

extract

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

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

参数名中的.和空格

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

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

参数名中的[]

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

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

高大上的php://input

    // php://input
    $content = file_get_contents(&#39;php://input&#39;);   
    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使用新的语法特性哦!

总结

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

测试代码:

<?php    
// 正常的GET、POST    
echo $_GET[&#39;show&#39;], &#39;<br/>&#39;; // 1    
echo $_POST[&#39;name&#39;], &#39;<br/>&#39;; // 提交的内容    
// 使用REQUEST    
echo $_REQUEST[&#39;show&#39;], &#39;<br/>&#39;; // 1    
echo $_REQUEST[&#39;tel&#39;], &#39;<br/>&#39;; // 提交的内容    
// // register_globals 如果打开    
// echo $name, &#39;<br/>&#39;; // 提交的内容    
// echo $tel, &#39;<br/>&#39;; // 提交的内容    
// // import_request_variables 抱歉,5.4之后已经取消了    
// import_request_variables(&#39;pg&#39;, &#39;pg_&#39;);    
// echo $pg_show, &#39;<br/>&#39;;    
// echo $pg_name, &#39;<br/>&#39;;    
extract($_POST, EXTR_PREFIX_ALL, &#39;ex&#39;);    
echo $ex_name, &#39;<br/>&#39;; // 提交的内容    
echo $ex_tel, &#39;<br/>&#39;; // 提交的内容    
// 参数名中的.和空格    
echo $_REQUEST[&#39;address_prov&#39;], &#39;<br/>&#39;; // 提交的内容    
echo $_REQUEST[&#39;address_city&#39;], &#39;<br/>&#39;; // 提交的内容    
// 参数名中的[]    
print_r($_REQUEST[&#39;interest&#39;]); // Array (v,....)     
echo &#39;<br />&#39;;    
print_r($_REQUEST[&#39;edu&#39;]); // Array (k/v,....)     
// php://input    
$content = file_get_contents(&#39;php://input&#39;);    
print_r($content); //name=xxx&.....    
?>    
<!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>

推荐学习:《PHP视频教程

위 내용은 PHP의 다양한 매개변수 액세스 형식에 대한 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제