摘要:結論把存入數據庫前必須做次處理中文處理包含中文的字符串時,會將中文字符轉換為的形式,而且通過是不能恢復的。處理特殊字符通過解決中文問題會帶來新問題,的特殊字符處理。
開發過程中經常碰到要把前端的json格式的數據傳遞到后端php,php做一些業務處理后把數據存到mysql,然后,php再從mysql中取出數據返回到前端。雖然這是一個再基礎不過的處理過程,但還是有不少問題需要認真研究。下面從幾個環節看看可能出現的各種問題。
存入mysql前假設前端傳入的數據是:
{"html":"a"b"}
json_decode后,PHP對象是:
object(stdClass)#3 (1) { ["html"]=> string(3) "a"b" }
注意要處理的數據中包含了雙引號,這個字符在json中需要轉意,在mysql中也需要轉意。假如要把這個對象轉換為json串存入mysql,先用json_encode處理:
{"html":"a"b"}
注意:雙引號前面加上了反斜杠。再用real_escape_string處理:
{"html":"a"b"}
注意:所有的雙引號和反斜杠(json_encode加上的那個)都加上了反斜杠。存入數據庫的內容:
{"html":"a"b"}
按照這樣的過程處理數據是正常的,從數據庫取出后,用json_decode可以恢復原來的數據。但是如果在存入數據庫前沒有做real_escape_string的處理,直接存入數據庫,那么數據庫的內容:
{"html":"a"b"}
注意:這時a和b之間的雙引號前面的反斜杠被mysql去掉了,數據庫中的內容已經不是合法的json串。
結論1:把json存入mysql數據庫前必須做1次real_escape_string
處理中文json_encode處理包含中文的字符串時,會將中文字符轉換為unicode的形式(uXXXX),而且通過json_decode是不能恢復的。例如處理前的對象是:
object(stdClass)#3 (1) { ["html"]=> string(6) "你好" }
json_encode后的json串是:
{"html":"u4f60u597d"}
real_escape_string處理后存入mysql數據庫:
{"html":"u4f60u597d"}
這樣帶來的問題是在mysql中就無法直接對這個串做處理,例如:
like "%你%"
解決這個問題的方法是,在進行json_encode前先對要處理的對象的值用urlencode處理一遍,json_encode后再用urldecode恢復回來,這樣的到json串是:
{"html":"你好"}
結論2:通過urlencode解決json_encode將中文字符編碼為unicode的形式。
處理特殊字符通過urlencode解決中文問題會帶來新問題,json的特殊字符處理。例如:雙引號會被編碼為“%22”,json_encode不會對%22特殊處理,【你"好】本應該編碼為【你"好】,對雙引號進行轉義,但是結果是【你"好】,已經不是一個合法的json字符串。
解決這個問題前首先要搞清楚json中有哪些特殊字符,看下圖:
來自:http://www.json.org/
解決這個問題的思路是在進行urlencode之前,先在這些特殊字符前加上反斜杠,這樣urldecode之后就有了轉義的反斜杠。
$str = str_replace(array("", """, " ", " ", " "), array("", """, " ", " ", " "), $str);
執行這個操作時要注意,必須先替換反斜杠,再替換其它特殊字符,否則,給特殊字符添加的反斜杠又會被再加上反斜杠。另一個問題注意要用雙引號,php中單引號的內容不會轉義,雙引號才會。
總結:通過上述3個方面的處理,應該可以正確的處理json的問題了。但是,也許應該直接寫一個拼接json串的方法,徹底不用json_encode,這樣效率更高些,以后有機會試試。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22125.html
摘要:結論把存入數據庫前必須做次處理中文處理包含中文的字符串時,會將中文字符轉換為的形式,而且通過是不能恢復的。處理特殊字符通過解決中文問題會帶來新問題,的特殊字符處理。 開發過程中經常碰到要把前端的json格式的數據傳遞到后端php,php做一些業務處理后把數據存到mysql,然后,php再從mysql中取出數據返回到前端。雖然這是一個再基礎不過的處理過程,但還是有不少問題需要認真研究。下...
摘要:的毫秒級超時也有問題。。中超時實現一初級最簡單的超時實現秒級超時思路很簡單鏈接一個后端,然后設置為非阻塞模式,如果沒有連接上就一直循環,判斷當前時間和超時時間之間的差異。實際處理這個調用的部件在完成后,通過狀態通知和回調來通知調用者。 概述 在PHP開發中工作里非常多使用到超時處理到超時的場合,我說幾個場景: 異步獲取數據如果某個后端數據源獲取不成功則跳過,不影響整個頁面展現 為了保...
摘要:后端知識點總結基礎不是是一種軟件開發平臺,它的競爭對象歷史第一次有一種語言可以通吃前后端網站阿里云鏡像版本年初年中年底最新版本功能強大可靠,適合大型企業級項目簡單易用適合互聯網項目易用適合平臺性能好適合服務器端密集型項目不適合密集型項目密集 后端知識點總結——NODE.JS基礎 1.Node.js Node.js不是JS,是一種軟件開發平臺,它的競爭對象JSP/PHP/ASP.NET...
摘要:日期和時間使用類完成讀取設置比較和計算日期與時間。單元測試單元測試是從編寫開始,貫穿于整個開發周期的一種用于保證函數類和方法的行為與預期一致的編程方法。是應用的單元測試框架的業界標準,其他幾個可選框架是行為驅動開發行為驅動開發有兩種方式和。 《php之道》閱讀地址:http://wulijun.github.io/php-the-right-way/#code_style_guide ...
摘要:注意事項以下版本要設置默認編碼,,否則程序可能無法正確顯示中文。組成部分協議是對請求和響應的報文內容進行了約束和規范。請求報文請求是由客戶端發起,其規范格式為請求行請求頭請求主體。 showImg(https://segmentfault.com/img/remote/1460000013696283?w=1920&h=1080); Ajax 前言 前面我們已經學習了js基礎知識和一些...
閱讀 2452·2021-11-22 09:34
閱讀 3063·2021-10-25 09:43
閱讀 1975·2021-10-11 10:59
閱讀 3361·2021-09-22 15:13
閱讀 2323·2021-09-04 16:40
閱讀 418·2019-08-30 15:53
閱讀 3186·2019-08-30 11:13
閱讀 2602·2019-08-29 17:30