對于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="https://www.cnblogs.com/zyblog-coder/p/提交" >
</form>
</body>
</html>
正常的$_GET、$_POST方式
// 正常的GET、POST
echo $_GET['show'], '<br/>'; // 1
echo $_POST['name'], '<br/>'; // 提交的內容
這是最基礎的也是最直接的接參方式,GET引數通過 $_GET 獲取,POST引數通過 $_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使用新的語法特性哦!
總結
隨便一整理就發現原來簡簡單單的一個接參就有這么多種形式和需要注意的地方,還真是大開眼界,依然是那句話,學無止盡,繼續深入的鉆研早晚你也會成為大牛!
測驗代碼:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202002/source/%E5%8F%98%E7%9D%80%E8%8A%B1%E6%A0%B7%E6%9D%A5%E6%8E%A5%E5%8F%82%EF%BC%8CPHP%E4%B8%AD%E6%8E%A5%E6%94%B6%E5%A4%96%E9%83%A8%E5%8F%82%E6%95%B0%E7%9A%84%E6%96%B9%E5%BC%8F.php
參考檔案:
https://www.php.net/manual/zh/language.variables.external.php
https://www.php.net/manual/zh/function.import-request-variables.php
https://www.php.net/manual/zh/function.extract.php
關注公眾號:【硬核專案經理】獲取最新文章
添加微信/QQ好友:【xiaoyuezigonggong/149844827】免費得PHP、專案管理學習資料
知乎、公眾號、抖音、頭條搜索【硬核專案經理】
B站ID:482780532
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/270614.html
標籤:PHP
上一篇:15-插入排序:折半插入排序
下一篇:php小結
