中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP中GET方法參數傳遞空格+逗號等特殊字符如何處理

發布時間:2021-07-07 15:58:14 來源:億速云 閱讀:201 作者:chen 欄目:大數據

這篇文章主要介紹“PHP中GET方法參數傳遞空格+逗號等特殊字符如何處理”,在日常操作中,相信很多人在PHP中GET方法參數傳遞空格+逗號等特殊字符如何處理問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”PHP中GET方法參數傳遞空格+逗號等特殊字符如何處理”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

自己在項目開發中寫了個自用接口,用GET方法傳參(用戶名和密碼)。最近收到用戶反饋:密碼為特殊字符時會出錯。我一開始想是不是php的mysql_real_escape_string函數將特殊字符轉義了,但用戶說自己密碼只有“+”號這個特殊字符,而“+”號不屬于該函數轉義的范圍之內。

為了弄明白這個問題我就在本地測試了一下,果然發現有bug。

測試代碼:
index.php
<?php
echo $_GET['a']."<br />";
echo $_GET['b']."<br />";
echo urldecode($_GET['a'])."<br />";
?>

測試的url為http://localhost/test/?a=123!@#&b=123結果報錯了:

#號后面的參數被屏蔽了

可以看出“#”號后面的參數被屏蔽了,這很正常,因為“#”號后面的數據不會發送到HTTP請求中。

當url為http://localhost/test/?a=123!@+1&b=123輸出為:
運行結果

123!@ 1
123
123!@ 1

可以看出“+”號變成了空格。google了一下找到個解決方案,就是發送數據前先urlencode一下,然后后臺再解碼。基于這個思路我又試了一下,這次的url為:http://localhost/test/?a=123!%40%23%26%2b&b=123,輸出為:

123!@#&+
123
123!@#&

這里就有問題了,按理說urldecode后輸出的才是正確的,網上提供的方法都是這樣寫的。但事實卻不是這樣,應該是GET方法獲取值之后會自動urldecode,自己再urldecode就畫蛇添足了(“+”號比較特殊,urldecode之后會變成空格)。所以我們使用GET方法時只需要將參數urlencode一次就行了,簡單處理一下就可解決問題,也不會遇到“+”號的bug。

使用POST方法就不會出現這些問題,因為POST方法會對數據進行編碼,其中就包括urlcode。但也不是完全不會出現這些問題,在使用curl模擬POST方法時還是會出現這種問題。

測試代碼:
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. 設置選項
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. 執行并獲取HTML文檔內容
$text = curl_exec($ch);
// 4. 釋放curl句柄
curl_close($ch);

echo $text;
?>

運行curl.php的結果:

123! @#
123
123! @#

可以很清楚的看見,雖然沒有像GET方法那樣“#”號后面的數據都被忽略了。但獲得的數據還是不正確,這是因為curl中POST的值也是像GET方法一樣書寫(參數字符串)。其實POST的值也可以寫成數組的形式,但那是在提交文件流的時候使用(Content-Type頭將會被設置成multipart/form-data),這里(提交數據)使用數組的話會出錯。參照GET方法中的解決方案,urlencode一下參數值就行了。
curl.php

<?php
$a = "123!+@#&";
$a = urlencode($a);    // url編碼,處理特殊字符
$post_data = "a=$a&b=123";    //POST值

// 1. 初始化
$ch = curl_init();
// 2. 設置選項
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. 執行并獲取HTML文檔內容
$text = curl_exec($ch);
// 4. 釋放curl句柄
curl_close($ch);

echo $text;
?>

輸出:

123!+@#&
123
123! @#&

當然,服務端也不用urldecode。

有時網上的那些解決方案并不是都正確,幾乎都是復制來復制去的,完全沒有考究,自己在實踐過程中要注意辨別。

符一個流傳很廣的解決方案:

1 、改用POST方法,ok。

2 、在js里用url = encodeURI(encodeURI(XXX)),后臺再解碼一次ok。

3 、將參數里的加號進行轉換data = data.replace(/\+/g, “%2B”);

特別是第二種方案,編碼兩次,解碼一次,太腦殘了。完全就是為了解決問題而解決問題。

到此,關于“PHP中GET方法參數傳遞空格+逗號等特殊字符如何處理”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

濉溪县| 任丘市| 循化| 宁南县| 宁安市| 昌乐县| 文登市| 勃利县| 同心县| 新龙县| 郯城县| 巴彦淖尔市| 呼伦贝尔市| 霍山县| 辽宁省| 会理县| 松原市| 临高县| 定远县| 余庆县| 镇赉县| 许昌县| 平凉市| 肃南| 临清市| 昂仁县| 汽车| 崇文区| 鄂托克旗| 兴宁市| 正阳县| 泸溪县| 巴南区| 石泉县| 宣恩县| 马边| 萨嘎县| 沙洋县| 齐齐哈尔市| 桓台县| 黄山市|