這篇文章主要介紹“PHP中GET方法參數(shù)傳遞空格+逗號(hào)等特殊字符如何處理”,在日常操作中,相信很多人在PHP中GET方法參數(shù)傳遞空格+逗號(hào)等特殊字符如何處理問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”PHP中GET方法參數(shù)傳遞空格+逗號(hào)等特殊字符如何處理”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
成都創(chuàng)新互聯(lián)公司一直秉承“誠(chéng)信做人,踏實(shí)做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務(wù)為基礎(chǔ),以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個(gè)客戶多一個(gè)朋友!為您提供成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、成都網(wǎng)頁(yè)設(shè)計(jì)、微信小程序開發(fā)、成都網(wǎng)站開發(fā)、成都網(wǎng)站制作、成都軟件開發(fā)、重慶APP開發(fā)公司是成都本地專業(yè)的網(wǎng)站建設(shè)和網(wǎng)站設(shè)計(jì)公司,等你一起來(lái)見證!
自己在項(xiàng)目開發(fā)中寫了個(gè)自用接口,用GET方法傳參(用戶名和密碼)。最近收到用戶反饋:密碼為特殊字符時(shí)會(huì)出錯(cuò)。我一開始想是不是php的MySQL_real_escape_string函數(shù)將特殊字符轉(zhuǎn)義了,但用戶說(shuō)自己密碼只有“+”號(hào)這個(gè)特殊字符,而“+”號(hào)不屬于該函數(shù)轉(zhuǎn)義的范圍之內(nèi)。
為了弄明白這個(gè)問(wèn)題我就在本地測(cè)試了一下,果然發(fā)現(xiàn)有bug。
測(cè)試代碼:
index.php
<?php
echo $_GET['a']."<br />";
echo $_GET['b']."<br />";
echo urldecode($_GET['a'])."<br />";
?>
測(cè)試的url為http://localhost/test/?a=123!@#&b=123結(jié)果報(bào)錯(cuò)了:
#號(hào)后面的參數(shù)被屏蔽了
可以看出“#”號(hào)后面的參數(shù)被屏蔽了,這很正常,因?yàn)椤?”號(hào)后面的數(shù)據(jù)不會(huì)發(fā)送到HTTP請(qǐng)求中。
當(dāng)url為http://localhost/test/?a=123!@+1&b=123輸出為:
運(yùn)行結(jié)果
123!@ 1
123
123!@ 1
可以看出“+”號(hào)變成了空格。google了一下找到個(gè)解決方案,就是發(fā)送數(shù)據(jù)前先urlencode一下,然后后臺(tái)再解碼。基于這個(gè)思路我又試了一下,這次的url為:http://localhost/test/?a=123!%40%23%26%2b&b=123,輸出為:
123!@#&+
123
123!@#&
這里就有問(wèn)題了,按理說(shuō)urldecode后輸出的才是正確的,網(wǎng)上提供的方法都是這樣寫的。但事實(shí)卻不是這樣,應(yīng)該是GET方法獲取值之后會(huì)自動(dòng)urldecode,自己再urldecode就畫蛇添足了(“+”號(hào)比較特殊,urldecode之后會(huì)變成空格)。所以我們使用GET方法時(shí)只需要將參數(shù)urlencode一次就行了,簡(jiǎn)單處理一下就可解決問(wèn)題,也不會(huì)遇到“+”號(hào)的bug。
使用POST方法就不會(huì)出現(xiàn)這些問(wèn)題,因?yàn)镻OST方法會(huì)對(duì)數(shù)據(jù)進(jìn)行編碼,其中就包括urlcode。但也不是完全不會(huì)出現(xiàn)這些問(wèn)題,在使用curl模擬POST方法時(shí)還是會(huì)出現(xiàn)這種問(wèn)題。
測(cè)試代碼:
index.php
<?php
echo $_POST['a']."<br />";
echo $_POST['b']."<br />";
echo urldecode($_POST['a'])."<br />";
?>
curl.php
<?php
$a = "123!+@#&";
$post_data = "a=$a&b=123"; //POST值
// 1. 初始化
$ch = curl_init();
// 2. 設(shè)置選項(xiàng)
curl_setopt($ch, CURLOPT_URL, "http://localhost/test/index.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
// 3. 執(zhí)行并獲取HTML文檔內(nèi)容
$text = curl_exec($ch);
// 4. 釋放curl句柄
curl_close($ch);
echo $text;
?>
運(yùn)行curl.php的結(jié)果:
123! @#
123
123! @#
可以很清楚的看見,雖然沒有像GET方法那樣“#”號(hào)后面的數(shù)據(jù)都被忽略了。但獲得的數(shù)據(jù)還是不正確,這是因?yàn)閏url中POST的值也是像GET方法一樣書寫(參數(shù)字符串)。其實(shí)POST的值也可以寫成數(shù)組的形式,但那是在提交文件流的時(shí)候使用(Content-Type頭將會(huì)被設(shè)置成multipart/form-data),這里(提交數(shù)據(jù))使用數(shù)組的話會(huì)出錯(cuò)。參照GET方法中的解決方案,urlencode一下參數(shù)值就行了。
curl.php
<?php
$a = "123!+@#&";
$a = urlencode($a); // url編碼,處理特殊字符
$post_data = "a=$a&b=123"; //POST值
// 1. 初始化
$ch = curl_init();
// 2. 設(shè)置選項(xiàng)
curl_setopt($ch, CURLOPT_URL, "http://localhost/test/index.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
// 3. 執(zhí)行并獲取HTML文檔內(nèi)容
$text = curl_exec($ch);
// 4. 釋放curl句柄
curl_close($ch);
echo $text;
?>
輸出:
123!+@#&
123
123! @#&
當(dāng)然,服務(wù)端也不用urldecode。
有時(shí)網(wǎng)上的那些解決方案并不是都正確,幾乎都是復(fù)制來(lái)復(fù)制去的,完全沒有考究,自己在實(shí)踐過(guò)程中要注意辨別。
符一個(gè)流傳很廣的解決方案:
1 、改用POST方法,ok。
2 、在js里用url = encodeURI(encodeURI(XXX)),后臺(tái)再解碼一次ok。
3 、將參數(shù)里的加號(hào)進(jìn)行轉(zhuǎn)換data = data.replace(/\+/g, “%2B”);
特別是第二種方案,編碼兩次,解碼一次,太腦殘了。完全就是為了解決問(wèn)題而解決問(wèn)題。
到此,關(guān)于“PHP中GET方法參數(shù)傳遞空格+逗號(hào)等特殊字符如何處理”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
文章名稱:PHP中GET方法參數(shù)傳遞空格+逗號(hào)等特殊字符如何處理
本文地址:http://www.rwnh.cn/article16/peoigg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、標(biāo)簽優(yōu)化、定制開發(fā)、營(yíng)銷型網(wǎng)站建設(shè)、全網(wǎng)營(yíng)銷推廣、App設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)