この記事では、PHP で外部パラメーターを受け取るいくつかの方法を説明します。お役に立てば幸いです。
PHP のような Web 言語の場合、パラメーターを受け取ることは非常に重要な機能です。結局のところ、通常の対話型表示のためには、フロントエンド フォームまたは非同期リクエストから渡されたデータを取得する必要があります。もちろん、これは Web 開発が可能なすべての言語にとって不可欠な機能でもあります。今日は、PHP のさまざまなパラメーター アクセス フォームを見ていきます。
まず、次のような静的ページを準備する必要があります。このページでは、URL にフォームと GET パラメーターを提供します:
<!DOCTYPE html>
<html>
<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>
ログイン後にコピー
Normal ####################得る######、# ###### ##_得る、####################################### ####### 、#_POST メソッド// 正常的GET、POST
echo $_GET['show'], '<br/>'; // 1
echo $_POST['name'], '<br/>'; // 提交的内容
ログイン後にコピー
これは、最も基本的で最も直接的な受信方法です。パラメータは、GET パラメータが ##GE## を渡すことです。 #TGet、POSTパラメータは ## を通じて取得されます#_GET および POST パラメーターは、
POSTパラメータnumber通 #経由で取得_POST はお互いに干渉しません。 正常的$_REQUEST方式
// 使用REQUEST
echo $_REQUEST['show'], '<br/>'; // 1
echo $_REQUEST['tel'], '<br/>'; // 提交的内容
ログイン後にコピー
REQUEST则是获取所有请求中的参数,不包括上传文件。也就是说,它包含了_GET 、 POST以及_COOKIE(需要配置,默认不包含) 这三个接参变量中的所有内容。这里需要注意的一点是,PHP5.3以后, $_REQUEST 接受的参数变量内容由 php.ini 文件中的 request_order 指定,默认情况下这个配置参数的值是 GP 也就是 GET 和 POST ,并没有 COOKIE ,想要 COOKIE 的话需要修改这里添加一个C就可以了。
如果 GET、_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使用新的语法特性哦!
总结
随便一整理就发现原来简简单单的一个接参就有这么多种形式和需要注意的地方,还真是大开眼界。依然是那句话,学无止尽,继续深入的钻研早晚你也会成为大牛!
测试代码:
<?php
// 正常的GET、POST
echo $_GET['show'], '<br/>'; // 1
echo $_POST['name'], '<br/>'; // 提交的内容
// 使用REQUEST
echo $_REQUEST['show'], '<br/>'; // 1
echo $_REQUEST['tel'], '<br/>'; // 提交的内容
// // register_globals 如果打开
// echo $name, '<br/>'; // 提交的内容
// echo $tel, '<br/>'; // 提交的内容
// // import_request_variables 抱歉,5.4之后已经取消了
// import_request_variables('pg', 'pg_');
// echo $pg_show, '<br/>';
// echo $pg_name, '<br/>';
extract($_POST, EXTR_PREFIX_ALL, 'ex');
echo $ex_name, '<br/>'; // 提交的内容
echo $ex_tel, '<br/>'; // 提交的内容
// 参数名中的.和空格
echo $_REQUEST['address_prov'], '<br/>'; // 提交的内容
echo $_REQUEST['address_city'], '<br/>'; // 提交的内容
// 参数名中的[]
print_r($_REQUEST['interest']); // Array (v,....)
echo '<br />';
print_r($_REQUEST['edu']); // Array (k/v,....)
// php://input
$content = file_get_contents('php://input');
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 中国語 Web サイトの他の関連記事を参照してください。